Linux date命令-d、--date选项接受的时间描述字符串的格式详解
Linux的date命令非常复杂,尤其是-d(--date)选项接受的时间描述字符串更是非常的丰富,使用起来非常灵活。
通用日期语法
日期可能是一个空字符串,也可能包含许多由空格分隔的项。如果项之间不会产生歧义,空格也可以省略。空字符串表示当天的开始。字符串中项的顺序没有限制。一些序数可以在某些上下文中用文字写出。在最常用的序数中,“last”代表-1,“this”代表0,“first”和“next”都代表1。因为“second”代表时间单位,所以序数2不能用文字表示,但是其他的3、4、5、6等分别可以用“third”、“fourth”、“fifth”、“sixth”等表示。目前只支持英文的单词和缩写,如:“AM”、“DST”、“EST”、“first”、“January”、“Sunday”、“tomorrow”、“yesterday”和“year”。date命令的结果不总是可接受的字符串,除了语言问题之外,还与时区项如“IST”没有标准含义有关。所以如果想要使用date命令生成后续用于解析的日期字符串时,需要制定独立于语言的日期格式,并且不使用“UTC”和“Z”以外的其他时区。在日期中完全忽略字母大小写。目前没有后跟数字的连字符会被忽略。数字的前导0也会被忽略。
日历项
日历项指定一年中的某一天。指定方式取决于月份是用数字还是文本指定的。
1.对于数字月份,允许ISO8601格式“year-month-day”,year是任意正整数,month为01-12,day为01-31。如果数字小于10必须有前导0。如果年份小于等于68,则会加上2000,如果年份大于68小于100,则会加上1990。日期格式“month/day/year”在美国很流行,还可以将年省略“month/day”。
3.文本月份可以全拼,也可以以前三个字母(或后面再跟一个“.”)为缩写表示。其中九月September除了缩写Sep外,还有一个Sept。当月以文本表示时,允许的格式有:“day month year”、“day month”、“month day year”、“day-month-year”、“month day”。
#以下日期均表示2019年01月18日
2019-01-18 #ISO 8601格式
19-1-18 #年小于69,会加上2000
19-01-18 #前导0会被忽略
1/18/19 #美国格式
1/18 #美国格式
18 January 2019 #月份用文本表示
18 Jan 19 #月份用文本表示
18 Jan. 19 #月份用文本表示
Jan 18, 2019 #月份用文本表示
18-Jan-19 #月份用文本表示
18Jan19 #月份用文本表示
Jan 18 #月份用文本表示
时间项
时间项用于指定给定日期的时间。
1.通常时间格式为“hour:minute:second”,hour为0-23,minute为0-59,second为0-59(或者后面跟着“.”或“,”再加包含一到多个数字的小数部分)。当second为0时,可以选择省略“:second”部分。在极少数支持闰秒的主机上,秒可能会是60。
2.如果时间后面跟着“am”(“a.m.”)或“pm”(“p.m.”),hour则被限制为1-12,当minute为0时,可以选择省略“:minute”部分。如果使用这种表示方式,午夜是“12am”,中午是“12pm”。
3.时间后可以跟随时区进行校正。时区校正格式为“shhmm”,s为“+”或“-”,hh是时区小时数,mm是时区分钟数。一位数或两位数会被解析为小时数进行校正,分钟数被省略。还可以使用“:”将hh和mm分隔开。当以这种方式给出时区校正时,时间会被强制相对于UTC时间进行解析,会覆盖之前指定的时区。最大区域校正为24小时。“am”(“a.m.”)或“pm”(“p.m.”)不能与时区校正同时出现。
#以下时间均表示22时16分
22:16:00.000000 #常用格式
22:16 #秒为0时可省略
10:16pm #使用am/pm格式
22:16+0800 #使用时区校正(东八区时间)
时区项
时区项指定国际时区,用一组字母表示时区。通过在非夏令时时区后用空格分隔后跟随“DST”,可以指定相应的夏令时时区。或者可以在非夏令时时区后跟随时区校正,将两个值相加。通常只使用与UTC时区,比如“UTC+05:30”等效于“+05:30”。如果没有提供时区项或时区校正,则使用默认时区的规则解析时间。除“UTC”与“Z”以外的时区项已过时,不推荐使用,因为它们的含义不明确。最好是使用时区校正。
日期和时间合并项
ISO 8601日期时间扩展格式包含ISO 8601日期、分隔符“T”和ISO 8601时间。 分隔符还是可以是空格。这种格式中,小时需要使用24小时制,秒可以是分数(小数与整数部分用逗号或点分隔),小时和分钟不可以是分数。通常,主机支持纳秒时间戳分辨率;多余的精度会被悄悄丢弃。
2019-01-18T22:16:00.0865+08:00
2019-01-18T22:16:00,86442-07:00
2018-12-12 18:23Z
星期项
明确地提到一周中的某一天将会把日期(仅在必要时)提前到将来的那一天。一周中的某天可以用全拼表示,也可以以前三个字母(或后面再跟一个“.”)为缩写表示。其中周二还可用缩写“Tues”表示,周三还可用缩写“Wednes”表示,周四还可用“Thur”或“Thurs”表示。还可以在周的天之前加上数字来向前推进日期。比如“fifth Wednes”,表示指定日期后的第5个周三。由此“”星期的天后面的逗号会被忽略。还可以用“last”、“next”表示前一、后一,如“last Sun.”表示指定日期的前一个周日。
fifth Sun #第五个周日
next Wednes #下一个周三等价于Wednes
last Tuesday #上一个周二
相对项
相对项用于向前或向后调整时间或日期,相对项的效果会累积。时间位移的单位可以用字符串“year”或“month”表示,来按整年或整月移动,年和月是模糊单位,因为年和月不都是相同的时间间隔,比如平年和闰年。更精确的单位有“fortnight”(两周,即14天)、“week”(7天)、“day”(24小时)、“hour”(60分)、“minute”(或min,60秒)、“second”(或sec,1秒),这些单位后面可以加后缀“s”,但是会被忽略。
在时间单位之前可以有一个可选的有符号的数字,如果没有符号默认为正号,如果没有数字则默认为1。如果单位后面跟随一个相对项“ago”则等价于将单位之前的数字乘以-1。此外“tomorrow”表示后一天等价于“day”,“yesterday”表示前一天等价于“day ago”。
“now”和“today”相当于是0时间位移,表示当前时间,不会改变之前的项。通常用来强调其他项,如“23:11 today”。“this”也是0时间位移,在类似“this sunday”这样的表示中更适合。
当一个相对项导致结果日期越过时钟调整的边界时(通常是夏令时),结果日期和时间将相应地进行调整。单位的模糊会导致此问题。
1 year #一年后,等价于year
1 year gao#一年前,等价于-1 year
now #当前时间,等价于today
tomorrow #后一天,等价于1 day、day
yesterday #前一天,等价于-1 day、day ago
this Wed #周三,等价于Wed
2 year -1 day#两年后往前一天
纯数字项
对纯数字的精确解析取决于日期字符串的上下文。
如果十进制数的形式为“yyyymmdd”,并且日期字符串中没有其他日历项出现在它前面,那么yyyy解析为年,mm解析为月,nn解析为日。
如果十进制数的形式是“hhmm”,并且日期字符串中没有其他时间项出现在它前面,那么hh解析为时,mm解析为分钟。对于特殊的时间mm可以省略。
20190119 #2019年01月19日
0919 #9时19分
09 #9时0分
秒项
如果在数字前加上“@”,则该数字表示时间戳的描述。数字可以包含“.”或“,”,任何不被支持的超额精度都会被舍弃。秒项不能与任何其他日期项组合,因为它指定了完整的时间戳。计算机时间表示为从纪元开始的秒数,GNU和POSIX系统,纪元为“1970-01-01 00:00:00 UTC”,所以“@0”就表示这个纪元,“@100”表示的时间为“1970-01-01 00:01:40 UTC”等等。GNU和大多数与POSIX兼容的系统都支持将时间作为POSIX的扩展,使用负计数,因此“@-1”表示1969-12-31 23:59:59 UTC。在大多数主机上,这些计数忽略了闰秒的存在,没有办法表示闰秒。
@0
@1532156204
更多推荐
所有评论(0)