除了 date,awk 还内置了如下时间函数,可以帮助你解决时间转换问题。

systime()

返回当前时间(自 Epoch 1970-01-01 00:00:00 起的秒数)。

1
2
3
4
$ awk 'BEGIN {
   print "Number of seconds since the Epoch = " systime()
}'
Number of seconds since the Epoch = 1511480989

mktime(YYYY MM DD HH MM SS)

将日期字符串 “YYYY MM DD HH MM SS” 转换为自 Epoch 起的秒数。输出格式与 systime 相同。

1
2
3
4
$ awk 'BEGIN {
   print "Number of seconds since the Epoch = " mktime("2017 11 24 08 52 10")
}'
Number of seconds since the Epoch = 1511481130

strftime()

根据指定格式格式化时间戳。

1
2
3
4
$ awk 'BEGIN {
   print strftime("Time = %m/%d/%Y %H:%M:%S", systime())
}'
Time = 11/24/2017 08:54:15

AWK 支持的时间格式如下:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
%a
本地缩写的星期名

%A
本地完整星期名

%b
本地缩写的月份名

%B
本地完整月份名

%c
本地"合适"的日期和时间表示(在 "C" locale 下为 'A %B %d %T %Y'

%C
当前年份的世纪部分(年份除以100并向下取整)

%d
月份中的日(0131

%D
等价于 '%m/%d/%y'

%e
一位数时用空格填充的日

%F
等价于 '%Y-%m-%d'ISO 8601 日期格式)

%g
ISO 8601 周编号的年份后两位(0099

%G
ISO 周编号的完整年份

%h
等价于 '%b'

%H
小时(24小时制,0023

%I
小时(12小时制,0112

%j
一年中的第几天(001366

%m
月份(0112

%M
分钟(0059

%n
换行符(ASCII LF

%p
本地 AM/PM 表示

%r
本地 12 小时制时间(在 "C" locale 下为 '%I:%M:%S %p'

%R
等价于 '%H:%M'

%S
秒(0060

%t
TAB 字符

%T
等价于 '%H:%M:%S'

%u
星期几(17,周一为1

%U
一年中的第几周(以第一个周日为第一周,0053

%V
一年中的第几周(以第一个周一为第一周,0153ISO 8601

%w
星期几(06,周日为0

%W
一年中的第几周(以第一个周一为第一周,0053

%x
本地"合适"的日期表示(在 "C" locale 下为 'A %B %d %Y'

%X
本地"合适"的时间表示(在 "C" locale 下为 '%T'

%y
年份后两位(0099

%Y
完整年份(如2015

%z
时区偏移('+HHMM'格式,如 RFC 822/1036

%Z
时区名或缩写

%Ec %EC %Ex %EX %Ey %EY %Od %Oe %OH
%OI %Om %OM %OS %Ou %OU %OV %Ow %OW %Oy
"替代表示"

%%
字面上的'%'

参考: The GNU Awk User’s Guide: Time Functions AWK - Time Functions