`
OrangeHolic
  • 浏览: 260933 次
  • 来自: 北京
社区版块
存档分类
最新评论

PHP环境时区设置成Asia/Chongqing导致的一个bug

    博客分类:
  • PHP
 
阅读更多

        得到某个时间戳所对应的日期的0时在这边的数据统计中经常用到,如得到1409144737(2014/8/27 21:5:37)的0时1409068800(2014/8/27 0:0:0),可用的方法也比较多,在这里介绍常用的三种: 
     1.mktime函数方式 
  

Java代码  收藏代码
  1. $time =1409144737;  
  2.    var_dump(date('Y-m-d H:i:s',mktime(0,0,0,date('m',$time),date('d',$time),date('Y',$time))));  


     2.strttime函数方式 
    

Java代码  收藏代码
  1. var_dump(date('Y-m-d H:i:s',strtotime(date('Y-m-d 00:00:00',$time))));  


     
       因为上面两种方式调用多个函数得到结果,执行有点缓慢,效率不高,所以通过规律找到另一种方式,整除的方式。原理就是通过整除计算出今天已经过去的秒数,在计算过程中需要+8个小时,因为我们为东八区,比$time表示的实际秒数多8个小时。 
     3.整除方式 

Java代码  收藏代码
  1. var_dump(date('Y-m-d H:i:s',$time - ($time+8*60*60)%86400));  



通过执行10W次调用,以上三种方式分别花费30s、50s、14s,第三种方式效率还是蛮OK的。 

但是上线一段时候,测试提给我们一个bug,就是如果选择1975年的某时间戳会出现日期错误的bug,然后我们重现了这个bug 

    

Java代码  收藏代码
  1. $time = 321001200;//1980/3/4 15:0:0  
  2.      var_dump(date('Y-m-d H:i:s',$time - ($time+8*60*60)%86400));  


      输出结果竟然是:1980-03-03 23:00:00,其他两种方式皆是正确的1980-03-04 00:00:00 
后来发现只在1980年5月以后的结果是正确的,而之前的都少了一个小时; 然后我看查看PHP的配置date.timezone = Asia/Chongqing,当换成PRC的时候,所有时间段都正确 ;至此bug其实解决了,让运维把线上600机子的配置进行修改,但是为啥呢,我们推测1980年的5月一定发生了啥事情吧,然后都按照GMT+8计算了 

分享到:
评论

相关推荐

    linux 时间和时区设置

    设置时区和同步时间 tzselect  TZ=’Asia/Shanghai’; export TZ 修改时区 vi /etc/sysconfig/clock ZONE=Asia/Shanghai mv /etc/localtime /etc/localtimebak ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/...

    openwrt知识总结(ntp时间同步+时区设置)

    OpenWRT 是一个基于 Linux 的嵌入式操作系统,广泛应用于路由器和其他嵌入式设备中。由于 OpenWRT 的广泛应用,因此设置正确的时间同步和时区变得非常重要。下面将详细介绍 OpenWRT 中的 NTP 时间同步和时区设置。 ...

    Linux修改系统时区

    `tzselect` 是一个交互式的命令行工具,用于设置系统时区。用户可以通过简单的菜单选择来完成时区的更改。 ```bash # tzselect ``` 运行此命令后,根据提示选择合适的地区、城市等信息,最后确认即可完成时区的...

    js 根据本地时区获取 当地时间

    这里,`tz`方法接受一个时区字符串,然后返回一个基于该时区的`moment`对象。 为了确保在全球范围内正确处理时区,还需要考虑夏令时(DST)。JavaScript的`Date`对象会自动处理大部分地区的夏令时,但并非所有时区...

    时区设置代码-一个完整的C++类

    本文将深入探讨“时区设置代码-一个完整的C++类”的相关知识点,包括`SetTimeZoneInformation`函数的使用、注册表操作以及如何在C++中实现这些功能。 `SetTimeZoneInformation`是Windows API提供的一个函数,用于...

    解决win7中时间和时区无法修改Time-Zones

    "Time Zones.reg"文件通常是一个注册表导入文件,用于修复与时区相关的注册表项,从而解决此类问题。 Windows中的时区设置是通过“控制面板”中的“日期和时间”功能进行的,它允许用户根据所在的地理位置调整系统...

    docker中时区问题的处理方法

    这段Dockerfile代码不仅设置了TZ环境变量,还创建了一个软链接,确保`/etc/localtime`指向正确的时区文件,并写入`/etc/timezone`以记录当前时区。 总结来说,处理Docker容器的时区问题,关键是理解和利用glibc的TZ...

    解决linux环境下时区无法设置的问题

    在进行linux下修改时区的时候总是修改不了 修改成 Asia/Shanghai 但是 时区总是 +0000 却不是想要的+0800 按照网上的方法 A : tzselect:执行tzselect命令–>选择Asia–>选择China...ln -sf /usr/share/zoneinfo/Asia/

    Linux修改时区和时间

    1. 手动修改时区:可以通过找到相应的时区文件 /usr/share/zoneinfo/Asia/Shanghai,并将其替换当前的 /etc/localtime 文件。此外,还可以使用 scp 命令从标准时间服务器上复制时区文件。 2. 使用图形化命令:可以...

    PHP中设置时区方法小结

    这两个函数都接受一个时区标识符作为参数,如`Asia/Shanghai`,`Asia/Chongqing`,`Asia/Urumqi`等。这些标识符遵循国际标准,如`Asia/Hong_Kong`代表香港,`Asia/Macao`代表澳门,`Asia/Taipei`代表台北,`Asia/...

    PHP中遇到的时区问题解决方法

    在使用PHP进行Web开发的过程中,时区问题是一个经常遇到并且容易影响程序输出结果的问题。PHP中的时间函数默认采用的是格林威治标准时间(GMT)...在进行Web开发时,合理设置时区是确保时间数据准确性的一个重要步骤。

    OpenERP时区Bug解决注册表文件

    然而,这是一个高级操作,通常只在Windows环境下进行,且需谨慎处理,以免破坏系统。 提供的压缩包文件“OpenERP时区Bug解决注册表文件附说明”可能包含特定的注册表键值修改,这些修改可能有助于解决Windows服务器...

    android时区

    Android 时区设置 Android 时区设置是 Android 操作系统中的一项重要功能,允许用户根据...Android 时区设置是一个重要的功能,能够影响用户的日常生活和工作。用户需要正确地设置时区,以便更好地适应自己的需求。

    补全win7时区设置

    在本案例中,我们有一个名为"时区补全.reg"的文件。这实际上是一个注册表脚本文件,用于导入新的时区信息到系统的注册表中。要使用这个文件,你需要按照以下步骤操作: 1. **安全提示**:在执行任何对注册表的操作...

    PHP获取当前时间不准确问题解决方案

    关于timezone 大陆内地可用的值是:Asia/Chongqing ,Asia/Shanghai ,Asia/Urumqi ,PRC(依次为重庆,上海,乌鲁木齐,中华人民共和国)港台地区可用:Asia/Macao ,Asia/Hong_Kong ,Asia/Taipei (依次为澳门,...

    c# 获取设置时区SetTimeZoneInformation

    例如,如果你想将系统时区设置为"中国标准时间",你可以先创建一个`TimeZoneInformation`实例,填充相应字段,然后调用`SetTimeZoneInformation`: ```csharp var timeZone = TimeZoneInfo.FindSystemTimeZoneById...

    有关 PHP 和 MySQL 时区的一点总结

    在PHP和MySQL的应用中,时区的设置是一个关键的细节,尤其对于处理日期和时间的准确性至关重要。在本文中,我们将深入探讨如何在PHP和MySQL中进行时区的配置和调整,以及解决与之相关的一些常见问题。 首先,让我们...

    centos修改时区1

    如果时区设置不正确,可能会导致系统时间出错,影响系统的稳定性和可靠性。因此,在设置时区时,需要格外小心和细致。 常见的问题 * Q: 如何查看系统当前的时区? A: 使用`timedatectl`命令可以查看系统当前的时区...

Global site tag (gtag.js) - Google Analytics