这是我上一个问题的跟进问题。该应用程序是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
-是同一时间点,但使用服务器的时区(服务器在加利福尼亚州)。
然后,我使用此问题的技巧来获取时区并设置该时区
$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;
要将小时格式化为24小时格式,请使用大写字母H。
更改'h:i:s'
为'H:i:s'
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句