Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 小时和分钟加法_Perl_Date_Awk_Solaris - Fatal编程技术网

Perl 小时和分钟加法

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'

我在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:我和你有同样的问题,只是我没有使用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