PHP date()与时区?


78

所以我检查了PHP支持的时区列表想知道如何将它们包括在date()函数中?谢谢!

我不想使用默认时区,每个用户的时区都存储在数据库中,我使用该用户的时区并使用它。怎么样?我知道如何从数据库中获取它,但是不知道如何使用它。


您以哪种格式存储时区?
雷沃

Answers:


134

对于此类任务,您实际上应该使用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()对象)。


1
@Glavić-您是正确的,我将留下答案以显示如何执行此操作。但是,DateTime击败了操纵服务器的时区,这正是我想要(但未能指出)的问题。
NB

你的代码不起作用为DateTime构造的第一个参数必须是一个字符串[ php.net/manual/en/datetime.construct.php ]
亚历

@Alex-是的,这是不正确的-这是我评论的内容,并将答案保留在其中。当我懒惰自己时,我将编辑答案以包括正确的构造函数:)(同时,您可以编辑答案也是吗?)
NB

由于您已经使用'now'启动了DateTime,为什么将时间戳设置为现在的时间戳?
乔治·迪米特里亚迪斯

@GeorgeDimitriadis,因为它是如何使用代码的示例。它旨在突出您的工作能力。您正确地说,在这种情况下它基本上是没有意义的,但是我将其放在此处,以便人们可以看到如何在创建的DateTime对象上更改时间戳。
NB

38

如果我理解正确,则需要先设置时区,例如:

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');

1
我不需要默认时区,它将被存储在每个用户的数据库中。
user2917204

3
@ user2917204如果您使用的是MySQL,请将其存储为TIMESTAMP数据类型。这些存储在后端的UTC中,因此可以将它们转换为您选择的任何时区。
ceejayoz 2013年

我正在使用MySQL,并将其存储为TIMESTAMP,转换该代码需要什么代码?
user2917204

1
@ user2917204创建一个函数,该函数设置时区,输出格式化日期并放回时区。的例子大量stackoverflow.com/questions/11900126/...stackoverflow.com/questions/7824038/...。DateTime类还接受时区参数php.net/manual/en/class.datetime.php
Mike B

18

请改用DateTime类,因为它支持时区。日期时间相当于date()DateTime::format

Carbon是一个非常有用的DateTime包装器-绝对值得一看。

您将需要以UTC的形式存储在数据库中并在应用程序级别进行转换。


是的,它可以。您可以使用setTimezone()这些类的功能在应用程序逻辑中进行处理。
ceejayoz 2013年

13

上面答案使我跳过了一些难题,所以只发布对我有用的更干净的代码:

$dt = new DateTime();
$dt->setTimezone(new DateTimeZone('America/New_York'));
$dt->setTimestamp(123456789);

echo $dt->format('F j, Y @ G:i');

8

它应该像这样:

date_default_timezone_set('America/New_York');

3
我不想使用默认时区,每个用户的时区都存储在数据库中,我使用该用户的时区并使用它。怎么样?我知道如何从数据库中获取它,而不是如何使用它。
user2917204

它不会为所有用户创建默认时区,而不会为当前脚本创建默认时区,这可能会响应1个当前用户的操作。
LStarky

3

这在2019年非常有效:

date('Y-m-d H:i:s',strtotime($date. ' '.$timezone)); 

2

试试这个。您可以传递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);
    }

2

您可以将时区差异添加到unix时间戳。莫斯科(UTC + 3)示例

echo date('d.m.Y H:i:s', time() + 3 * 60 * 60);

1

我创建了这个非常简单的函数,它的作用就像一个魅力:

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;
    }

0

上面没有提到。您还可以通过在构造函数中提供时间戳作为字符串并使用前导@符号来创建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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.