我正在尝试将从文件中读取的时间戳从字符串转换为日期格式,以便我可以找到 2 个日期/时间戳的差异。 网络上的大多数线程/讨论都显示使用日期参数"-d"将字符串转换为纪元或查找两个时间戳的差异 在 bash 中查找两个日期之间的差异
但看起来我的环境/操作系统不支持 -d 日期参数。以下是我的环境的详细信息:
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"
我尝试过的代码 我试图模仿以下代码 在 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 等效物,或者一种不使用 -d 找到两个日期之间的差异的方法。
提前致谢
awk
mktime
很有可能存在于您的系统中:
#!/bin/bash
START_TIME="09/03/16 - 01:04:56"
END_TIME="09/03/16 - 05:10:44"
echo -e "$START_TIMEn$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
也可以很容易地合并,但为了清楚起见,我在这里将每个分开。
根据 POSIX 标准,date
不会为您进行日期和时间数学运算。 它获取或设置系统日期和时间,可能通过时区调整。 请参阅date(1)
并注意缺少-d
选项(或者实际上,任何有趣的选项!
问题变成了"我们如何在没有date
的情况下进行日期和时间数学? 您提供的时间戳没有时区信息,因此通常的行为是采用本地时间。 当地时间不好。 认真地。 一些时区有疯狂的不连续性,或者在几百年前没有意义地存在(例如大多数美国时区)。 因此,虽然您可能能够将一个自定义解决方案组合在一起,该解决方案在最近的世界特定地区有效,但它根本不会强大。
如果你能把你的时间戳变成Unix时间,你可以减去它们,这将给你一个基本但不完全正确的答案。 不幸的是,据我所知,这无法在命令行完成。 Unix 提供了从 C 中执行此操作strptime(3)
(从那里你继续mktime(3)
,如本答案所示),但我不相信有任何完全标准的实用程序为此提供命令行界面。 您可能需要编写和编译自己的代码。
校正闰秒在极端情况下是困难的,因为据我所知,POSIX 从未提供过一个标准的界面来找出过去闰秒何时发生。 这样的接口需要互联网连接才能保持最新状态,这对于许多实现来说可能是不可能的。 如果不更多地了解您的系统及其功能,我根本无法猜测什么对您的用例有用或无效。