PHP 在不设置默认时区的情况下从字符串获取 unix 时间戳

PHP get unix timestamp from string without setting default timezone

我有 1/1/2020 00:00:00 America/Los_Angeles 时间的精确日期,我想将其转换为 UNIX 时间戳。许多答案都希望在将字符串插入 strtotime() 函数之前使用 date_default_timezone_set 设置默认时区。但我不想弄乱服务器的默认时区(可能是 UTC)。

strtotime("1/1/2020 00:00:00 America/Los_Angeles")获取我的时间戳有什么问题吗?

我通过这种方式获得了正确的 UNIX 值。只是,文档中没有任何内容表明这是有效的。

由于你的time str是有时区的,所以不需要设置默认时区。但是当你想打印时,你需要设置默认时区。

php > echo date_default_timezone_get();
UTC

php > echo date("Y-m-d H:i:s",strtotime("1/1/2020 00:00:00 America/Los_Angeles"));
2020-01-01 08:00:00

php > echo date("Y-m-d H:i:s",strtotime("1/1/2020 00:00:00"));
2020-01-01 00:00:00

strtotime 和 datetime 还处理位于日期字符串中的时区信息。 如果省略,则使用服务器的本地设置。

这提供了正确的时间戳

strtotime("1/1/2020 00:00:00 America/Los_Angeles");

但是 date() 的输出使用服务器的本地时区。

使用DateTimeclass时不存在这些问题。 在 DateTime 对象中,时区存储在对象中,与服务器的本地设置无关。

echo date_default_timezone_get(); //my Server get Europe/Berlin

$dateTimeLA = date_create("1/1/2020 00:00:00", new DateTimeZone('America/Los_Angeles'));

echo $dateTimeLA->format("Y-m-d H:i:s e");

输出:2020-01-01 00:00:00 America/Los_Angeles

如果需要时间戳:

$tsLA = $dateTimeLA->getTimeStamp();
echo $tsLA;  //1577865600

如何从时间戳创建日期时间对象:

$dateFromTs = date_create(null, new DateTimeZone('America/Los_Angeles'));
$dateFromTs->setTimestamp(1577865600);
var_dump($dateFromTs);

输出:

object(DateTime)#4 (3) {
  ["date"]=>
  string(19) "2020-01-01 00:00:00"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(19) "America/Los_Angeles"
}