我在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
。我对python
或perl
中的任何解决方案持开放态度,不一定是单行。
答案 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这样的经典操作系统吗?
另见: