我在UTC中的日期时间字段中将日期存储在MySQL数据库中.我正在使用PHP,并且我调用了date_timezone_set(‘UTC’),以便所有对date()的调用(没有时间戳)以UTC格式返回日期.
然后,我有它,所以给定的网站可以选择其时区.现在我希望日期显示在网站的时区.因此,如果我将日期存储为“2009-04-01 15:36:13”,则应在PDT时区(-7小时)内为用户显示为“2009-04-01 08:36:13” .
通过PHP执行此操作的最简单(最少代码)方法是什么?到目前为止,我所想到的只是
date('Y-m-d H:i:s', strtotime($Site->getUTCOffset() . ' hours', strtotime(date($utcDate))));
有更短的方式吗?
解决方法:
这是我们对服务器所做的.我们将所有内容设置为使用UTC,并通过动态转换显示在用户的时区中.这篇文章底部的代码是如何使其工作的一个例子;你应该确认它适用于所有情况下你的设置(即夏令时等).
配置CentOS
>编辑/ etc / sysconfig / clock并将ZONE设置为UTC
> ln -sf /usr/share / zoneinfo / UTC / etc / localtime
配置MySQL
>如有必要,将时区导入MySQL:
mysql_tzinfo_to_sql /usr/share / zoneinfo | mysql -u root -p mysql
>编辑my.cnf并在[mysqld]部分中添加以下内容:
default-time-zone =’UTC’
PHP代码
/*
Example usage:
$unixtime = TimeUtil::dateTimeToTimestamp('2009-04-01 15:36:13');
echo TimeUtil::UTCToPST("M d, Y - H:i:s", $unixtime);
*/
// You should move this to your regular init method
date_default_timezone_set('UTC'); // make this match the server timezone
class TimeUtil {
public static function timestampToDateTime($timestamp) {
return gmdate('Y-m-d H:i:s', $timestamp);
}
public static function dateTimeToTimestamp($dateTime) {
// dateTimeToTimestamp expects MySQL format
// If it gets a fully numeric value, we'll assume it's a timestamp
// You can comment out this if block if you don't want this behavior
if(is_numeric($dateTime)) {
// You should probably log an error here
return $dateTime;
}
$date = new DateTime($dateTime);
$ret = $date->format('U');
return ($ret < 0 ? 0 : $ret);
}
public static function UTCToPST($format, $time) {
$dst = intval(date("I", $time));
$tzOffset = intval(date('Z', time()));
return date($format, $time + $tzOffset - 28800 + $dst * 3600);
}
}
标签:php,timezone
来源: https://codeday.me/bug/20190926/1818712.html