DateTime和DateTimeZone的奇怪行为

时间:2014-08-07 15:47:58

标签: javascript php datetime timezone

这是我previous one的后续问题。该应用程序是javascript / php。在Javascript中,我得到了本地时间戳和时区偏移量:

var timestamp = new Date().getTime();
var tzoffset = new Date().getTimezoneOffset();

我正在伦敦对此进行测试,我传递的时间代表格林尼治标准时间15:30:00。

然后我将这些传递给服务器上的php脚本,需要将此时间戳格式化为H:MM:SS(即php的format('h:i:s', $time)。我在PHP中使用以下代码开始:

$dt = new DateTime();
$dt->setTimestamp($timestamp / 1000);  //javascript includes milliseconds, php doesn't
echo $dt->format('h:i:s');

这产生了07:30:00的输出 - 这是相同的时间点,但是使用服务器的时区(服务器位于加利福尼亚州)。

然后我使用this question中的技巧获取时区并设置该时区

$tz = timezone_name_from_abbr(null, $tzoffset * 60, true);  //javascript's offset is in seconds
if($tz === false) $tz = timezone_name_from_abbr('', $tzoffset * 60, false);
$dt = new DateTime(null, new DateTimeZone($tz));
$dt->setTimestamp($timestamp / 1000);
echo $dt->format('h:i:s');

这产生了02:30:00的相当奇怪的结果。

然后我将上面的内容改为:

$dt = new DateTime(null, new DateTimeZone('Europe/London'));
$dt->setTimestamp($timestamp / 1000);
echo $dt->format('h:i:s');

这产生了结果03:30:00

如何让服务器根据客户端提供的信息输出15:30:00

编辑:谢谢,@ MarkM,这对我来说相当愚蠢 - 但是这仍然没有完全解决问题,因为这段代码:

$tz = timezone_name_from_abbr(null, $tzoffset * 60, true);  //javascript's offset is in seconds
if($tz === false) $tz = timezone_name_from_abbr('', $tzoffset * 60, false);
$dt = new DateTime(null, new DateTimeZone($tz));
$dt->setTimestamp($timestamp / 1000);
echo $dt->format('h:i:s');

现在生成14:30:00,也就是说,它没有考虑DST。任何想法如何解决这个问题?

编辑2:我忘记了javascript的getTimezoneOffset返回反转(即GMT距当前时间的分钟数)。我在 EDIT 中的代码顶部添加了这一行,现在它正常工作:

$tzoffset = -$tzoffset;

1 个答案:

答案 0 :(得分:1)

要将小时格式化为24小时格式,请使用大写字母H.

'h:i:s'更改为'H:i:s'

相关问题