PHP - 显示不同时区的数据

标签 php datetime timezone timezone-offset currency-exchange-rates

您好 stackoverflow 社区。

我开发了一个网络应用程序,其概念是根据过去的时间序列显示历史货币汇率。

例如,用户可以请求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/

相关文章:

php - 在分离 css、phpfles 和数据库的意义上,PHP 的编码标准是什么

php - datetime-local 值未出现在输入标签上

PHP mktime 和时区

php - 如果产品价格高于 Woocommerce 中的特定金额,请在产品价格前添加文本

javascript - 数据在 Highcharts 上的位置

c# - 如何为每个线程设置时区?

c# - 在 C# 中将时间跨度转换为日期时间

java - 如何以 UTC 显示所选时区的 Toast

java - 如何使用比最新 TZupdater 版本使用的文件更新的 IANA 文件更新 Java 时区信息?

php - Laravel Livewire 使用重定向将变量数据从一个组件传递到另一个组件