我正在尝试将从文件读取的时间戳从字符串转换为日期格式,以便我可以找到2个日期/时间戳的差异。 Web上的大多数线程/讨论都显示使用date参数'-d'将字符串转换为epoch或查找两个时间戳的差异Find difference between two dates in bash
但看起来我的环境/操作系统不支持-d date argument。以下是我的环境的详细信息:
bash --version
GNU bash, version 3.2.52(1)-release (i386-pc-solaris2.10)
Copyright (C) 2007 Free Software Foundation, Inc.
uname -a
SunOS s01***** 5.10 Generic_147148-26 i86pc i386 i86pc
从文件中读取的样本日期:
START_TIME="09/03/16 - 01:04:56"
END_TIME="09/03/16 - 05:10:44"
我尝试过的代码 我试图模仿Find difference between two dates in bash
中的以下代码!# /usr/bin/sh
date1="Sat Dec 28 03:22:19 2013"
date2="Sun Dec 29 02:22:19 2013"
date -d @$(( $(date -d "$date2" +%s) - $(date -d "$date1" +%s) )) -u +'%H:%M:%S'
bash test.sh
date: illegal option -- d
usage: date [-u] mmddHHMM[[cc]yy][.SS]
date [-u] [+format]
date -a [-]sss[.fff]
date: illegal option -- d
usage: date [-u] mmddHHMM[[cc]yy][.SS]
date [-u] [+format]
date -a [-]sss[.fff]
test.sh: line 5: - : syntax error: operand expected (error token is " ")
我不认为第5行的语法错误是导致我在日期的手册页中找不到选项-d的主要原因。
回应评论:
>>> date --version
date: illegal option -- version
usage: date [-u] mmddHHMM[[cc]yy][.SS]
date [-u] [+format]
date -a [-]sss[.fff]
>>> date --help
date: illegal option -- help
usage: date [-u] mmddHHMM[[cc]yy][.SS]
date [-u] [+format]
date -a [-]sss[.fff]
>>> echo $0
bash
甚至不支持这些参数。如果我犯了任何愚蠢的错误,请道歉。
有人可以给我相同的-d作为上面分享的env详细信息,或者在不使用-d的情况下找到两个日期之间差异的方法。
提前致谢
答案 0 :(得分:1)
awk
mktime
在您的系统上存在很大的机会:
#!/bin/bash
START_TIME="09/03/16 - 01:04:56"
END_TIME="09/03/16 - 05:10:44"
echo -e "$START_TIME\n$END_TIME" |
tr '/:-' ' ' |
awk '{print "20"$3" "$2" "$1" "$4" "$5" "$6}' |
awk '{printf "%s ", mktime($0)}' |
awk '{print $2 - $1}'
说明:
echo
两个时间字符串tr
将09/03/16 - 01:04:56
转换为09 03 16 01:04:56
awk
将09 03 16 01 04 56
更改为2016 03 09 01 04 56
awk
将2016 03 09 01 04 56
转换为纪元时间:1457514296
并在一行上打印:1457514296 1457529044
awk
从第二个减去第一个,在几秒钟内给出差异:14748
awk
也可以很容易地合并,但是为了清楚起见,我在这里分开了。
答案 1 :(得分:0)
根据POSIX标准,date
不会为您做日期和时间数学运算。它可以获取或设置系统日期和时间,可能需要调整时区。请参阅date(1)
并注意缺少-d
选项(或者确实有任何有趣的选项!)。
问题变成"我们如何在没有date
的情况下进行日期和时间数学?"您提供的时间戳没有时区信息,因此通常的行为是假设当地时间。当地时间bad。认真。一些时区有crazy discontinuities或几百年前没有意义的存在(例如大多数美国时区)。因此,虽然您可能能够将最近在您的特定部分中工作的自定义解决方案整合在一起,但它根本不会很强大。
如果你可以将你的时间戳记输入Unix时间,你可以减去它们,这样就可以得到mostly but not entirely正确答案。不幸的是,据我所知,这不能在命令行完成。 Unix提供strptime(3)
来从C(从那里继续mktime(3)
进行此操作,如this answer所示),但我不相信有任何完全标准的实用程序,为此提供命令行界面。您可能需要编写和编译自己的。
在极端情况下纠正闰秒很困难,因为据我所知,POSIX从未提供过标准接口来查找过去发生闰秒的时间。这样的接口将需要互联网连接以保持最新,这对于许多实现而言可能是非启动的。在不了解您的系统及其功能的情况下,我无法开始猜测您的用例会起什么作用或哪些不起作用。