
时间格式概述
衍生自语言C的编程语言C++、Java、JavaScript、Python等均采用一致的时间格式。我们以C的strftime函数为例。
查阅手册,满屏的格式,读得人头晕目眩。

以上格式,依照循序渐渐的策略,将其分为9个变量和4个大类,概括如下:

第一行的常规符号
1.1 宏观尺度:年月日
宏观尺度下的年(year)月(month)日(day),全部取其首字母,并且是小写的形式。
$ date +"%y-%m-%d"20-06-12
不足之处是年度只有两位数字。
1.2 微观尺度:时分秒
微观尺度下的时(Hour)分(Minite)秒(Second),也是取首字母。与年月日不同的是,首字母都为大写。
$ date +"%H:%M:%S"09:27:19
输出的是24小时制的时间。
组合宏观与微观尺度:
$ date +"%y-%m-%d %H:%M:%S"20-06-12 09:28:49
1.3 中观尺度:周几与周数
周几(Weekday)与周数(Week Number)同样取其首字母,其一为小写,其二为大写。
$ date +"%w" #周几?5
需要注意的是周日是起始点记为0。
1.4 地理尺度:时区
时区(timezone)度量的是我们的地理坐标,取Zone的首字母 z
$ date +"%z"+0800
输出当前在东八区。
1.5 小结第一行
时间9个变量,按照宏观、微观、中观和地理尺度分类四类,即:年月日/时分秒/周几周数/时区。
如果我们自己设计创造时间格式的符号,仅仅从直觉出发也会采用第一行中思路,以首字母指代。
第二行的简单扩展
第二行弥补首行的不足,作简单的扩展和修正。
2.1 四位数字的年份
宏观尺度下的年月日均为小写字母,优化年份只有两位数字的问题,只能打破这一原则,因引入大写字母Y(Year)。
$ date +"%Y-%m-%d"2020-06-12
2.2 12小时制
%H 是24小时制,H 的后一个英文字母为 I。于是以 %I 表达12小时制,同时用 %p(postnoon) 代表上下午的划分。
$ date +"%I:%M:%S %p"10:04:50 AM
注意到 %I 遵照了微观尺度的管理,是大写的形式;而 %p 却是小写的形式。我们可以理解为 %p 是宏观尺度上的半天,因此遵循’年月日‘格式的惯例。(大写的 %P 输出小写的 am和pm,大写却输出小写,比较违反直觉,略去不提)。
2.3 小结第二行
打印第二行的完整格式为:
$ date +"%Y-%m-%d %I:%M:%S %P"2020-06-12 10:09:20 AM
第三行的文字描述
第三行最有意思,有且仅有三个时间变量能用文字描述,分别为字母表的头两个字幕a与b,和字母表的最末一个字幕 Z。
A,B分别表示周天和月份,Z是时区的文字描述。
$ date +"%A %B %Z"Friday June CST$ date +"%a %b %Z"Fri Jun CST
CST是 China Standard Time的缩写。
此时,我们查看著名的C语言的ctime时间格式:
In [2]: time.ctime()Out[2]: 'Fri Jun 12 10:17:50 2020'
我们可以表示为:
$ date +"%a %b %d %H:%M:%M %Y"Fri Jun 12 10:20:20 2020$ date +"%c"Fri 12 Jun 2020 10:23:04 AM CST
第四行的晦涩扩展
此处的晦涩一是指所用的字幕与其英文含义没有关联,二是平常用得不多的格式。
4.1 年份与计日
%C 指代四位数字的前两位,补全了两位数的 %y。%q(quater)表示季度。%j 计算一年过去了多少天。
$ date +"现在是%C%y年的第%q季度,一年中的第%j天"现在是2020年的第2季度,一年中的第164天
4.2 微秒
微秒的英文是 millisecond,与 %f 没有关系。此处我们将 %f 理解为 fly,时光飞逝。
4.3 周天与周数的问题
第一行的 %w 打印周日为 0,用与w紧挨着的前一个字母 u 解决这个问题。
$ date -d "2 days" +"两天后的周日是一周的第%u天"两天后的周日是一周的第7天$ date -d "2 days" +"两天后的周日是一周的第%w天"两天后的周日是一周的第0天
周数中的%W是以周一为一周的起点,并且从第00周开始计算;
W的前一个字母V,%V同样以周一为一周的起点,但从第01周开始计算;
再前一个字幕U,%U却是以周日为一周的起点,从第00周计算。
换言之,这三个选项,我们用得最多的是 %V。
总结
本文的写作初衷是经由循序渐进的逻辑思路整理所有的时间格式,最终达到看一眼就能了然于胸,无需再耗费精力刻意记忆或者投入时间查阅手册的目的。
尝试解析命令date的标注输出
$ dateFri 12 Jun 2020 11:06:43 AM CST
解析为:
$ date +"%a %d %b %Y %I:%M:%S %p %Z Week-%V day-%j"Fri 12 Jun 2020 11:10:36 AM CST Week-24 day-164
整理表格如下:
