原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。

今天清理邮件,发现这样一条垃圾信息。虽然美股最近的表现很暴躁,但我没有银子花在这无聊的事情上。我有一笔钱,蹲在A股的一只退市股上。由于亏的太多,所以现在只剩下梦想。

这条信息让我感兴趣的是,夏令时。我曾从很多地方看到过这个词,它总让我想到火热浪漫的海滩,撅着屁股晒太阳的美女,以及被暴力甩起又被摔碎的浪花。

魔幻的时间

关于时间的问题,首先让我们看一段神奇的代码。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String sTime = "2020-03-08 00:00:00";
sdf.setTimeZone(TimeZone.getTimeZone("America/New_York"));
TimeZone.setDefault(TimeZone.getTimeZone("America/New_York"));Date time = sdf.parse(sTime);
System.out.println(time.getTime());
System.out.println(time);
Calendar cd = Calendar.getInstance();
cd.setTime(time);// 2小时以后是几点?cd.add(Calendar.HOUR, 2);
time = cd.getTime();
System.out.println("------------------------------");
System.out.println(time.getTime());
System.out.println(time);

我们从字符串生成了一个时间,就是上面邮件提到的时间。然后在此基础上加上了2个小时。结果运行的时候,神奇的事情发生了:打印结果显示,两个时间之间的差距是3个小时!

有图为证。

真是见鬼。

这是时间魔幻性的一面。

夏令时会导致某一天多出一个小时,或者少出一个小时。

要了解夏令时,就首先需要了解时区的概念。在《时间的秩序》一书里,讲解到时区的诞生其实是多种方案权衡的结果。最终全球被分为24个时区,每个时区跨经度15°。

其中,北京时间,是中国采用国际时区东八时区的区时作为标准时间,也是我们现在用的时间,但它的位置是在山西蒲城。

但在清代,却是用北京中轴线上的鼓楼作为标准时间的。xjjdog在那里呆过一段时间,是一个非常美丽幽静的地方。

时间计时

扯了这么多没用的,我们来看一下常见的GMT和UTC。

一般对UTC和GMT的介绍都比较晦涩,我们平常在代码中遇到的时间有4种,下面以人话进行说明。

GMT

格林尼治标准时间,是指位于伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。

为什么它就能成为本初子午线,这不是地理原因,是历史原因。要是我有话语权的话,我会将神奇的百慕大三角,如今的西经64°45′,定为0度。

UTC

UTC一般和GMT视为无差别的表示方法。但GMT是以地球自转来计时的,这个庞然大物并不是那么准确。

UTC是原子时计时,更加可靠。每年格林尼治天文台会发调时信息,就是基于UTC的。

所以你现在看到的GMT,是旧世界的计时方法,最先进的计时,就是UTC。

协调世界时是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统。(这里面涉及到稳定的原子辐射,比地球的自转更加准确)。

UTC原子钟放在美国科罗拉州博尔德市,最先进的铝离子光钟每237亿年偏差一秒!谁能等到这一天别忘了把我从时光里挖出来。

Unix Time

Unix时间戳。是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。

意思就是,1970年前的时间戳,是负数。

为什么是1970?因为早期的机器都是32位的。用32位来表示时间的最大间隔是68年,而最早出现的UNIX操作系统考虑到计算机产生的年代和应用的时限综合取了1970年1月1日作为UNIX TIME的纪元时间。

夏令时DST

下面提到该死的夏令时。这是一个人为规定的时间。

一般在天亮的早的夏季,人为将时间调快一小时。这样可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。全世界有近110个国家每年要实行夏令时。

它又称“日光节约时制”和“夏令时间”,在这一制度实行期间所采用的统一时间称为“夏令时间”。

时间本来就是一个抽象的,看不见摸不着的东西。就连我们的钟表,也会在极限情况下失真。夏令时让时间更加复杂了一些。

影响

我们可以通过代码发现以下有悖常理的事情:

1)每一天并不总是有24小时,它还有可能是23,有可能是25。
2)Date日期处理类打印的并不总是如我们所愿。

public static void dayTime(TimeZone timeZone) {SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println("Time Zone is " + timeZone.getDisplayName() + " " + timeZone.getID());Calendar start = Calendar.getInstance(timeZone);//UTC 1970-01-01start.setTime(new Date(0));System.out.println("start=" + fmt.format(start.getTime()));//current timelong end = Calendar.getInstance(timeZone).getTimeInMillis();boolean find = false;for (long i = start.getTimeInMillis(); i < end; i = start.getTimeInMillis()) {start.add(Calendar.DATE, 1);if ((start.getTimeInMillis() - i) % TimeUnit.DAYS.toMillis(1) != 0) {find = true;System.out.println("from " + fmt.format(new Date(i)) +"to " + fmt.format(start.getTime()) +" has " + (start.getTimeInMillis() - i) + "ms" +"[" + (start.getTimeInMillis() - i) / (3600 * 1000L) + "hours]");}}if (!find) {System.out.println("Every day is ok.");}
}

代码显示,在中国1986-1991年的这段时间里,一天并不总是有24个小时。

这些肯定是属于比较个性化的数据了。那么,这些数据是从什么地方获取的呢?我们跟踪代码,可以发现sun.util.calendar.ZoneInfo 类。而操作系统存放了每一个时区的具体配置文件,通过它们的配合,就能完成不同地域不同时间的展示。

因为时区问题造成的BUG是时有发生的,尤其是国际项目。由于时区的不同,有可能在录入部分人的出生日期时,会发现多了或者少了一天!比如中国,出生在1986-1991年的这些人,就可能碰到这种幽灵问题。

这一区间的小伙伴注意了,在某一刻,虽然活着,你可能并不存在!

各种时间表示这样转来转去的,总是让人头晕。好的办法就是,把所有的时区,调整成一致的。甚至是mysql,也提供了serverTimezone参数来进行统一协调。

&serverTimezone=Asia/Shanghai

JVM也提供了参数。

-Duser.timezone=GMT+8

几乎每个地方都充斥着这该死的timezone。是我们太弱小了,连个地球都没统一起来。

实际上,夏令时在中国,从1986-1992只实行了6年,之后就取消了。真是谢天谢地,每一天可以踏踏实实的睡觉,不用担心这些灵异事件了。

加上科技的发达,城里6点就亮起了霓虹灯。哪里还有什么白天黑夜。是时候全部取消夏令时了,可惜我说了不算(狗头保命)。

End

下次要是有人问你,一天有24个小时么?不要像刚认识数字的小学生一样,行高彩烈的喊是。由于夏令时的加入,可能在你眨一下眼睛之间,“一个小时”就过去了。

时间是个相对的产物,不同的人有不同的看法。比如,空姐的手表,总是比你的走的慢一些—这就是她们年轻一点的原因。

随着我们对世界的了解,很多以前坚定不移的认为对的事情,已经慢慢的开始腐烂变质。我们只是习惯,但事实从未变过。

就如同你认为现在打字的我是个程序员,但实际上我是一只狗。

意识形态的东西,谁能说得清呢。

近期热门文章

《996的乐趣,你是无法想象的》
魔幻现实主义,关爱神经衰弱

《一切荒诞的傲慢,皆来源于认知》
不要被标题给骗了,画面感十足的消遣文章

《必看!java后端,亮剑诛仙》
后端技术索引,中肯火爆。全网转载上百次。

《学完这100多技术,能当架构师么?(非广告)》
精准点评100多框架,帮你选型

作者简介:小姐姐味道  (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,进一步交流

一天有24个小时?别开玩笑了!相关推荐

  1. 新一代iPad当做WiFi热点 可续航24个小时

    众所周知新一代iPad是可以当做个人移动热点供其它设备无线上网.然而这个4G热点功能会否很耗电,一共能续航多久能?苹果官方并没有给出具体的数据.不过根据AnandTech的测试和TheVerge的证实 ...

  2. 观点| 如何避免GitHub那样断网43秒瘫痪 24 个小时?

    小蚂蚁说: 蚂蚁金服自研的金融级分布式关系型数据库OceanBase的高可用及容灾能力在发生城市级故障时,让系统秒级完成智能切换,实现自愈,用户的资金.数据0丢失(新来的同学可以移步<现场剪光缆 ...

  3. Java数字电影24个小时_java电影网站开发经验4

    网站建成后,剩下的就是推广了,.百度找了很多资料,大部分就是说去论坛,博客,等能写评论,文字的地方进行推广.然后我就按照网上说的去做了.首先想到的当然是百度贴吧,开始在上面留言,然后加上自己的网站地址 ...

  4. 1000瓶毒药里面只有1瓶是有毒的,毒发时间为24个小时,问需要最少需要多少只老鼠才能在24小时后试出那瓶有毒。

    答案是最少10只. 看了网上很多解释(思考方向都不一样). 这里直接上图就知道了. 老鼠的编号,就相当于一个二进制bit位. 喝和不喝酒代表1喝0. 对于二进制占位,死亡和存活的排列组合就是唯一的.

  5. googleearthpro打开没有地球_人在月球上睡24小时, 相当于地球多少年? 科学家的回答出乎意料...

    亲,阅读本文前,请您先点击上面"关注",这样您就可以继续免费收到每天分享的精彩文章了,好文章我们齐分享,星星之火可以燎原,您的支持是我们最大的动力!谢谢 从许多古时候的一些故事和传 ...

  6. JS实现动态显示当前时间(12/24小时制)(转载Mr.Think)

    今天又要用到动态显示当前时间,且要求可以切换24/12小时制, 记得很久前写过一个24小时制的,但一时没能找着, 于是又重新写了个,若有需要的朋友自行复制粘贴一份吧. 很简单的一个功能函数,实现方式不 ...

  7. NBA Top Shot过去24小时二级市场交易额突破630万美元

    1月26日,基于Flow区块链的游戏NBA Top Shot公布了近期销售数据:过去24个小时的二级市场销售额超过630万美元,历史总销售额超过3000万美元,售出两个价值10万美元的NBA球员NFT ...

  8. 历经24小时,依靠全球定位,帮女朋友找回丢失的华为手机!

    本人很少写非技术文章,由于这两天找回手机的经历过于魔幻,所以必须分享一波.手机丢了金钱的损失先不说,但是里面的资料都是无比重要的,正好自己亲身经历,并且也成功找回了手机,索性就把经验分享一下,希望能给 ...

  9. 我在Flutter的前24小时

    Last weekend, I decided to re-structure my depth year and go on a learning adventure. I asked myself ...

最新文章

  1. 浙江大学软件学院2020年保研上机模拟练习 7-4 Shopping With Coupons
  2. 11gR2 grid安装最后报错[INS-20802] Oracle Cluster Verification Utility failed
  3. html2canvas导出地图,Leaflet OpenStreetMap使用html2canvas使用地图标记导出图像
  4. hdu2066一个人的旅行(多源点多汇点的最短路径问题)
  5. git-比对不同-diff
  6. Altium Designer(六):Make Library
  7. PyQt5实现软键盘
  8. Android高手笔记-包体积优化
  9. html修改img图片颜色,html中img图片设置透明度的方法
  10. APK Multi-Tool强大的APK反编译工具终极教程
  11. mysql 初始化my.cnf_my.cnf初始化配置
  12. php万能每亩,PHP 实现“万能”的短网址还原
  13. Qt-qmake install相关
  14. 14个同陌路人匿名聊天在线工具排除你的寂寞和无聊
  15. redhat7.7的下载与安装(最快)
  16. GifCam – 更好用的 gif 动画录制/剪辑工具
  17. 【大数据】MaxCompute概述
  18. Vue-js 零基础 国外案例 DEMO 全课程讲解 3 我是---- 静静
  19. Azkaban 3.62 安装
  20. 微信开放标签wx-open-launch-weapp实现点击跳转到微信小程序

热门文章

  1. vue项目中创建全局组件
  2. 代替网易见外的智能语音识别转换字幕工具
  3. css实现多行省略号
  4. 分布式事务是什么?如何实现?
  5. C++ Http Server 开源库(汇总级整理)
  6. 【PHP】PHP基本语法、PHP的数据类型、PHP数据的输出
  7. html 当前域名,js 获取当前网站域名的方法
  8. 新编组织行为学作业 (3)
  9. 一文讲解Vuex实现原理
  10. java生日提醒_生日提醒功能-SQL查询语句在Java中肿么运用?