【问题标题】:Is there a referentially transparent way to work with times in php是否有一种参考透明的方式来处理 php 中的时间
【发布时间】:2015-11-05 06:50:46
【问题描述】:

无论代码在何时何地运行,我都在尝试将时间转换为以下时区:

  • 运行代码的时区
  • AEST(澳大利亚东部标准时间)
  • EDT(纽约东部夏令时间)

例如,给定一个 unix 时间戳,我如何使用 EDT 时区找到一个新的 unix 时间戳“同一周的星期一”?我该怎么做,这样它总是会给出相同的结果?

【问题讨论】:

标签: php time timestamp-with-timezone


【解决方案1】:

首先,您必须了解 Unix 时间戳与时区无关,它始终与 UTC/GMT 相关。引用手册

返回自 Unix 纪元(格林威治标准时间 1970 年 1 月 1 日 00:00:00)以来以秒数衡量的当前时间。

既然您知道一个时间戳表示参考 GMT/UTC 的固定时间,您可以继续并在代码中更改时区,以从相同的时间戳计算它们的时间。

假设你有一个 unix 时间戳

$ts = 1171502725;

如果你从它创建一个日期,你会做类似的事情

$date = new DateTime("@$ts");
echo $date->format('U = Y-m-d H:i:s T') . "\n";

现在你想看看 EST 对应的是什么,你可以这样做

$date->setTimezone(new DateTimeZone('America/New_York'));
echo $date->format('U = Y-m-d H:i:s T') . "\n";

CST 也是如此

$date->setTimezone(new DateTimeZone('America/Chicago'));
echo $date->format('U = Y-m-d H:i:s T') . "\n";

等等:)

输出

1171502725 = 2007-02-15 01:25:25 GMT+0000
1171502725 = 2007-02-14 20:25:25 EST
1171502725 = 2007-02-14 19:25:25 CST

Fiddle

您可以从 PHP Manual

获取支持的时区列表及其标识符

【讨论】:

  • micro-nitpick: (1) 一般来说,"Unix Timestamp" 只计算POSIX 中的非闰 SI 秒,例如,2015-06-30 18:59:59 CST2015-06-30 19:00:00 CST 之间经过 2 秒(有之间的闰秒),但 POSIX 时间仅计算 1 秒。 (2) 在非 POSIX 情况下,Unix 时间戳可能不同,例如,如果使用 "right/UTC" 时区,则时间戳表示实际经过的 SI 秒(TAI 时间刻度,纪元:1970 年 1 月 1 日 00:00:10 TAI)。
  • 没有。首先,您必须了解我全年都想要 EDT 时区。
猜你喜欢
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 2013-07-09
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
相关资源
最近更新 更多