是否有一种引用透明的方式与PHP中的时间一起工作

gra*_*ski -4 php time timestamp-with-timezone

我试图将时间转换为以下时区,无论代码运行的时间和位置如何:

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

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

Han*_*nky 46

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

返回自Unix Epoch(1970年1月1日00:00:00 GMT)以来的秒数测量的当前时间.

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

我们假设你有一个unix时间戳

$ts = 1171502725;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

同样适用于CST

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

等等 :)

产量

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
Run Code Online (Sandbox Code Playgroud)

小提琴

您可以从PHP手册中获取支持的时区及其标识符列表

  • micro-nitpick:(1)一般来说,"Unix时间戳"只计算[POSIX]中的非跳跃SI秒(http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_15),例如,在2015-06-30 18:59:59 CST`和`2015-06-30 19:00:00 CST之间经过了2秒(中间有一个闰秒),但POSIX时间仅为1秒.(2)在非POSIX情况下,Unix时间戳可能不同,例如,如果使用"右/ UTC"时区,则时间戳表示实际经过的SI秒(TAI时间刻度,纪元:1970年1月1日00:00:10 TAI). (2认同)