php chuyển đổi datetime sang UTC


90

Tôi đang cần một cách dễ dàng để chuyển đổi dấu ngày tháng sang UTC (từ bất kỳ múi giờ nào của máy chủ) HOÀN TOÀN KHÔNG cần sử dụng bất kỳ thư viện nào.

Câu trả lời:


30

Hãy thử getTimezone và setTimezone , xem ví dụ

(Nhưng điều này không sử dụng một Lớp)

CẬP NHẬT:

Nếu không có bất kỳ lớp học nào, bạn có thể thử một cái gì đó như thế này:

$the_date = strtotime("2010-01-19 00:00:00");
echo(date_default_timezone_get() . "<br />");
echo(date("Y-d-mTG:i:sz",$the_date) . "<br />");
echo(date_default_timezone_set("UTC") . "<br />");
echo(date("Y-d-mTG:i:sz", $the_date) . "<br />");

LƯU Ý: Bạn cũng có thể cần đặt múi giờ trở lại ban đầu


55
Bạn chỉ nên sử dụng gmdatethay vì thay đổi múi giờ mặc định thành UTC. Vì gmdatetự động sử dụng UTC.
poke

29
-1 vì bạn không muốn thay đổi múi giờ mặc định chung cho việc này. Nó chỉ yêu cầu các tác dụng phụ ngoài ý muốn.
Ward Bekker

@Phill 'sz' ở đây là gì?
Shahid Karimi

2
Tôi nghĩ rằng nó cần được "Ym-DTG ..." thay vì "yd-MTG ..."
Alex Angelico

Nó không hoạt động cho tôi trong dự án laravel. Nó trả lại cùng một ngày
Dharmender Tuli

109

Sử dụng strtotime để tạo dấu thời gian từ chuỗi đã cho (được hiểu là giờ địa phương) và sử dụng gmdate để lấy nó làm ngày UTC được định dạng trở lại.

Thí dụ

Theo yêu cầu, đây là một ví dụ đơn giản:

echo gmdate('d.m.Y H:i', strtotime('2012-06-28 23:55'));

7
Một ví dụ nhỏ có thể?
cherouvim

2
@cherouvim Đừng nghĩ rằng nó cần thiết, nhưng dù sao cũng đã thêm một cái… Hy vọng nó sẽ hữu ích.
poke

5
gmdate () là một trong những hàm PHP mà tôi ước gì mình đã gặp phải cách đây rất lâu. nl2br, có ai không?
Charlie Schliesser

1
GMT và UTC không phải lúc nào cũng giống nhau.
Jay Sheth

1
@poke giờ GMT khía cạnh ánh sáng ban ngày tiết kiệm thời gian, tính theo giờ UTC không và đó là lý do nó được sử dụng, do đó bạn không cần phải yếu tố bất cứ điều gì khác trong
Necro

72

Sử dụng DateTime:

$given = new DateTime("2014-12-12 14:18:00");
echo $given->format("Y-m-d H:i:s e") . "\n"; // 2014-12-12 14:18:00 Asia/Bangkok

$given->setTimezone(new DateTimeZone("UTC"));
echo $given->format("Y-m-d H:i:s e") . "\n"; // 2014-12-12 07:18:00 UTC

Câu hỏi cho biết chuyển đổi dấu thời gian thành dấu thời gian và DateTime không chấp nhận dấu thời gian làm đầu vào. Bạn sẽ phải chuyển đổi nó thành một chuỗi bằng cách nào đó sau đó chuyển đổi nó trở lại.
felwithe


14

Nếu bạn có một ngày ở định dạng này là YYYY-MM-HH dd: mm: ss, bạn thực sự có thể đánh lừa php bằng cách thêm UTC vào cuối "chuỗi ngày giờ" và sử dụng strtotime để chuyển đổi nó.

date_default_timezone_set('Europe/Stockholm');
print date('Y-m-d H:i:s',strtotime("2009-01-01 12:00"." UTC"))."\n";
print date('Y-m-d H:i:s',strtotime("2009-06-01 12:00"." UTC"))."\n";

Điều này sẽ in ra:

2009-01-01 13:00:00
2009-06-01 14:00:00

Và như bạn có thể thấy, nó cũng quan tâm đến vấn đề thời gian tiết kiệm ánh sáng ban ngày.

Một cách hơi lạ để giải quyết nó .... :)


Tôi thực sự không hiểu tại sao OP đã không nhận đề nghị của bạn:D
php_nub_qq

@php_nub_qq có thể vì nó hoạt động bằng cách thay đổi múi giờ cho toàn bộ tập lệnh, điều này có thể không được mong muốn và có thể gây ra hậu quả không mong muốn.
felwithe

@felwithe Sẽ không xảy ra nếu bạn bỏ qua dòng đầu tiên, chỉ là để trình diễn
php_nub_qq

11

Chuyển đổi chuỗi múi giờ địa phương thành chuỗi UTC.
ví dụ: Múi giờ New Zealand

$datetime = "2016-02-01 00:00:01";
$given = new DateTime($datetime, new DateTimeZone("Pacific/Auckland"));
$given->setTimezone(new DateTimeZone("UTC"));
$output = $given->format("Y-m-d H:i:s"); 
echo ($output);
  • NZDT: UTC + 13: 00
    nếu $ datetime = "2016-02-01 00:00:01", $ output = "2016-01-31 11:00:01";
    nếu $ datetime = "2016-02-29 23:59:59", $ output = "2016-02-29 10:59:59";
  • NZST: UTC + 12: 00
    nếu $ datetime = "2016-05-01 00:00:01", $ output = "2016-04-30 12:00:01";
    nếu $ datetime = "2016-05-31 23:59:59", $ output = "2016-05-31 11:59:59";

https://en.wikipedia.org/wiki/Time_in_New_Zealand


5

Nếu bạn không phiền khi sử dụng lớp DateTime của PHP , đã có từ phiên bản PHP 5.2.0, thì có một số trường hợp có thể phù hợp với tình huống của bạn:

  1. Nếu bạn có một $givenDtđối tượng DateTime mà bạn muốn chuyển đổi sang UTC thì điều này sẽ chuyển đổi nó thành UTC:

    $givenDt->setTimezone(new DateTimeZone('UTC'));
    
  2. Nếu bạn cần bản gốc $givenDtsau này, bạn có thể muốn sao chép đối tượng DateTime đã cho trước khi chuyển đổi đối tượng được nhân bản:

    $utcDt = clone $givenDt;
    $utcDt->setTimezone(new DateTimeZone('UTC'));
    
  3. Nếu bạn chỉ có một chuỗi ngày giờ, chẳng hạn $givenStr = '2018-12-17 10:47:12', thì trước tiên bạn tạo một đối tượng ngày giờ, rồi chuyển đổi nó. Lưu ý rằng điều này giả định rằng nó $givenStrnằm trong múi giờ đã định cấu hình của PHP.

    $utcDt = (new DateTime($givenStr))->setTimezone(new DateTimeZone('UTC'));
    
  4. Nếu chuỗi ngày giờ đã cho ở một số múi giờ khác với múi giờ trong cấu hình PHP của bạn, thì hãy tạo đối tượng ngày giờ bằng cách cung cấp múi giờ chính xác (xem danh sách múi giờ mà PHP hỗ trợ ). Trong ví dụ này, chúng tôi giả định múi giờ địa phương ở Amsterdam:

    $givenDt = new DateTime($givenStr, new DateTimeZone('Europe/Amsterdam'));
    $givenDt->setTimezone(new DateTimeZone('UTC'));
    

4

strtotime yêu cầu định dạng đầu vào cụ thể, nên có thể sử dụng DateTime :: createFromFormat ( bắt buộc phải có php 5.3+ )

// set timezone to user timezone
date_default_timezone_set($str_user_timezone);

// create date object using any given format
$date = DateTime::createFromFormat($str_user_dateformat, $str_user_datetime);

// convert given datetime to safe format for strtotime
$str_user_datetime = $date->format('Y-m-d H:i:s');

// convert to UTC
$str_UTC_datetime = gmdate($str_server_dateformat, strtotime($str_user_datetime));

// return timezone to server default
date_default_timezone_set($str_server_timezone);

4

Đôi khi tôi sử dụng phương pháp này:

// It is not importnat what timezone your system is set to.
// Get the UTC offset in seconds:
$offset = date("Z");

// Then subtract if from your original timestamp:
$utc_time = date("Y-m-d H:i:s", strtotime($original_time." -".$offset." Seconds"));

Làm việc tất cả MOST thời gian.


3
Hai vấn đề ở đây. Đầu tiên, bạn không nên trừ, bạn nên thêm phần bù vào. Thứ hai, điều này không hoạt động nếu múi giờ địa phương hiện là DST và ngày mong muốn không phải là DST. Sự bù đắp sẽ tắt sau một giờ. Hoặc ngược lại. Vì vậy, có, điều này hiệu quả NHẤT mọi lúc, nhưng không phải lúc nào cũng vậy.
ajon



0

thử

echo date ('F d Y', strtotime ('2010-01-19 00:00:00'));

sẽ xuất:

Ngày 19 tháng 1 năm 2010

bạn nên thay đổi thời gian định dạng để xem đầu ra khác


0

Chức năng chuẩn hóa mục đích chung để định dạng bất kỳ dấu thời gian nào từ bất kỳ múi giờ nào sang múi giờ khác. Rất hữu ích để lưu trữ dấu ngày tháng của người dùng từ các múi giờ khác nhau trong cơ sở dữ liệu quan hệ. Để so sánh cơ sở dữ liệu, hãy lưu trữ dấu thời gian dưới dạng UTC và sử dụng vớigmdate('Y-m-d H:i:s')

/**
 * Convert Datetime from any given olsonzone to other.
 * @return datetime in user specified format
 */

function datetimeconv($datetime, $from, $to)
{
    try {
        if ($from['localeFormat'] != 'Y-m-d H:i:s') {
            $datetime = DateTime::createFromFormat($from['localeFormat'], $datetime)->format('Y-m-d H:i:s');
        }
        $datetime = new DateTime($datetime, new DateTimeZone($from['olsonZone']));
        $datetime->setTimeZone(new DateTimeZone($to['olsonZone']));
        return $datetime->format($to['localeFormat']);
    } catch (\Exception $e) {
        return null;
    }
}

Sử dụng:

$from = ['localeFormat' => "d/m/Y H:i A", 'olsonZone' => 'Asia/Calcutta'];

$to = ['localeFormat' => "Y-m-d H:i:s", 'olsonZone' => 'UTC'];

datetimeconv("14/05/1986 10:45 PM", $from, $to); // returns "1986-05-14 17:15:00"

0

hoặc bạn có thể thử cách này:

<?php echo (new DateTime("now", new DateTimeZone('Asia/Singapore')))->format("Y-m-d H:i:s e"); ?>

điều này sẽ xuất ra:

2017-10-25 17:13:20 Châu Á / Singapore

bạn có thể sử dụng điều này bên trong thuộc tính giá trị của hộp nhập văn bản nếu bạn chỉ muốn hiển thị ngày chỉ đọc.

bỏ 'e' nếu bạn không muốn hiển thị khu vực / quốc gia của mình.


0

Làm theo các bước sau để lấy giờ UTC của bất kỳ múi giờ nào được đặt trong hệ thống cục bộ của người dùng (Điều này sẽ được yêu cầu đối với các ứng dụng web để lưu các múi giờ khác nhau thành UTC):

  1. Javascript (phía máy khách):

    var dateVar = new Date();
    var offset = dateVar.getTimezoneOffset();
    //getTimezoneOffset - returns the timezone difference between UTC and Local Time
    document.cookie = "offset="+offset;
    
  2. Php (phía máy chủ):

    public function convert_utc_time($date)
    {
        $time_difference = isset($_COOKIE['offset'])?$_COOKIE['offset']:'';
        if($time_difference != ''){
            $time = strtotime($date);
            $time = $time + ($time_difference*60); //minutes * 60 seconds
            $date = date("Y-m-d H:i:s", $time);
        } //on failure of js, default timezone is set as UTC below
        return $date;
    }
    ..
    ..
    //in my function
    $timezone = 'UTC';
    $date = $this->convert_utc_time($post_date); //$post_date('Y-m-d H:i:s')
    echo strtotime($date. ' '. $timezone)
    

-1

Như một sự cải thiện cho câu trả lời của Phill Pafford (Tôi không hiểu 'Yd-mTG: i: sz' của anh ấy và anh ấy đã đề nghị hoàn nguyên múi giờ). Vì vậy, tôi đề xuất điều này (tôi phức tạp bằng cách thay đổi định dạng HMTL ở dạng thuần túy / văn bản ...):

<?php
header('content-type: text/plain;');
$my_timestamp = strtotime("2010-01-19 00:00:00");

// stores timezone
$my_timezone = date_default_timezone_get();
echo date(DATE_ATOM, $my_timestamp)."\t ($my_timezone date)\n";

// changes timezone
date_default_timezone_set("UTC");
echo date("Y-m-d\TH:i:s\Z", $my_timestamp)."\t\t (ISO8601 UTC date)\n";
echo date("Y-m-d H:i:s", $my_timestamp)."\t\t (your UTC date)\n";

// reverts change
date_default_timezone_set($my_timezone);
echo date(DATE_ATOM, $my_timestamp)."\t ($my_timezone date is back)\n"; 
?>

2
Bạn nên chỉnh sửa câu trả lời của mình để giải thích cách cải thiện câu trả lời của Phil. Bạn đã thay đổi điều gì trong mã, và tại sao nó tốt hơn?
Cody Grey

Thay đổi múi giờ mặc định của PHP để chuyển đổi hai dấu thời gian là một thủ thuật có hiệu quả, nhưng không phải là một giải pháp thanh lịch.
Coprolal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.