与夏令时相关的PHP日期时间转换问题

时间:2018-11-12 03:41:37

标签: php datetime dst

我的Web应用程序中有一些本地化功能(通过Ajax公开),使用户能够在其自己的时区以及与数据主要相关的实体位置有关的时区中显示一些日期时间信息。

作为一些测试的结果,我发现尽管我的代码能够准确转换数据库来源的日期/时间值(即包括DST调整),但是当我使用提供的日期时,代码无法计算出正确的偏移量在表格内。我已经能够实现的最好的方法是将表单日期/时间值转换为UTC,但是应用了不正确的偏移量。这意味着我需要检查日期是否在夏时制范围内,如果是,则将datetime值拉一个小时。这似乎是一个丑陋的修复,如果有人知道我哪里出了问题,我将不胜感激:

示例:

  • 输入值25/11/2018 16:00 NZDT(太平洋/奥克兰)= UTC + 13
  • 输出值应为25/11/2018 14:00 ADT(澳大利亚/悉尼)= UTC + 11
  • 如果我从数据库中提取源值,然后进行转换,则计算工作正常,没有问题
  • 如果我使用表单提供的值(如果用户没有保存就更新了值,则需要检查该值),则会发生以下情况:

  • FROM DB1 = 2018-11-25 03:00:00(DB中的值,以UTC为单位)

  • 从表格1 = 25/11/2018 16:00(来自表格的原始值)
  • FROM FORM2 = 2018-11-25 04:00:00(更改为UTC-12,即NZST)这是错误的,应与DB1相同,即UTC-13,这是从NZDT返回到UTC)
  • FROM FORM3 = 2018-11-25 03:00:00(更正后,一旦我检查日期/时间值是否在夏时制范围内)

代码如下:

echo "FROM DB1:  ".$getListing['lo_deadline']."<BR />";
echo "FROM FORM1:".$in_lo_deadline."<BR />";
$frmDateTime =  DateTime::createFromFormat($this->view->user->user_datetimeformat, $in_lo_deadline,new DateTimeZone($list_tmzn));                   
echo "FROM FORM2:".$frmDateTime->format('Y-m-d h:i:s')."<BR />";
//If $frmDateTime is in daylight savings then subtract an hour to arrive at the correct UTC value                   
if ($frmDateTime->format('I'))
{
    date_sub($frmDateTime, date_interval_create_from_date_string('1 hours'));
}
echo "FROM FORM3:".$frmDateTime->format('Y-m-d h:i:s')."<BR />";                    
$dates['set_dead'] = convertUserDate($frmDateTime->format('Y-m-d h:i:s'), $this->view->user->user_datetimeformat, $user_tmzn,'UTC');

1 个答案:

答案 0 :(得分:1)

我从您的代码中了解到,之所以显示2018-11-25 04:00:00是因为AM / PM格式。您应该在代码中使用大写字母H而不是h

您需要了解24小时格式和12小时格式之间的差异。 2018-11-25 04:00:00根据您的格式为AM / PM或12小时格式,但以24小时格式应为2018-11-25 16:00:00。数据库时间始终为24小时格式。

更改

$frmDateTime->format('Y-m-d h:i:s')

$frmDateTime->format('Y-m-d H:i:s')

注意:您无需手动减去一小时即可计算夏令时,因为php会自动执行。