来自https://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html据
我所知,gawk只有2个函数可用于日期/时间
mktime和strftime.
所以,我可以解析使用mktime返回的任何日期很长,所以我可以进行任何数学操作,所以我可以格式化所需的输出strftime
这适用于任何日期之后的魅力 "1970 01 01 00 00 00"
使用awk,如何在1970年之前格式化日期?
$ awk 'BEGIN{t=mktime("1970 01 01 00 00 00"); print t; print strftime("%Y-%m-%d", t) }'
10800
1970-01-01
$ awk 'BEGIN{t=mktime("1960 01 01 00 00 00"); print t; print strftime("%Y-%m-%d", t) }'
-315608400
awk: cmd. line:1: (FILENAME=- FNR=1) fatal: strftime: second argument less than 0 or too big for time_t
Run Code Online (Sandbox Code Playgroud)
所以,这是一个错误......
我正在使用 GNU awk 4.0.2,稍微查看一下源代码,似乎很容易修复:
glaudiston:/sources/gawk-4.0.2$ diff builtin.c.orig builtin.c
1701,1702c1701,1702
< if (clock_val < 0)
< fatal(_("strftime: second argument less than 0 or too big for time_t"));
---
> // if (clock_val < 0)
> // fatal(_("strftime: second argument less than 0 or too big for time_t"));
glaudiston:/sources/gawk-4.0.2$ echo "" | ./gawk '{ts="1969 12 31 23 00 00";format="%Y/%m/%d";tv=mktime(ts);print tv;print strftime(format, tv)}'
7200
1969/12/31
glaudiston:/sources/gawk-4.0.2$ echo "" | ./gawk '{ts="1960 01 01 00 00 00";format="%Y/%m/%d";tv=mktime(ts);print tv;print strftime(format, tv)}'
-315608400
1960/01/01
Run Code Online (Sandbox Code Playgroud)
对于我的目的来说,它有效,但我不确定这是否是一个好主意。我会将其发送到 gawk 邮件列表以供批准。
讨论开始于: https://lists.gnu.org/archive/html/bug-gawk/2015-04/msg00012.html
awk 开发团队已经修复了该错误,因此只需将 awk 升级到新版本即可:
https://lists.gnu.org/archive/html/bug-gawk/2015-04/msg00036.html