在bash中将时间戳转换为日期

在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 >

我有时间戳(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 > 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时间,但它是人们将要面临的很多问题。很好地抓住了毫秒。