程序里的国际时区和夏令时

  • UTC和GMT到底是什么
      gmt和utc都是标准时间。
      GMT是比较古老的时间较量标准,根据地球公转自转计算时间。UTC则是根据原子钟来计算时间,现在基本都用UTC时间。
    时区的设置之前研究过https://java-er.com/blog/php-utc-time-default-set/,本文主要研究夏令时
  • 夏令时计算有几个坑,需注意:
  • 1) 时间服务器返回的时间为1900距今的秒数,而我们需要借助unix时间函数转为可读的时间 ,因此需要先把这个时间减去70年(2208988800s)。

    2) 夏令时的开始结束时间使用的是时区转化后的当地时间,因此时间服务器获取到的UTC时间需要转为本地时间,才能进行时间是否在夏令时区间的判断。

    3) 美国的夏令时,从每年3月第2个星期天凌晨开始,到每年11月第1个星期天凌晨结束。以2017年为例,美国2017年夏令时从3月12日开始,到11月5日结束。

    需要注意的是,美国有部分领土不实行夏令时,其中包括:亚利桑那州 (纳瓦霍人保留地除外)、夏威夷、美属萨摩亚、关岛、波多黎各、美属维京群岛。

    1. 数据库存储秒数的意义
      php的time() 返回1970年 0点到现在的秒数 java里也有。 这个秒数不随我们设置服务器时区而改变
      所以存储要存1501829643 这个玩意,而不是2020-02-01 03:40:58
    2. 程序里时区设置的意义
      当我们弄清楚存储了一个固定的值,那么时区只是展示问题。
      我是中国人在中国,那么程序设置为中国时区

    date_default_timezone_set("Etc/GMT-8");
    代表+8 区
    我是美国人在美国,那么程序设置为美国时区

    date_default_timezone_set("Etc/GMT+5");
    代表-5区

    为啥是反的,有人在官方聊过这个话题。

    http://www.php.net/manual/en/timezones.others.php
    The plus and minus signs (+/-) are not intuitive. For example,

    “Etc/GMT-10” actually refers to the timezone “(GMT+10:00)
    Canberra,Sydney,Melbourne”.

    程序的时区设计仅仅为了展示给客户看。

    1. 夏令时的秘密

    date_default_timezone_set("America/New_York");
    $time1 = date("Y-m-d H:i:s");
    $times1 = strtotime($time1);
    echo "纽约时区:".$time1." - ".$times1."<br>";
    echo "该时区使用夏令时:".date(‘I‘, time()).‘<hr />‘;

    $time = time()-23024*3600;//推算到1月
    $stime = strftime( "%Y-%m-%d %H:%M:%S" ,$time)."<br>";
    echo "60天前今天现在时间:".$stime;
    echo "该时区使用夏令时:".date(‘I‘, time()).‘<hr />‘;

    echo "<hr />";

    date_default_timezone_set("ETC/GMT+4");
    $time1 = date("Y-m-d H:i:s");
    $times1 = strtotime($time1);
    echo "GMT+4:".$time1." - ".$times1."<br>";

    echo "该时区使用夏令时:".date(‘I‘, time()).‘<hr />‘;

    $time = time()-23024*3600;//推算到1月
    $stime = strftime( "%Y-%m-%d %H:%M:%S" ,$time)."<br>";
    echo "60天前今天现在时间:".$stime;
    echo "该时区使用夏令时:".date(‘I‘, time()).‘<hr />‘;

    echo "<hr />";
    输出

    纽约时区:2020-03-30 03:31:27 - 1585553487
    该时区使用夏令时:1
    60天前今天现在时间:2020-01-30 02:31:27
    该时区使用夏令时:1
    GMT+4:2020-03-30 03:31:27 - 1585553487
    该时区使用夏令时:0
    60天前今天现在时间:2020-01-30 03:31:27
    该时区使用夏令时:0
    date_default_timezone_set("America/New_York");
    这个时区的设置会因为夏令时的原因,导致在冬季时间不一样

    date_default_timezone_set("ETC/GMT+4");
    这种设置模式,也代表了纽约,但是在时间不受到夏令时的影响而变化。

    结论:
    1.当为了给客户(纽约人)看时间,应采用America/New_York,

    2.当计算机为了跑一天的数据,比如今天卖了多少货物,应该用ETC/GMT+4 固定时间。不然那错开的1小时,我们计算给前一天,还是后一天,感觉都不太适合

    额外的小研究:

    date_default_timezone_set("UTC");
    这个UTC 好像是个什么标准玩意,当设置UTC+4 UTC-8的时候,程序输出时间没有改变,所以大家设置时区用ETC/GMT才能+4 -8

    https://java-er.com/blog/time-zone-summer-day/

    原文地址:https://blog.51cto.com/yuexiaosheng/2483162

    时间: 2024-10-18 21:18:23

    程序里的国际时区和夏令时的相关文章

    程序员如何处理好时区问题

    写国际化的程序,经常会遇到两种问题:字符编码.时间问题.今天我们就聊聊程序中如何处理时间问题. 首先,要了解一些基本的概念,只有对概念有清晰的掌握,才能明白解决方法. 基本概念 GMT时间:格林尼治标准时间(英语:Greenwich Mean Time,GMT)是指位于英国伦敦郊区的皇家格林尼治天文台当地的平太阳时,因为本初子午线被定义为通过那里的经线. 由于地球每天的自转是有些不规则的,而且正在缓慢减速,因此格林尼治平时基于天文观测本身的缺陷,已经被原子钟报时的协调世界时(UTC)所取代. U

    帮同事写了几行代码,在安装/下载程序里注册/卸载OCX控件

    写了个小控制台程序,这个程序用来注册 / 卸载OCX控件,用在Inno Setup做的安装卸载程序里. #include "stdafx.h" #include <windows.h> #include <iostream> using std::cout; using std::endl; using std::cerr; int _tmain(int argc, _TCHAR* argv[]) { __try { STARTUPINFO si1 = {siz

    在c或c+程序里打印调用栈。转

    在C/C++程序里打印调用栈信息 我们知道,GDB的backtrace命令可以查看堆栈信息.但很多时候,GDB根本用不上.比如说,在线上环境中可能没有GDB,即使有,也不太可能让我们直接在上面调试.如果能让程序自己输出调用栈,那是最好不过了.本文介绍和调用椎栈相关的几个函数. NAME       backtrace, backtrace_symbols, backtrace_symbols_fd - support for application self-debugging SYNOPSIS

    通过给程序里嵌入manifest,使得程序运行时弹出UAC窗口

    我们知道,当一个程序需要权限运行时,需要右键点击程序,然后使用管理员权限打开程序.另外,如果你用vc2008以上开发程序,可以在工程里选择uac,在生成的程序里,如果点击运行程序会弹出需要管理员权限运行程序的窗口. 现在可以通过把manifest嵌入普通程序里来达到这个效果. 现在说一下怎么样给一个普通的在单击运行时不会弹出需要管理员权限的程序增加这个功能. 1.假使这个普通程序名字为myapp.exe. 现在在程序的目录下编写一个manifest文件,命名为myapp.exe.manifest

    安卓教程:提取APK程序里图片资源的方法

    有些APK程序里的图标.图片很漂亮,在使用程序时你可能会想,如果能把这些漂亮的图标.图片提取出来就好了,其实这是可以办到的,请看教程. 本教程以“电影超人”的APK安装包为例,其它APK程序的提取方法基本相同.以下内容需要在电脑中进行操作. 1.用压缩软件打开APK APK程序其实就是个ZIP压缩包,想提取其中的资源就得先用解压缩软件将其打开,如图我们在APK安装包上右键.打开方式.选择压缩软件,我这里选择的是RAR,如果你安装的是其它的解压缩软件,选择它即可.如果你以前没有用压缩软件打开过AP

    oracle 数据库中,应用程序里的连接探测语句的正确使用

    本文为原创文章,转载请注明出处:http://blog.csdn.net/msdnchina/article/details/38513765 在很多程序里边,连接探测(或者连接检测)语句,都是用的select sysdate from dual; 这是典型的"只要功能实现,不管性能如何"的写法.其实,连接探测语句,应该用select 1 from dual; 也许有人说,程序员们很辛苦,能实现功能就不错了.但是,我想说的是:换用select 1 from dual;的写法,不需要把

    Log4.Net 在Winfrom、MVC、ashx程序里的使用,ashx程序里使用异步

    最近做一个双11活动的,是一套相关的H5页面.本来以为难度不大,但是做下来几天还是遇到些问题.就总结一下吧,还是有收获的. 1.在H5页面中,有一个遮罩层,还是挺有意思的.直接用div+css控制遮罩层页面. <!DOCTYPE html > <head> <title>DIV CSS遮罩层</title> <script language="javascript" type="text/javascript"&

    Python程序里的注释和#号

    Python程序里的注释是很重要的.它们可以用自然语言告诉你某段代码的功能是什么.在你想要临时移除一段代码时,你还可以用注解的方式将这段代码临时禁用.接下来的练习将让你学会注释 : # A comment, this is so you can read your program later.# Anything after the # is ignored by python.print "I could have code like this." # and the comment

    【实战问题】【11】增删改查在SQLServer客户端都是正常的。但在程序里用mybatis的时候,新增会失败

    前言: 我的情况和参考博客里的是一样的,所以此处仅做备份. 增删改查在SQLServer客户端都是正常的.但是在程序里用mybatis的时候,只有删改查是正常的,新增会失败.报错:17023 不支持的特性 正文: 检查jar包 oracle的jdbc驱动有很多版本,jdk1.5的驱动是classes12.jar,而jdk1.6(也就是官方所说的6.0)的驱动就是ojdbc6. 根据自己的情况选择合适的jar包,且不要把两个jar包都放进去 参考博客: myBatis+oracle11g inse