【问题标题】:Perl subtract two datesPerl 减去两个日期
【发布时间】:2016-10-28 16:06:33
【问题描述】:

我是 Perl 的新手。 我正在尝试以这种格式减去两个日期

15.07.16 23:13:34
15.07.16 20:04:24

我知道我必须将此字符串转换为日期对象。我的问题是我仅限于基本的 perl 而没有安装额外的软件包。有办法吗?

我的版本是 v5.8.4,输出应该是03:09:10

【问题讨论】:

  • 你有哪个版本的 Perl?您期望输出什么?你可以edit你的问题。
  • 链接的副本基本上就是你想要的。只是strptime 的模式有点不同。请参阅man7.org/linux/man-pages/man3/strptime.3.html 了解如何构建正确的模式。
  • 我的版本是v5.8.4,输出应该是03:09:10
  • 那么你可能没有 Time::Piece。请在命令行中执行perl -MTime::Piece\ 999corelist Time::Piece 说它已经为我发布了 5.9.5。
  • 是的。我看到。我想这是他们需要解决的最大问题:-)

标签: perl datetime


【解决方案1】:

您说您使用的是 Perl 5.8.4。您确实需要更新它并获得安装 CPAN 模块的能力。

但是,这是一种只使用 5.8.4 中可用的核心 Perl 功能来做你想做的事情的方法。

#!/usr/bin/perl

use strict;
use warnings;
use Time::Local;

my $date1 = '15.07.16 23:13:34';
my $date2 = '15.07.16 20:04:24';

my $diff = date2sec($date1) - date2sec($date2);

print secs2duration($diff);

sub date2sec {
  my ($date) = @_;

  my ($day, $mon, $yr, $hr, $min, $sec) = split(/[. :]/, $date);

  # I've assumed that your timestamps are in your local timezone,
  # so I've used timelocal() here. If your timestamps are actually
  # UTC, you should use timegm() instead.
  return timelocal($sec, $min, $hr, $day, $mon-1, 2000 + $yr);
}

sub secs2duration {
  my ($secs) = @_;

  my $hours = int($secs / (60*60));
  $secs %= (60*60);
  my $mins = int($secs / 60);
  $secs %= 60;

  return sprintf '%02d:%02d:%02d', $hours, $mins, $secs;
}

【讨论】:

  • 没有听到任何相反的声音,我会假设这些在当地时间 not (所以 timegm 而不是 timelocal)
  • @ysth:根据我的经验,不提及时区的人更有可能处理当地时间——这就是我选择timelocal() 的原因。但我会添加一条评论来澄清这一点。
  • 肯定时区在这里无关紧要,因为我们正在寻找一个增量?重要的是两个输入都在相同的时区 - 我们别无选择,只能假设:-)
  • @ardavey:如果时间是当地时间并且它们在 DST 转换的任一侧怎么办?
  • @DaveCross 啊,有一个极端情况......那是在我一直在追逐 BST/GMT 错误之后:-D
猜你喜欢
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多