Perl 小时和分钟加法
我在solaris服务器上工作,但没有date-d选项。也没有gdate。我知道已经有相当多的问题被问到了,我已经看过了几乎所有的问题。但是我不懂perl,所以我不知道如何根据我的要求修改这些答案 以下是我在Linux中使用的:Perl 小时和分钟加法,perl,date,awk,solaris,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'
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:我和你有同样的问题,只是我没有使用date-d的特权。我对python或perl中的任何解决方案都持开放态度,不必是一行程序
PS:选中,没有tclsh。也检查过了,不知道那里发生了什么 Solaris在许多方面都落后于时代。它的date命令缺少很多东西,比如处理Linux风格的-d选项或BSD风格的-v选项的能力。Solaris的strftime缺少一系列影响可用日期格式的内容,perl是古老的,awk是古老的 多年来,我一直在Solaris上使用以下技巧,以获得当前的第二个历元:
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"
或
使用像Solaris这样的经典操作系统难道你不高兴吗
另见:
您有哪个版本的Perl?请运行perl-v。并且还包括预期输出。我不知道带字符串的日期d应该做什么。它是shell脚本的一部分吗?这些值是什么?这是PerlV5.8.4Wow。那是古老的。“今天的版本已经快14年了。”辛巴基我知道:我已经用我在Linux中得到的更新了这个问题。如果可能的话,我希望通过perl获得相同的结果。那么$hr、$mi和$duration是shell变量吗?这非常有趣,尽管上面的一些代码让我感到害怕。我尝试了这个,花了一点时间安装Solaris 10。我在脚本中使用输入2017 11 10 23 33 00来计算历元,得到1510356780。但是,当我使用perl-le“print scalar localtime$ARGV[0]”1510356780检查我是否得到了正确的日期时,我得到了2017年11月11日05:33:00!编辑:你的脚本增加了6个小时的输入时间,不是吗?我似乎找不到6个小时-我要在哪里修改要添加的时间第二纪元1510356780确实是2017年11月10日星期五23:33:00 UTC。当您打印该perl代码段时,您的系统正在本地时区中打印时间。我怀疑你在亚洲的某个地方经营这个-。如果改为运行TZ=GMT perl-le“print scalar localtime$ARGV[0]”1510356780(假设您在POSIX或bash shell中),您将看到预期的结果。或者尝试perl-le’使用POSIX;打印POSIX::strftime%F%T%Z%Z,localtime$ARGV[0];'1510356780来查看时区的时间。它的date命令缺少很多东西,比如处理Linux样式-d选项或BSD样式-v选项的能力。我打赌它也不会处理微软风格的选项-@AndrewHenle-Microsoft操作系统是否有日期命令?给我一个好消息!当然,尽管Xenix的date命令可能与Solaris的非常接近,@ghoti您是对的。这是时区。我用TZ=GMT运行它,它运行正常。我不知道我的服务器将如何运行:不管怎样,我现在都可以管理。谢谢你的帮助,我真的很茫然。不过,我不得不想知道,date-d命令获得我想要的输出有多简单。以及重新创建Solaris不支持的内容是多么困难。
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