awk与1970年以前的日期

ton*_*ton 7 bash awk date

来自https://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html据 我所知,gawk只有2个函数可用于日期/时间 mktimestrftime.

所以,我可以解析使用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)

ton*_*ton 2

所以,这是一个错误......

我正在使用 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