【问题标题】:force php strtotime to use UTC强制 php strtotime 使用 UTC
【发布时间】:2025-12-23 03:15:11
【问题描述】:

我已经看到了一些关于此的问题,但没有明确的答案... strtotime() 将在将字符串转换为 unix 时间戳时使用为 PHP 设置的默认时区。

但是,我想将字符串转换为 UTC 中的 unix 时间戳。既然没有这样做的参数,那怎么做呢?

我要转换的字符串是:2011-10-27T20:23:39,它已经是 UTC。我想将其表示为 UTC 中的 unix 时间戳。

谢谢

【问题讨论】:

标签: php timestamp strtotime


【解决方案1】:

其他两个答案都很好。由于我有同样的问题,我想提供第三种选择。

$utc = new DateTimeZone('UTC');
$dt = new DateTime('2011-10-27T20:23:39', $utc);
var_dump($dt->format('U'));

string(10) "1319747019"

【讨论】:

  • 如果日期时间字符串中存在时区,则此方法不起作用。
  • 也许,但这是解决问题的方法。此外,与其他解决方案有什么不同!?在所有其他情况下,当前时区可能会导致不需要的结果。
  • Using DateTimeZone as Parameter 表明它将始终使用这个时区。
【解决方案2】:

我意识到这个问题已经很老了,但我找到了另一个有用的选项。 您可以将时区指定为传递给 strtotime 的字符串的一部分,而不是设置然后恢复 php 的时区,如下所示:

echo date_default_timezone_get();
output: America/Chicago

echo gmdate('Y-m-d H:i:s', strtotime('2011-10-27T20:23:39'));
output: 2011-10-28 01:23:39

echo gmdate('Y-m-d H:i:s', strtotime('2011-10-27T20:23:39 America/Chicago'));
output: 2011-10-28 01:23:39

echo gmdate('Y-m-d H:i:s', strtotime('2011-10-27T20:23:39 UTC'));
output 2011-10-27 20:23:39

注意:我使用的是 PHP 5.5.9,但这应该适用于任何 php 版本。

【讨论】:

  • 这更容易,但您必须注意用户输入。如果您只是发送用户输入的内容,您永远不知道他们是否会包含时区或会弄乱字符串的内容。
【解决方案3】:

在拨打strtotime之前设置系统默认时区:

date_default_timezone_set('UTC');
echo strtotime('2011-10-27T20:23:39')."\n";

// Proof:
print_r(getdate(strtotime('2011-10-27T20:23:39')));

// IMPORTANT: It's possible that you will want to
// restore the previous system timezone value here.
// It would need to have been saved with
// date_default_timezone_get().

See it in action.

【讨论】:

  • 这会导致脚本的其余部分出现问题吗?我想我可以在之后重新设置它?
  • @Brian:这可能会导致问题,是的。但只要你把它放回去就没有问题了。