如何为函数指定日期格式

如何为函数指定日期格式

我了解该命令date -d "20170712"验证并以字符串形式返回日期Wed Jul 12 00:00:00 PDT 2017

我的问题是:

  1. date 如何知道我提供字符串的格式(在本例中,年份为 2107,月份为 Jul,日期为 12)?

  2. 另外,如果我想传递“20171307”并想告诉函数当天是 13 日,月份是 7 月,该怎么办?

  3. 有没有办法指定传递给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.
 ...

——罗伯特·格鲁丁,《时间与生活的艺术》。

答案:

  1. 因为它大多符合ISO-8601日期格式。
    可以打印如下:

    $ date -Id -d 20170713 
    
  2. 是的,您可以使用这样一种尴尬的格式(使用 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
    
  3. 是的,您可以提供一种格式,上面2是一个示例。

答案3

date实际上,这完全取决于您使用的版本。

GNUdate预计输入日期为yy[y]*mmdd201707132017 年 7 月 13 日)或1000901123(11 月 23 日 100090,是的,年份是未来的 faaaar ;-))。它可靠地打印日期,直到 10 个 dixits,不确定它在之后的几年里会做什么......年份有效2140000000,年份2150000000在我的系统上不起作用。

您还可以使用人类表达方式,例如“date -d 'yesterday'不可移植”。

用于sed将您的日期重新组织为yyyymmdd

相关内容