通过时区调整将源文本转换为时间

时间:2014-03-19 13:16:39

标签: php regex datetime time timezone

我有一个原始文本/ xml信息文件,列出当天发生的事件。每个活动的开始时间以00:00:00 24小时格式表示,并以欧洲/伦敦时区为基础。我想要做的是转换文件中找到的每个事件开始时间,使其以'g:i A'格式表示,并基于America / New_York时区。

如果我将源字符串定义为单个实例,下面的代码可以正常工作:

//output will be 3:45 PM
$src_tm = '19:45:00';
$src_tz =  new DateTimeZone('Europe/London');
$dest_tz = new DateTimeZone('America/New_York');

$tm = new DateTime($src_tm, $src_tz);
$tm->setTimeZone($dest_tz);

$dest_tm = $tm->format('g:i A');

echo $dest_dt;

然而,正如我上面所说,我想为文件中的每个实例执行此操作。我想出了以下正则表达式来识别每个实例:'/ \ d +:\ d +:00 /'但是我使用带有preg_replace和DateTime的正则表达式使得工作非常困难。我需要做些什么来确保文件中的每个开始时间都被识别并转换为'g:i A'和America / New_York?

2 个答案:

答案 0 :(得分:0)

我建议不要使用正则表达式来操作XML文件。这可能容易出错。

相反,查看SimpleXML之类的内容,将XML文件解析为一个对象图,其节点可以安全地查询和操作。完成更新每个相关节点中的日期格式和时区后,可以将对象图作为XML字符串保存回文件中。

答案 1 :(得分:0)

Matt在UTC而不是欧洲/伦敦是正确的。谢谢你指出来。是的,在我的情况下不需要分配特定日期,因为我使用的信息每天都会刷新。所以我需要的是当前日期的默认值。

话虽如此,在阅读了preg_replace_callback之后,我能够把事情做好。工作了一个魅力!

//adjust event start time for America/New York 
$input = preg_replace_callback('/\\d{2}:\\d{2}:\\d{2}/', 'replace_timestamp', $info);

function replace_timestamp($matches)
{
    $source_tz = new DateTimeZone('UTC');
    $destination_tz = new DateTimeZone('America/New_York');

    $time = new Datetime($matches[0], $source_tz);
    $time->setTimeZone($destination_tz);
    return $time->format('g:i A');
}