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

Php 通过时区调整将源文本转换为时间,php,regex,datetime,time,timezone,Php,Regex,Datetime,Time,Timezone,我有一个原始文本/xml信息文件,其中列出了当天发生的事件。每个活动的开始时间以00:00:00 24小时格式表示,并基于欧洲/伦敦时区。我要做的是转换文件中找到的每个事件开始时间,使其以“g:ia”格式表示,并基于美国/纽约时区 如果我将源字符串定义为单个实例,则以下代码可以正常工作: //output will be 3:45 PM $src_tm = '19:45:00'; $src_tz = new DateTimeZone('Europe/London'); $dest_tz = n

我有一个原始文本/xml信息文件,其中列出了当天发生的事件。每个活动的开始时间以00:00:00 24小时格式表示,并基于欧洲/伦敦时区。我要做的是转换文件中找到的每个事件开始时间,使其以“g:ia”格式表示,并基于美国/纽约时区

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

//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”?

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


相反,研究类似于将XML文件解析为对象图的方法,您可以安全地查询和操作对象图中的节点。更新每个相关节点中的日期格式和时区后,可以将对象图作为XML字符串保存回文件。

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

话虽如此,在阅读了preg_replace_回调之后,我能够正确地理解事情。真有魅力

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

谢谢,但我想在我的问题中做的只是在一个更大的、已经编写好的、运行良好的脚本中的一小段代码。我现在走得太远了,无法为这一件作品采用新的方法。你确定它是基于
欧洲/伦敦
?它更有可能是基于UTC的。伦敦在格林尼治标准时间和英国夏令时之间交替,而UTC是固定的。此外,如果不将时间指定给特定日期,就不可能准确地将时间转换为任何特定的本地时区。如果在创建
DateTime
时未提供日期,则默认为当前日期,该日期对于您的用例可能正确,也可能不正确。