小时和分钟的补充

时间:2017-11-10 09:02:37

标签: perl date awk solaris

我在solaris服务器上工作,date -d选项不存在。也没有gdate。我知道有很多问题与此有关,我几乎都经历了这些问题。但我不知道perl所以我不知道如何根据我的要求修改这些答案。

以下是我在Linux中运行的内容:

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

其中$hr$mi为小时和分钟,$duration以分钟为单位。

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

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

如何获得perl等效(可能是一个班轮?),它将在Solaris中起作用?

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

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

PS:已检查This,无tclsh。经过检查This,不知道去那里的是什么!

1 个答案:

答案 0 :(得分:1)

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日期/时间转换为纪元秒,我在几年前和几年前继承了以下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这样的经典操作系统吗?

另见: