【问题标题】:Hours and Minutes addition小时和分钟添加
【发布时间】:2018-04-23 11:07:04
【问题描述】:

我在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

我怎样才能获得在 Solaris 中工作的 perl 等效项(可能是单行?)?

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

编辑(2):我和here 有同样的问题,只是我没有使用date -d 的奢侈。我对pythonperl 中的任何解决方案持开放态度,不必是单一的。

PS:检查This,没有tclsh。也检查了This,不知道那里发生了什么!

【问题讨论】:

  • 你有哪个版本的 Perl?请运行perl -v。还有edit 并包含预期的输出。我不知道带有字符串的date -d 应该做什么。它是shell脚本的一部分吗?价值观是什么?
  • 这是 perl v5.8.4
  • 哇。那是古老的。今天的那个版本已经快 14 年了。
  • @simbabque 我知道 :( 我已经用我在 Linux 中得到的内容更新了这个问题。如果可能的话,我想通过perl 获得相同的结果。
  • 那么$hr$mi$duration是shell变量吗?

标签: perl date awk solaris


【解决方案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 这样经典的操作系统吗?

另见:

【讨论】:

  • 这很有趣,虽然上面的一些代码让我害怕。我试过这个,花了一点时间来安装Solaris 10。我在脚本中使用输入2017 11 10 23 33 00 来计算纪元,得到1510356780。但是当我使用perl -le 'print scalar localtime $ARGV[0]' 1510356780 来检查我是否得到了正确的日期时,我得到了Nov 11, 05:33:00 2017!编辑:您的脚本将输入时间增加了 6 小时,不是吗?我似乎找不到6 hours - 我在哪里修改我想添加的时间? :)
  • 纪元秒1510356780确实是Fri Nov 10 23:33:00 UTC 2017。当您打印该 perl sn-p 时,您的系统正在打印本地时区的时间。我怀疑你在亚洲的某个地方运行这个——PRC or Bangladesh or Bhutan。如果您改为运行 TZ=GMT perl -le 'print scalar localtime $ARGV[0]' 1510356780(假设您在 POSIX 或 bash shell 中),您将看到预期的结果。或者尝试perl -le 'use POSIX; print POSIX::strftime("%F %T %Z%z", localtime($ARGV[0]));' 1510356780查看时区时间。
  • 它的 date 命令缺少很多东西,比如处理 Linux 风格的 -d 选项或 BSD 风格的 -v 选项的能力。 我敢打赌也不处理微软风格的选项。 ;-)
  • @AndrewHenle -- Microsoft 操作系统有date 命令?给我的消息! (当然,尽管 Xenix 的 date 命令可能非常接近 Solaris 的......)
  • @ghoti 你是对的。是时区。我用TZ=GMT 运行它,它有效。我不知道它在我的服务器中会如何 :) 无论哪种方式,我现在都可以管理。谢谢你的帮助,我真的很黑暗。不过,我不得不怀疑,date -d 命令获得我想要的输出有多简单。以及重新创建 Solaris 不支持的东西是多么困难。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多