datetime php时间相加_关于datetime:与夏令时相关的PHP日期时间转换问题

我的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会自动计算夏令时。

我真不敢相信我犯了这样一个愚蠢的错误!谢谢您!我做了必要的修改,现在工作得很好。

酷,如果它解决了你的问题,那么请接受答案。谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值