1

我第一次使用 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

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

4

2 回答 2

1

DateTime::format() 方法返回创建数据的时区中的时间。没有进行转换。因此,无论您传入哪个时区,您的输出时间都将与输入时间相同。您可以通过在格式参数中添加“e”来验证这一点。您会看到,在第一种情况下,时区是 America/Los_Angeles,在第二种情况下是 UTC。

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

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

于 2013-03-21T17:49:27.790 回答
0

知道 $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 对象的参数,不如只使用时区字符串呢?那样有用吗?

于 2013-03-21T17:40:34.573 回答