这是我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;
答案 0 :(得分:1)
要将小时格式化为24小时格式,请使用大写字母H.
将'h:i:s'
更改为'H:i:s'