小时和分钟加法

Hours and Minutes addition

我在 solaris 服务器上工作,date -d 选项不存在。也没有gdate。我知道已经问了很多与此相关的问题,我几乎已经解决了所有问题。但是我不知道 perl 所以我不知道如何修改这些答案 w.r.t 我的要求。

这是我在 Linux 中工作的内容:

date -d "$hr:$mi $duration minutes" +'%H%M'

其中 $hr$mi 是小时和分钟,$duration 是分钟。

当我 运行 在 Linux 中点赞时,我得到了这个:

date -d "23:28 60 minutes" +'%H%M'
0028

如何获得适用于 Solarisperl 等价物(可能是一个衬垫?)?

编辑:添加 awk 标签以查看是否有解决方案,因为我的 perl 很古老。伙计们,感谢您的帮助。

编辑 (2):我遇到了与 here 相同的问题,只是我没有使用 date -d 的奢侈。我对 pythonperl 中的任何解决方案持开放态度,不必是一个班轮。

PS:也检查了 This, no tclsh. Checked This,不知道那里发生了什么!

Solaris 在很多方面都落后于时代。它的 date 命令缺少一堆东西,比如处理 Linux 风格的 -d 选项或 BSD 风格的 -v 选项的能力。 Solaris 的 strftime() 缺少一堆东西(这会影响可用的日期格式),perl 很古老,awk 很古老...

多年来我一直在 Solaris 上使用以下 hack,以获得当前纪元秒:

truss /usr/bin/date 2>&1 | awk '/^time/{print $NF}'

据我所知,使用任何 POSIX 工具都不可能转换为另一种方式,但由于您可以使用 perl,因此以下方法可能有效:

perl -le 'print scalar localtime $ARGV[0]' 1510329000

在双向进行此转换后,您可以对其进行数学运算以调整日期。例如:

$ date
Fri Nov 10 10:24:31 EST 2017
$ now=$( truss /usr/bin/date 2>&1 | awk '/^time/{print $NF}' )
$ then=$( perl -le 'print scalar localtime $ARGV[0]' $((now+3600)) )
$ echo "$then"
Fri Nov 10 11:24:46 2017

为了将任意 GMT date/times 转换为纪元秒,我在多年前继承了以下 bash 代码。 YMMV.

# Use whatever process you like to populate these variables.
# Note that since epoch zero was at midnight GMT, this time is GMT as well.
read year month day hour minute second <<<"2017 11 10 15 50 00"

if [[ $month -gt 2 ]]; then
  (( month++ ))
else
  (( month+=13 ))
  (( year-=1 ))
fi

day=$(( (year*365)+(year/4)-(year/100)+(year/400)+(month*306001/10000)+day ))
days_since_epoch=$(( day-719591 ))   # this seems to be close to Jan 1 1970
seconds_since_epoch=$(( (days_since_epoch*86400)+(hour*3600)+(minute*60)+second ))

echo "epoch: $seconds_since_epoch"

此代码的大部分内容用于计算闰年和秒数。我没有深入研究神奇数字的起源,但由于结果似乎有效,我不会质疑它们。 :)

要从 perl 中获取小时和分钟,如您在问题中所示,您可以使用以下代码:

perl -le 'my ($h,$m) = (localtime($ARGV[0]))[2,1]; printf("%02d%02d\n",$h,$m);' 1510329000

perl -le 'use POSIX "strftime"; print strftime("%H%M", localtime($ARGV[0]));' 1510329000

使用Solaris这样经典的操作系统是不是很开心?

另请参阅: