如何将带有T的字符串转换为特定的时区?

时间:2018-01-07 22:46:28

标签: php date datetime timezone

所以,如果我有这样的字符串:' 2017-12-01T16:03:00'并且需要将此字符串转换为America/New_York的时区,如何转换此字符串?不完全确定T在字符串中的作用以及它的确切内容。

我对这方面的正确方法感到好奇,而我相信这里的T很重要,我理解它的目的。到目前为止我在这里尝试过:

$string = '2017-12-01T16:03:00';
$time_fix = explode('T', $string);

if (count($time_fix) > 1)
{
    $data_date = DateTime::createFromFormat('Y-m-d H:i:s', $time_fix[0] . ' ' . $time_fix[1]);
    $output = $data_date->format('Y-m-d H:i:s', new DateTimeZone('America/New_York'));
} else {
    $data_date = DateTime::createFromFormat('Y-m-d H:i:s', $time_fix[0] . ' 00:00:00');
    $output = $data_date->format('Y-m-d H:i:s', new DateTimeZone('America/New_York'));
}

不确定这是否正在转换时区,所以想知道你的想法是什么? $output变量是否包含America/New_York时区的日期和时间?我很难对此进行测试,因为我不知道创建时间字符串时当前的时区。

另外,想知道这里的T是否重要及其含义。以及如何针对America/New_York时区正确执行此操作?

更新

显然,我发现通过API创建这些日期字符串的服务器时区已经在东部标准时间了。但是,如果我不知道这一点,它将如何转换为UTC? API的开发人员声称它是8601格式的UTC,但时区是EST。这对我来说没有意义。因为,我认为EST是UTC-5,而不仅仅是UTC。我怎么知道这似乎是来自API的一个不正确处理的UTC时区字符串结果?我是否正确地指出2017-12-01T16:03:00不是UTC时区中EST时区的正确字符串?

2 个答案:

答案 0 :(得分:1)

如果你这样做:

$date = new DateTime($info['CreateDate']); 
$date->setTimeZone(new DateTimeZone('UTC')); 
$date->setTimeZone(new DateTimeZone('America/New_York')); 
$output = $date->format('Y-m-d H:i:s');

您首先在默认时区中创建DateTime对象,这将影响时间戳计算,然后更改时区。 相反,假设UTC输入,你应该这样做:

$date = new DateTime($info['CreateDate'], new DateTimeZone('UTC')); 
$date->setTimeZone(new DateTimeZone('America/New_York')); 
$output = $date->format('Y-m-d H:i:s');

这样,DateTime对象会将输入日期解释为UTC时间并正确计算时间戳。然后设置时区只是为了获得正确的日期字符串,它不会影响基础时间戳。

我注意到ISO 8601日期字符串可以指定UTC偏移,因此在这种特殊情况下,您可以在不指定的情况下离开,因为没有给出偏移量。如果您的默认时区是UTC,则在这种情况下也没有区别。

根据新数据进行编辑:

如果您知道输入位于东部标准时区,请尝试更改构造DateTime对象的行。

$date = new DateTime($info['CreateDate'], new DateTimeZone('EST')); 
$date->setTimeZone(new DateTimeZone('America/New_York')); 
$output = $date->format('Y-m-d H:i:s'); 

答案 1 :(得分:0)

$string 2017-12-0116:03:45上的元素分开。 在这里你有答案Timezone conversion in php