我的日期字符串格式为2012-12-20T01:16:02.05,我希望转换为格式2011-12-20-01.16.02.050000
目前我正在按照以下方式进行
format = "%F-%H.%M.%S.%N"
split(stringinput,input,"T");
split(input[1],date,"-")
split(input[2],time,":")
return strftime(format,mktime(date[1] " " date[2] " " date[3] " " time[1] " " time[2] " " time[3] " " time[4]));
但我正在丢失微秒信息或毫秒信息。我怎么能得到它。它正在返回2011-12-20-01.16.02。%N
还有任何建议使字符串解析更通用。目前它只支持一种格式。
感谢。
答案 0 :(得分:1)
您需要单独处理毫秒数据。另外,使用gensub()
格式化字符串信息。像:
awk -f script.awk
script.awk
的内容:
BEGIN {
string = "2012-12-20T01:16:02.05"
groups = "^(....)-(..)-(..).(..):(..):(..).*"
format = "\\1 \\2 \\3 \\4 \\5 \\6"
datespec = gensub(groups, format, "", string)
timestamp = mktime(datespec)
newstring = strftime("%F-%H.%M.%S", timestamp)
sub(/.*\./,"",string)
printf "%s.%s0000\n", newstring, string
}
结果:
2012-12-20-01.16.02.050000
<强> 编辑: 强>
BEGIN {
string = "2011-01-10T14:45:13.815-05:00"
groups = "^(....)-(..)-(..).(..):(..):(..).*"
format = "\\1 \\2 \\3 \\4 \\5 \\6"
datespec = gensub(groups, format, "", string)
timestamp = mktime(datespec)
sub(/.*\./,"",string)
offset = substr(string,4)
split(offset,array,":")
seconds = (array[1] * 60 * 60) + (array[2] * 60)
newstring = strftime("%F-%H.%M.%S", timestamp - seconds, 1)
printf "%s.%s00\n", newstring, substr(string,0,3)
}
结果:
2011-01-10-09.45.13.81500
答案 1 :(得分:1)
你为什么使用mktime()?您描述的更改只是文本更改:
$ echo "2012-12-20T01:16:02.05" | awk '{sub(/T/,"-"); gsub(/:/,"."); print $0 "0000"}'
2012-12-20-01.16.02.050000
我认为在您的输出中将2012年更改为2011年时,这只是一个错字。
答案 2 :(得分:0)
因为我希望我的GNU日期精度与awk相匹配,所以我必须在以下方面做到这一点:
x='2019-05-30 14:09:20.074'
echo $x | awk '{split($1,a,"-");;split($2,b,".");split(b[1],c,":");s=a[1]" "a[2]" "a[3]" "c[1]" "c[2]" "c[3];tt=mktime(s);print tt b[2] "000000"}'
1559196560074000000
date --date=$x +'%s%N'
1559196560074000000
现在,我能够使这两个协议达成一致,现在我可以在awk中进行比较逻辑了。