所以我检查了PHP支持的时区列表想知道如何将它们包括在date()
函数中?谢谢!
我不想使用默认时区,每个用户的时区都存储在数据库中,我使用该用户的时区并使用它。怎么样?我知道如何从数据库中获取它,但是不知道如何使用它。
Answers:
对于此类任务,您实际上应该使用PHP的DateTime类。请忽略所有建议您使用date()或date_set_time_zone的答案,这很糟糕并且已过时。
我将使用伪代码进行演示,因此请尝试调整代码以满足您的需求。
假设变量$ tz包含有效时区的字符串名称,变量$ timestamp包含您希望根据时区格式化的时间戳,则代码如下所示:
$tz = 'Europe/London';
$timestamp = time();
$dt = new DateTime("now", new DateTimeZone($tz)); //first argument "must" be a string
$dt->setTimestamp($timestamp); //adjust the object to correct timestamp
echo $dt->format('d.m.Y, H:i:s');
DateTime类功能强大,并且可以掌握其所有功能-您应该花一些时间在php.net上阅读有关它的内容。要完全回答您的问题-是的,您可以动态调整时区参数(在从db读取的每次迭代中,您可以创建一个新的DateTimeZone()对象)。
DateTime
对象上更改时间戳。
如果我理解正确,则需要先设置时区,例如:
date_default_timezone_set('UTC');
然后可以使用日期函数:
// Prints something like: Monday 8th of August 2005 03:12:46 PM
echo date('l jS \of F Y h:i:s A');
TIMESTAMP
数据类型。这些存储在后端的UTC中,因此可以将它们转换为您选择的任何时区。
请改用DateTime类,因为它支持时区。日期时间相当于date()
是DateTime::format
。
Carbon是一个非常有用的DateTime包装器-绝对值得一看。
您将需要以UTC的形式存储在数据库中并在应用程序级别进行转换。
setTimezone()
这些类的功能在应用程序逻辑中进行处理。
它应该像这样:
date_default_timezone_set('America/New_York');
试试这个。您可以传递unix时间戳或日期时间字符串
public static function convertToTimezone($timestamp, $fromTimezone, $toTimezone, $format='Y-m-d H:i:s')
{
$datetime = is_numeric($timestamp) ?
DateTime::createFromFormat ('U' , $timestamp, new DateTimeZone($fromTimezone)) :
new DateTime($timestamp, new DateTimeZone($fromTimezone));
$datetime->setTimezone(new DateTimeZone($toTimezone));
return $datetime->format($format);
}
我创建了这个非常简单的函数,它的作用就像一个魅力:
function ts2time($timestamp,$timezone){ /* input: 1518404518,America/Los_Angeles */
$date = new DateTime(date("d F Y H:i:s",$timestamp));
$date->setTimezone(new DateTimeZone($timezone));
$rt=$date->format('M d, Y h:i:s a'); /* output: Feb 11, 2018 7:01:58 pm */
return $rt;
}
上面没有提到。您还可以通过在构造函数中提供时间戳作为字符串并使用前导@符号来创建DateTime对象。
$dt = new DateTime('@123456789');
$dt->setTimezone(new DateTimeZone('America/New_York'));
echo $dt->format('F j, Y - G:i');
请参阅有关复合格式的文档:https : //www.php.net/manual/zh/datetime.formats.compound.php
您可以在date_default_timezone_set函数date_default_timezone_set(SOME_PHP_VARIABLE)中替换数据库值;但只需要注意与时区相关的确切值即可。