PHP - strtotime,指定时区

And*_*Hin 52 php timezone date

我有一个日期字符串,说' 2008-09-11'.我想从中获取时间戳,但我需要动态指定时区(而不是PHP默认值).

所以回顾一下,我有两个字符串:

$dateStr = '2008-09-11';
$timezone = 'Americas/New_York';
Run Code Online (Sandbox Code Playgroud)

我如何获得此时间戳?

编辑:一天中的时间将是那天的午夜.... $ dateStr ='2008-09-11 00:00:00';

sal*_*the 73

$date = new DateTime($dateStr, new DateTimeZone($timezone));
Run Code Online (Sandbox Code Playgroud)

$timestamp = $date->format('U');

  • @whydna不,你没有转换.您正在*解释*日期字符串,就像引用指定的时区一样.要转换新的`$ d = new DateTime($ dateStr,$ timezonefrom); $ D-> setTimezone($ timezoneto);`. (7认同)
  • @whydna你不是*转换*任何东西(除非我误读).代码在指定的时区中创建该日期的表示. (4认同)
  • 我不需要指定要转换的时区吗?还是只是从PHP默认值转换而来? (2认同)
  • @whydna 是的,当然会有所不同。但时间并不存在于真空中。它有一个关联的时区。如果您在创建“DateTime”对象时要谎报实际时区,那就是您的问题。但这不是正确的时区转换。转换需要从一个时区转到另一个时区。在这种情况下,您将从哪里进行转换? (2认同)

kro*_*owe 28

如果您运行PHP> 5.2(我认为这是他们添加DateTime类的版本),那么接受的答案是很好的.如果你想支持旧版本,你不想输入那么多,或者如果你只是喜欢功能方法,还有另一种方法也不能修改全局设置:

$dateStr = '2008-09-11 00:00:00';
$timezone = 'America/New_York';
$dtUtcDate = strtotime($dateStr. ' '. $timezone);
Run Code Online (Sandbox Code Playgroud)

  • 事实并非如此。它确实使用类并且需要 PHP > 5.2。乔纳斯的回答修改了全局设置。 (2认同)

Jon*_*nah 17

如果由于某种原因你使用<5.2(天堂禁止),这将有效.

$reset = date_default_timezone_get();
date_default_timezone_set('America/New_York');
$stamp = strtotime($dateStr);
date_default_timezone_set($reset);
Run Code Online (Sandbox Code Playgroud)

但是5.2及以上,我强烈建议你选择@ salathe的答案.


Phi*_*ert 5

如果您打算使用时区,我建议您使用 DateTime 类,在这种情况下,DateTime::createFromFormat() 函数将允许您执行以下操作:

$start = "2015-01-14 11:59:43";
$timezone = "America/Montreal";
 
$tz = new DateTimeZone($timezone);
$dt = DateTime::createFromFormat('Y-m-d H:i:s', $start, $tz);
Run Code Online (Sandbox Code Playgroud)

当您将 $tz 放入 DateTime::createFromFormat 函数时,您会告诉它您提供的日期所在的时区,以便当您需要将其转换为另一个时区时,您所要做的就是这样:

$start = $dt->setTimeZone(new DateTimeZone('UTC'));
Run Code Online (Sandbox Code Playgroud)