时间漫谈:时区 / 日历 / 计算机简单粗暴处理

更多
2021年08月27日 09点27分 作者:叶飞 修改

时间是什么?——这是一个哲学问题


千年虫问题

千禧年前后出生的青少年们或许很少有人知道“千年虫”。

大约在 20 世纪 80 年代中期以前投用的系统上,囿于存储空间有限,再加上人们普遍觉得系统更新会很快,所以程序员大多采用两位数来表示年份,比如 06/15/98,而不是 06/15/1998。但是到了 2000 年,系统只知道是 01/01/00,不知道这是 1900 还是 2000。

嗯,总有一天,程序员会毁灭地球的。


严谨的新闻播报

今天是2021年8月27日,农历七月二十

当地时间晚8点

说明了什么问题?

  • 历法:(太)阳历/阴(月亮)历,以及阴阳历。具体又细分:公(基督)历、中国农历、印度历、伊斯兰历、犹太历……
  • 时区:请复习地理知识。@想一想@:北京时间是不是就是北京时区?

还有什么干扰项?夏令时。(我国从1986年到1991年)

爽不爽,惊喜不惊喜?

标准时

  • GMT(Greenwich Mean Time):格林威治标准时间
  • UTC(Coordinated Universal Time):世界协调/标准/统一时间,以格林威治时间GMT为标准,进行修正后的新时标,比GMT来得更加精准
  • ISO8601标准:是日期和时间的表示方法。统一按年月日小时分钟秒这个顺序写,不要乱七八糟的:12:03 27/8/2021,或者12:03 27/08/2021,再或者 27/8/2021 12:03……

以上,就给我们编程使用时间带来了麻烦。


时间戳

计算机的处理简单粗暴:

  1. 万物皆可二进制
  2. 用一个整数记录:和GMT 1970年1月1日凌晨零点(UNIX时间原点)之间的(豪)秒数差

这样做有两个问题:

  1. 1970年之前的时间咋办?凉拌。打补丁呗,一些软件又推出了1900年1月1日,或者0000年01月01日为原点的时间类型数据。那么系统和系统之间的转换就又是一个问题。
  2. 32位的操作系统,最多能记录的时间2038年就要到期了,咋办?

@想一想@:为什么不用字符串?因为日期要进行计算!

PS:此外时间戳还有时间电子认证的含义,此处略过。


时间类

几乎所有编程语言都内置了时间(包含年月日的日期,和小数分钟数的时间,比如Date/DateTime/Calendar)类,封装了和时间运算相关的各种属性和方法。一般包括:

  • 获取当前时间,设定一个时间
  • 获取某个时间的年月日、星期几、小时分钟数等的属性
  • 获得某个时间若干时间段之前/后的方法,
  • 两个时间点之间的比较,获取其间时间段
  • 日期和字符串之间的转换
  • 各个时区、日历间的转换
  • ……

我们尽量使用内置时间类来完成相应功能。


作业

  1. 读懂千年虫问题的报道,为什么2020年和2038年我们仍然会面临问题?
日期 时间
赞: 0 踩: 0

打赏
已收到打赏的 帮帮币

你的 打赏 非常重要!
为了保证文章的质量,每一篇文章的发布,都已经消耗了作者 1 枚 帮帮币
没有“帮帮币”,作者无法发布新的文章。

全系列阅读
评论 / 0

编程基础


项目管理相关

需求发布、开发规划、部署、测试,源代码版本管理(git)等……

逸闻史话

认识计算机

编程语言

数据结构和算法

Web开发基础

全部
关键字



帮助

反馈