我的webapp中有一些本地化功能(通过ajax公开),使用户可以在自己的时区以及与数据主要相关的实体位置相关的时区中显示一些日期时间信息。
通过一些测试,我发现虽然我的代码能够准确地转换数据库源日期/时间值(即包括DST调整),但当我使用表单中提供的日期时,代码不会计算正确的偏移量。我所能达到的最好效果是将表单日期/时间值转换为UTC,但应用了不正确的偏移量。这意味着我需要检查日期是否在夏令时范围内,如果在夏令时范围内,请将日期时间值向后拉一小时。这似乎是一个丑陋的修复,如果有人知道我哪里出了错,我会很感激:
例子:
输入值25/11/2018 16:00 NZDT(太平洋/奥克兰)=UTC+13
输出值应为25/11/2018 14:00 ADT(澳大利亚/悉尼)=UTC+11
如果我从数据库中提取源值,然后进行转换,那么计算工作正常,没有问题。
如果我使用表单提供的值(如果用户未保存该值而更新了该值,则需要检查该值),则会发生以下情况:
从db1=2018-11-25 03:00:00(以db为单位,以UTC为单位)
自表格1=25/11/2018 16:00(表格原始值)
从表2=2018-11-25 04:00:00(更改为UTC-12,即NZST)开始,如果错误,则应与DB1的值相同,即UTC-13,即NZDT返回到UTC的偏移量)
从表3=2018-11-25 03:00:00开始(更正后,一旦我检查日期/时间值是否在夏令时范围内)
代码如下:
echo"FROM DB1: ".$getListing['lo_deadline']."
";
echo"FROM FORM1:".$in_lo_deadline."
";
$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')."
";
//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')."
";
$dates['set_dead'] = convertUserDate($frmDateTime->format('Y-m-d h:i:s'), $this->view->user->user_datetimeformat, $user_tmzn,'UTC');
我从您的代码中了解到,它显示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会自动计算夏令时。
我真不敢相信我犯了这样一个愚蠢的错误!谢谢您!我做了必要的修改,现在工作得很好。
酷,如果它解决了你的问题,那么请接受答案。谢谢。