PHP将datetime转换为UTC
我需要一个简单的方法来将date时间戳转换为UTC(无论服务器在什么时区)HOPEFULLY没有使用任何库。
试试getTimezone和setTimezone ,看例子
(但是这确实使用一个类)
更新:
没有任何课程,你可以尝试这样的事情:
$the_date = strtotime("2010-01-19 00:00:00"); echo(date_default_timezone_get() . "<br />"); echo(date("Yd-mTG:i:sz",$the_date) . "<br />"); echo(date_default_timezone_set("UTC") . "<br />"); echo(date("Yd-mTG:i:sz", $the_date) . "<br />");
注意:您可能还需要将时区设置回原始
使用strtotime从给定string(解释为本地时间)生成时间戳,并使用gmdate将其作为格式化的UTCdate返回。
例
按照要求,这里有一个简单的例子:
echo gmdate('dmY H:i', strtotime('2012-06-28 23:55'));
使用DateTime:
$given = new DateTime("2014-12-12 14:18:00"); echo $given->format("Ymd H:i:se") . "\n"; // 2014-12-12 14:18:00 Asia/Bangkok $given->setTimezone(new DateTimeZone("UTC")); echo $given->format("Ymd H:i:se") . "\n"; // 2014-12-12 07:18:00 UTC
这样做:
gmdate('Ymd H:i:s', $timestamp)
或干脆
gmdate('Ymd H:i:s')
以UTC获得“NOW”。
检查参考:
如果您的date格式为YYYY-MM-HH dd:mm:ss,则可以通过在“datetimestring”末尾添加UTC来欺骗php,然后使用strtotime将其转换。
date_default_timezone_set('Europe/Stockholm'); print date('Ymd H:i:s',strtotime("2009-01-01 12:00"." UTC"))."\n"; print date('Ymd H:i:s',strtotime("2009-06-01 12:00"." UTC"))."\n";
这将打印这个:
2009-01-01 13:00:00 2009-06-01 14:00:00
而且正如您所看到的那样,还需要考虑夏令时问题。
有点奇怪的方式来解决它…. 🙂
因为strtotime需要特定的input格式, 所以可以使用DateTime :: createFromFormat ( 需要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('Ymd 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);
我有时使用这种方法:
// 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("Ymd H:i:s", strtotime($original_time." -".$offset." Seconds"));
大部分时间都在使用。
使用PHP 5或更高版本,您可以使用datetime :: format函数(请参阅文档http://us.php.net/manual/en/datetime.format.php )
echo strftime( '%e %B %Y' , date_create_from_format('Ydm G:i:s', '2012-04-05 11:55:21')->format('U') ); // 4 May 2012
将本地时区string转换为UTCstring。
如新西兰时区
$datetime = "2016-02-01 00:00:01"; $given = new DateTime($datetime, new DateTimeZone("Pacific/Auckland")); $given->setTimezone(new DateTimeZone("UTC")); $output = $given->format("Ymd H:i:s"); echo ($output);
- NZDT:UTC + 13:00
如果$ datetime =“2016-02-01 00:00:01”,$ output =“2016-01-31 11:00:01”;
如果$ datetime =“2016-02-29 23:59:59”,$ output =“2016-02-29 10:59:59”; - NZST:UTC + 12:00
如果$ datetime =“2016-05-01 00:00:01”,$ output =“2016-04-30 12:00:01”;
如果$ datetime =“2016-05-31 23:59:59”,$ output =“2016-05-31 11:59:59”;
作为Phill Pafford的回答 (我不明白他的'YD-mTG:i:sz',他build议恢复时区)的改进。 所以我提出这个(我通过改变普通/文本HMTL格式复杂…):
<?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("Ymd\TH:i:s\Z", $my_timestamp)."\t\t (ISO8601 UTC date)\n"; echo date("Ymd 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"; ?>
尝试
echo date('F d Y',strtotime('2010-01-19 00:00:00'));
会输出:
2010年1月19日
您应该更改格式时间以查看其他输出
通用规范化函数将任何时区的任何时间戳格式化为其他时区。 从关系数据库的不同时区存储用户的date时间戳非常有用。 对于数据库比较,将时间戳存储为UTC,并与gmdate('Ymd 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'] != 'Ymd H:i:s') { $datetime = DateTime::createFromFormat($from['localeFormat'], $datetime)->format('Ymd 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; } }
用法:
$from = ['localeFormat' => "d/m/YH:i A", 'olsonZone' => 'Asia/Calcutta']; $to = ['localeFormat' => "Ymd H:i:s", 'olsonZone' => 'UTC']; datetimeconv("14/05/1986 10:45 PM", $from, $to); // returns "1986-05-14 17:15:00"
或者你可以试试这个:
<?php echo (new DateTime("now", new DateTimeZone('Asia/Singapore')))->format("Ymd H:i:se"); ?>
这将输出:
2017-10-25 17:13:20亚洲/新加坡
如果您只想显示只读date,则可以在文本input框的值属性中使用该属性。
如果您不想显示您的地区/国家,请删除“e”。