所以,如果我有这样的字符串:' 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时区的正确字符串?
答案 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-01
和16:03:45
上的元素分开。
在这里你有答案Timezone conversion in php