gpt4 book ai didi

javascript - DateTime 和 DateTimeZone 的奇怪行为

转载 作者:行者123 更新时间:2023-11-28 01:05:00 25 4
gpt4 key购买 nike

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

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

我正在伦敦测试此功能,我传递的时间代表 15:30:00 GMT。

然后我将这些传递给服务器上的 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距离当前时间有多少分钟)。我在编辑中的代码顶部添加了这一行,现在它可以正常工作:

$tzoffset = -$tzoffset;

最佳答案

要将小时格式设置为 24 小时格式,请使用大写 H。

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

关于javascript - DateTime 和 DateTimeZone 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25186821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com