您好 stackoverflow 社区。p>
我开发了一个网络应用程序,其概念是根据过去的时间序列显示历史货币汇率。
例如,用户可以请求2020年5月22日13:00至2020年5月26日22:00之间的汇率。然后我的后端运行一个循环并每小时获取这两个日期时间之间的费率。
数据库中的所有费率均存储在 GMT 时区。
问题就在这里。假设用户从时区偏移 +10:00 发出请求。因此,如果该用户选择最后日期时间为 2020 年 5 月 26 日 22:00,我想我应该从数据库中获取 2020 年 5 月 26 日 12:00 的汇率,因此要减去 10 小时。
也许这听起来很愚蠢,但我坚持这个。
我的逻辑是什么:
a) 通过前端的 javascript 获取用户时区偏移量
var get_timezone_offset = new Date().getTimezoneOffset();
var hrs = parseInt(-(timezone_offset / 60));
var mins = Math.abs(timezone_offset % 60);
var timezone_offset = hrs + ':' + mins;
b) 将用户时区偏移发送到我的后端
c) 从我的数据库获取费率,并通过 PHP 的 Datetime 对象将 GMT 存储的日期转换为用户时区偏移
$date = new \DateTime('2020-05-26 22:00');
$date->modify(-10 hours);
$date->format('Y-m-d H:i:s');
这是对的吗?我不会向我的用户显示错误的费率。
提前谢谢
最佳答案
请阅读timezone tag wiki ,特别是标题为“时区!=偏移”的部分。简而言之,您不能假设现在从用户处获取的偏移量与在任何其他时间点应用的偏移量相同。
一个简单的例子是 America/New_York
等时区,目前为 UTC-4,但在 11 月夏令时结束时将切换为 UTC-5。但除了 DST 之外,许多时区的标准时间偏移也发生了变化。
从浏览器获取 IANA 时区标识符,而不是获取当前数字偏移量。
const tzid = Intl.DateTimeFormat().resolvedOptions().timeZone;
// example: "America/New_York", "Asia/Kolkata", "Europe/Athens", etc.
然后您可以将此标识符与 PHP 的内置时区支持一起使用。例如,以下将给定时区的本地时间转换为 UTC 中的等效时间:
$tz = new DateTimeZone("America/New_York");
$date = new DateTime('2020-05-26 22:00', $tz);
$date->setTimeZone(new DateTimeZone("UTC"));
echo $date->format('Y-m-d H:i:s');
关于PHP - 显示不同时区的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62068430/