2014-03-19 16 views
0

我有一个原始文本/ xml信息文件,列出当天发生的事件。每个事件的开始时间以00:00:00 24小时制表示,并以欧洲/伦敦时区为基础。我想要做的就是转换文件中的每个事件开始时间,以便以'g:i'格式表示并基于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:iA'和America/New_York?

+0

你确定它是基于欧洲/伦敦吗?它更可能是基于UTC的。伦敦在GMT和BST之间交替,而UTC是固定的。 –

+0

此外,无法准确地将时间转换为任何特定的本地时区,而无需将其分配给特定的*日期*。如果您在创建'DateTime'时没有提供日期,则默认为* current *日期,这可能会或可能不会正确地用于您的用例。 –

回答

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'); 
} 
0

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

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

+0

谢谢,但我想在我的问题中所做的只是一个较大的,已经编写且运行良好的脚本中的一小段代码。现在我走得太远了,为了这一块,转向一种新的方法。 – yuengling25

相关问题