日期:非法选项 -- d,查找两个日期之间的差异



我正在尝试将从文件中读取的时间戳从字符串转换为日期格式,以便我可以找到 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 找到两个日期之间的差异的方法。

提前致谢

awkmktime

很有可能存在于您的系统中:

#!/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}'

解释:

  1. echo两个时间字符串
  2. tr09/03/16 - 01:04:56转换为09 03 16 01:04:56
  3. 第一个awk更改09 03 16 01 04 562016 03 09 01 04 56
  4. 第二个awk2016 03 09 01 04 56转换为纪元时间:1457514296并在一行上打印:1457514296 1457529044
  5. 第三个awk从第二个减去第一个,给出以秒为单位的差异:14748

awk也可以很容易地合并,但为了清楚起见,我在这里将每个分开。

根据 POSIX 标准,date不会为您进行日期和时间数学运算。 它获取或设置系统日期和时间,可能通过时区调整。 请参阅date(1)并注意缺少-d选项(或者实际上,任何有趣的选项!

问题变成了"我们如何在没有date的情况下进行日期和时间数学? 您提供的时间戳没有时区信息,因此通常的行为是采用本地时间。 当地时间不好。 认真地。 一些时区有疯狂的不连续性,或者在几百年前没有意义地存在(例如大多数美国时区)。 因此,虽然您可能能够将一个自定义解决方案组合在一起,该解决方案在最近的世界特定地区有效,但它根本不会强大。

如果你能把你的时间戳变成Unix时间,你可以减去它们,这将给你一个基本但不完全正确的答案。 不幸的是,据我所知,这无法在命令行完成。 Unix 提供了从 C 中执行此操作strptime(3)(从那里你继续mktime(3),如本答案所示),但我不相信有任何完全标准的实用程序为此提供命令行界面。 您可能需要编写和编译自己的代码。

校正闰秒在极端情况下是困难的,因为据我所知,POSIX 从未提供过一个标准的界面来找出过去闰秒何时发生。 这样的接口需要互联网连接才能保持最新状态,这对于许多实现来说可能是不可能的。 如果不更多地了解您的系统及其功能,我根本无法猜测什么对您的用例有用或无效。

相关内容

  • 没有找到相关文章

最新更新