我有一个原始文本/ 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?
答案 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');
}