我们通常会在GMT的某些列中获得包含日期时间值的csv文件。
我们正在寻找一种将日期时间值从GMT更改为我们选择的时区的方法--所需的目标时区可能因csv而异。这一调整也需要考虑到DST。
csv的日期时间格式:
YYYY/MM/DD HH:MM:SS样本数据:
col1,col2,col3,col4
aaa,bbb,2016/01/15 22:01:16,ccc
ddd,eee,,fff
hhh,iii,2014/09/19 00:53:37,jjj
kkk,lll,2015/11/15 22:01:16,mmm
nnn,ooo,2015/10/12 19:54:59,ppp例如,如果我们希望将上述样本数据从格林尼治时间调整到太平洋时间(GMT -8标准),我们希望得到的结果是一个csv,其值如下:
col1,col2,col3,col4
aaa,bbb,2016/01/15 14:01:16,ccc
ddd,eee,,fff
hhh,iii,2014/09/18 17:53:37,jjj
kkk,lll,2015/11/15 14:01:16,mmm
nnn,ooo,2015/10/12 12:54:59,ppp注re :对于上面的5行示例数据,DST仅对第3行和第5行的日期是活动的。调整可能因线而异,但在目标时区当量(太平洋)方面是一致的。
日期时间格式本身可以保持原样--我们只需调整时区的日期时间值,最终将等效的日期时间存储在东部、太平洋(或任何其他时区)而不是格林尼治标准时间。
如果可能的话,我们希望利用Ubuntu中本机提供的编辑工具,比如awk,因为我们已经有了使用它的清理例程。如果不可能使用awk或类似的解决方案,将考虑其他解决方案。
其他说明:
任何洞察力都是值得赞赏的--谢谢!
编辑:
在研究这个问题的过程中,我发现这样一种说法:
echo "1/15/2016 10:01:16 GMT" | awk -v q='"' '{cmd="TZ=America/Los_Angeles date -d"q$0 q" +"q"%F %H:%M:%S %Z"q; cmd|getline x; close(cmd);print x}'...is在某种程度上是概念的证明,但我不得不自己在字符串中添加"GMT“,并且输出日期格式略有不同。
我希望找到一个解决方案,我可以应用到csv可能有数千行。
发布于 2016-09-14 22:41:33
使用GNU awk作为时间函数:
$ cat tst.awk
function dt2utcSecs(dateTime, cmd,line,ret) {
cmd = "TZ=UTC gawk -v dt='" dateTime "' 'BEGIN{print mktime(dt)}'"
ret = ( (cmd | getline line) > 0 ? line : -1 )
close(cmd)
return ret
}
BEGIN{
FS=OFS=","
split(cols,f)
}
{
for (i in f) {
dateTime = gensub(/[\/:]/," ","g",$(f[i]))
utcSecs = dt2utcSecs(dateTime)
if (utcSecs >= 0) {
$(f[i]) = strftime("%Y/%m/%d %T",utcSecs)
}
}
print
}
$ TZ='US/Pacific' gawk -v cols=3 -f tst.awk file
col1,col2,col3,col4
aaa,bbb,2016/01/15 14:01:16,ccc
ddd,eee,,fff
hhh,iii,2014/09/18 17:53:37,jjj
kkk,lll,2015/11/15 14:01:16,mmm
nnn,ooo,2015/10/12 12:54:59,ppp只需设置cols=3,5,9对这些字段进行转换即可。有关有效时区的列表,请参见/usr/share/zoneinfo。
请注意,@webb's answer应该比上面的更有效,因为上面的调用shell可以在每个输入dateTime字段中调用gawk一次,而@webbs只调用gawk两次。
https://stackoverflow.com/questions/39499654
复制相似问题