![如何为函数指定日期格式](https://linux22.com/image/115379/%E5%A6%82%E4%BD%95%E4%B8%BA%E5%87%BD%E6%95%B0%E6%8C%87%E5%AE%9A%E6%97%A5%E6%9C%9F%E6%A0%BC%E5%BC%8F.png)
我了解该命令date -d "20170712"
验证并以字符串形式返回日期Wed Jul 12 00:00:00 PDT 2017
。
我的问题是:
date 如何知道我提供字符串的格式(在本例中,年份为 2107,月份为 Jul,日期为 12)?
另外,如果我想传递“20171307”并想告诉函数当天是 13 日,月份是 7 月,该怎么办?
有没有办法指定传递给
date
命令的字符串的格式?
答案1
GNUdate
尽最大努力解析您的输入,但某些格式本质上是不明确的。
BSDdate
允许(或实际上要求)您指定输入格式,-f
然后根据该格式简单地解析您的输入,如果输入与格式不匹配则抛出错误。
无论如何,期望或要求标准工具来支持像您这样的不合逻辑且随意的日期格式似乎是错误的。标准工具应该支持标准格式,我认为从长远来看,您会发现您的脚本和程序在内部使用计算机友好的格式是有意义的。为了与具有奇怪行为的人类进行交互,编写一个简单的 shell 包装函数很容易,例如
Wackydate () {
local day # local is a Bashism
local mon
local year
year=${1%????}
mon=${1#$year??}
day=${1#$year}
day=${day%$mon}
shift
date -d "$year$mon$day" "$@"
}
shell 的参数替换${variable#prefix}
并返回与任何通配符匹配${variable%suffix}
的值,分别在开头或结尾处之后或删除。variable
#
%
答案2
拜托,哦拜托,不要这样做。
一般来说,日期的输出是由LC_TIME
变量控制的
$ LC_TIME=ja_JP.utf8 date; date'
2017年 7月 13日 木曜日 18:00:22 EDT
Thu Jul 13 18:00:22 EDT 2017
解析日期字符串可能非常(我的意思是:真的非常)困难,即使它对读者来说看起来很自然且显而易见。
就像上面的日本格式一样。
它可以不是用作 date 命令的输入。
你可以编辑区域设置文件以满足您的需求,甚至将其设为默认值。
首先引用一句:
Our units of temporal measurement, from seconds on up to months, are so complicated, asymmetrical and disjunctive so as to make coherent mental reckoning in time all but impossible. Indeed, had some tyrannical god contrived to enslave our minds to time, to make it all but impossible for us to escape subjection to sodden routines and unpleasant surprises, he could hardly have done better than handing down our present system. It is like a set of trapezoidal building blocks, with no vertical or horizontal surfaces, like a language in which the simplest thought demands ornate constructions, useless particles and lengthy circumlocutions. Unlike the more successful patterns of language and science, which enable us to face experience boldly or at least level-headedly, our system of temporal calculation silently and persistently encourages our terror of time. ... It is as though architects had to measure length in feet, width in meters and height in ells; as though basic instruction manuals demanded a knowledge of five different languages. It is no wonder then that we often look into our own immediate past or future, last Tuesday or a week from Sunday, with feelings of helpless confusion. ...
——罗伯特·格鲁丁,《时间与生活的艺术》。
答案:
因为它大多符合ISO-8601日期格式。
可以打印如下:$ date -Id -d 20170713
是的,您可以使用这样一种尴尬的格式(使用 busybox 日期或 BSD 日期):
$ busybox date -D '%Y%d%m' -d "20171307" Thu Jul 13 00:00:00 EDT 2017
甚至以相同的格式打印它:
$ busybox date -D '%Y%d%m' -d "20171307" +'%Y%d%m' 20171307
是的,您可以提供一种格式,上面
2
是一个示例。
答案3
date
实际上,这完全取决于您使用的版本。
GNUdate
预计输入日期为yy[y]*mmdd
(20170713
2017 年 7 月 13 日)或1000901123
(11 月 23 日 100090,是的,年份是未来的 faaaar ;-))。它可靠地打印日期,直到 10 个 dixits,不确定它在之后的几年里会做什么......年份有效2140000000
,年份2150000000
在我的系统上不起作用。
您还可以使用人类表达方式,例如“date -d 'yesterday'
不可移植”。
用于sed
将您的日期重新组织为yyyymmdd
。