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:
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
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
Làm theo cách này:
gmdate('Y-m-d H:i:s', $timestamp)
hoặc đơn giản
gmdate('Y-m-d H:i:s')
để nhận "NGAY BÂY GIỜ" theo giờ UTC.
Kiểm tra tài liệu tham khảo:
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ó .... :)
:D
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);
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:
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'));
Nếu bạn cần bản gốc $givenDt
sau 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'));
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ó $givenStr
nằm trong múi giờ đã định cấu hình của PHP.
$utcDt = (new DateTime($givenStr))->setTimezone(new DateTimeZone('UTC'));
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'));
Vì 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);
Đô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.
http://php.net/manual/en/ Chức năng.strtotime.php hoặc nếu bạn không cần sử dụng chuỗi mà thay vào đó là các thành phần thời gian, thì hãy truy cập http://us.php.net/manual/en/ Chức năng.mktime. php
Với PHP 5 trở lên, bạn có thể sử dụng hàm datetime :: format (xem tài liệu http://us.php.net/manual/en/datetime.format.php )
echo strftime( '%e %B %Y' ,
date_create_from_format('Y-d-m G:i:s', '2012-04-05 11:55:21')->format('U')
); // 4 May 2012
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"
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.
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):
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;
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)
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";
?>
gmdate
thay vì thay đổi múi giờ mặc định thành UTC. Vìgmdate
tự động sử dụng UTC.