在bash中将时间戳转换为日期
我有时间戳(unix时间)格式的时间日志:在bash中将时间戳转换为日期,bash,Bash,我有时间戳(unix时间)格式的时间日志: 1515365117236 1515365123162 1515365139963 我想把它转换成一个常规的日期,比如 2017-01-07 23:48:01 2017-01-07 23:48:02 2017-01-07 23:48:03 你知道什么方法最快吗 cat ff1.csv | while read line ; do echo $line\;$(date -d +"%Y-%m-%d %H:%M:%S") ; done >
1515365117236
1515365123162
1515365139963
我想把它转换成一个常规的日期,比如
2017-01-07 23:48:01
2017-01-07 23:48:02
2017-01-07 23:48:03
你知道什么方法最快吗
cat ff1.csv | while read line ; do echo $line\;$(date -d +"%Y-%m-%d %H:%M:%S") ; done > somefile.csv
这需要花费大量的时间,只需附加当前时间将历元转换为日期的方法是
date-d@epochtime+格式
另一种方法是使用date--file
开关直接从文件中读取日期
$ cat file10
1515365117236
1515365123162
1515365139963
为了理解这些行是历元时间,您需要在每行的开头添加@
这可以像下面这样做:
$ sed -i 's/^/@/g' file10 #caution - this will make changes in your file
$ date --file file10 +"%Y-%m-%d %H:%M:%S"
或者,您可以在不影响原始文件的情况下动态执行此操作:
$ sed 's/^/@/g' file10 |date --file - +"%Y-%m-%d %H:%M:%S"
PS:在这种情况下,--文件
从-
=stdin
==pipe读取
在这两种情况下,结果都是错误的
49990-01-04 04:47:16
49990-01-04 06:26:02
49990-01-04 11:06:03
PS:顺便说一句,您提供的时间戳似乎无效,因为它似乎指的是49990年另一种必须快得多的方法,使用
bash version>4.2的printf
:
$ printf '%(datefmt)T\n' epoch
对于datefmt
您需要strftime(3)
接受的字符串-请参阅man 3 strftime
测试:
$ cat file10
1515365117236
1515365123162
1515365139963
$ printf '%(%F %H:%M:%S)T\n' $(cat file10)
49990-01-04 04:47:16
49990-01-04 06:26:02
49990-01-04 11:06:03
在这种情况下,printf
格式字符串是:
%F相当于%Y-%m-%d(ISO 8601日期格式)。(C99)
%H使用24小时时钟(范围为00到23)将小时表示为十进制数字。(根据tm_hour计算。)
%以十进制数字表示的分钟(范围为00到59)。(根据tm_min计算)
%秒为十进制数(范围为00到60)。(范围高达60以允许偶尔的闰秒。-根据tm_秒计算。)
更新以删除毫秒:
$ printf '%(%F %T)T\n' $(printf '%s/1000\n' $(<file10) |bc)
2018-01-08 00:45:17
2018-01-08 00:45:23
2018-01-08 00:45:39
$printf%(%F%T)T\n'$(printf'%s/1000\n'$)(您的输入数据不是epoch unix时间,它有毫秒。如果您希望首先在bash上使用任何方法,则必须转换为时间戳:
cat ff1.csv | while read LINE; do echo "@$(expr $LINE \/ 1000)" | date +"%Y-%m-%d %H:%M:%S" --file - ; done
首先除以1000以删除毫秒部分,其余部分与解释George Vasiliou的相同时间戳似乎包括毫秒。1515365117236是2018-01-07 17:45:17.236(美国东部时间)。您不需要在sed命令中使用g
标志。^
根据定义,每行只显示一次。您知道如何将其转换为正确的日期,但不包括毫秒吗?%H:%M:%S
可以缩短为%t
@George非常感谢您花时间研究这个问题,我已将文件转换为使用dos2unix的unix格式,但我仍然收到一个语法错误注意,这个问题很有用,因为OP给出的时间戳是毫秒。这意味着,在最纯粹的定义中,它不是真正的划时代unix时间,但它是人们将要面临的很多问题。很好地抓住了毫秒。