时间是什么?——这是一个哲学问题
严谨的新闻播报
今天是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……
以上,就给我们编程使用时间带来了麻烦。
千禧年前后出生的青少年们或许很少有人知道“千年虫”。
大约在 20 世纪 80 年代中期以前投用的系统上,囿于存储空间有限,再加上人们普遍觉得系统更新会很快,所以程序员大多采用两位数来表示年份,比如 06/15/98,而不是 06/15/1998。但是到了 2000 年,系统只知道是 01/01/00,不知道这是 1900 还是 2000。
嗯,总有一天,程序员会毁灭地球的。
时间戳
计算机的处理简单粗暴:
-
万物皆可二进制
-
用一个整数记录:和GMT 1970年1月1日凌晨零点(UNIX时间原点)之间的(毫/微/纳)秒数差
这样做有两个问题:
-
1970年之前的时间咋办?凉拌。打补丁呗,一些软件又推出了1900年1月1日,或者0000年01月01日为原点的时间类型数据。那么系统和系统之间的转换就又是一个问题。
-
32位的操作系统,最多能记录的时间2038年就要到期了,咋办?
PS:此外时间戳还有时间电子认证的含义,此处略过。
时间类
@想一想@:能不能用一个字符串来表示时间?
几乎所有编程语言都内置了时间(包含年月日的日期,和小数分钟数的时间,比如Date/DateTime/Calendar)类,
封装了和时间运算相关的各种属性和方法。
一般包括:
-
获取当前时间,设定一个时间
-
获取某个时间的年月日、星期几、小时分钟数等的属性
-
获得某个时间若干时间段之前/后的方法,
-
两个时间点之间的比较,获取其间时间段
-
日期和字符串之间的转换
-
各个时区、日历间的转换
-
……
我们尽量使用内置时间类来完成相应功能。
作业
-
读懂千年虫问题的报道,为什么2020年和2038年我们仍然会面临问题?
----- 以下分别用Java/C#/JavaScript实现 -----
-
“一起帮”为了反爬虫访问,限定了用户的查询次数,即:每5分钟内最多不能访问超过若干个页面。请设计一个函数hasExpired(last),能够检查当前时间是否已超过上次记录时间(last)5分钟
-
类似第1题,“一起帮”还会检查用户上次登录是否已过24小时,请设计一个函数 isNewLogin(last)完成检查。
-
生成一个函数toChinese(),可将传入的日期参数(如:new Date())转换成中文日期格式(如:2019年10月4日 16点54分)
-
源栈的学费是按周计费的,所以请实现这两个函数:
-
GetDate(),能计算一个日期若干(日/周/月)后的日期
-
ShowWeeksIn()给定任意一个年份,就能按周排列显示每周的起始日期,例如:
第1周 2021年1月2日 - 2021年1月8日
第2周 2021年1月9日 - 2021年1月15日
……
……
第x周 2021年12月x日 - 2021年12月28日