如果没有显示正确的数据,则使用DateTime类


DateTime class if not displaying the correct data

我第一次使用DateTime类在不同时区之间进行转换。

这是我的

$USER_TIME_ZONE = new DateTimeZone('America/Los_Angeles');
$UTC = new DateTimeZone('UTC');
$schedule_date = new DateTime($call['triggerOn'], $USER_TIME_ZONE);
echo $schedule_date->format('m/d/Y h:i A');
$schedule_date = new DateTime($call['triggerOn'], $UTC);
echo $schedule_date->format('m/d/Y h:i A');

这是我如何通过我的结果,并试图转换它们

foreach ( $activities AS $call){ 
    $USER_TIME_ZONE = new DateTimeZone('America/Los_Angeles');
    $UTC = new DateTimeZone('UTC');
    $schedule_date = new DateTime($call['triggerOn'], $UTC);
    echo $schedule_date->format('m/d/Y h:i A');
 }

$call['triggerOn']的值

2013-02-27 18:00:37
2013-02-02 01:11:07
2013-01-10 17:12:14
2013-02-27 22:29:42
2013-02-27 22:28:38
2013-02-25 21:53:12
2013-02-14 14:35:48
2012-12-13 14:03:16
2013-03-04 19:04:20
2013-03-01 18:52:48
2013-03-05 15:46:56
2013-03-11 15:26:17
2013-02-07 18:17:30
2013-03-05 18:04:25

我的两个输出都是相同的!我不明白为什么。是否有一个配置,我需要做的服务器端,因为我有PHP在Windows server 2008 R2上运行。感谢您的帮助和时间。

DateTime::format()方法返回创建数据所在时区的时间。没有发生转换。因此,无论您传入的时区如何,您的输出时间将与输入时间相同。您可以通过在format参数中添加'e'来验证这一点。您将看到,在第一个例子中,时区是America/los - angeles,而在第二个例子中,它是UTC。

您可能正在尝试转换时区之间的时间,对吗?为了做到这一点,只需在一个时区中创建一个新的DateTime对象,用第二个时区调用setTimezone方法,然后格式化结果。

所有这些都假设$call['triggerOn']值既不是时间戳,也不是标识时区的值。在这种情况下,DateTime构造函数的第二个参数被忽略。

知道$call['triggerOn']的值会有帮助,但这是否有效:

$USER_TIME_ZONE = 'America/Los_Angeles';
$UTC = 'UTC';
$schedule_date = new DateTime( $call['triggerOn'], $USER_TIME_ZONE );
echo $schedule_date->format( 'm/d/Y h:i A' );
$schedule_date = new DateTime( $call['triggerOn'], $UTC );
echo $schedule_date->format( 'm/d/Y h:i A' );

基本上,不是创建新的DateTime对象用作其他新的DateTime对象的参数,如果你只是使用时区字符串代替呢?这样行吗?