【问题标题】:How to compare dates using perl?如何使用 perl 比较日期?
【发布时间】:2013-06-12 18:24:54
【问题描述】:

如何使用 Perl 比较两个日期格式:

"dd mon yyyy hh:mm:ss GMT"

例如:2013 年 5 月 12 日 10:10:20 GMT

我无法安装任何外部 Perl 模块。 请指教。

【问题讨论】:

  • "我无法安装任何外部 Perl 模块" — isn't very likely
  • “我无法安装任何外部 Perl 模块” - 那么这是您应该解决的第一个问题。如果你不能从 CPAN 安装模块,那么你就没有使用 Perl 的大部分功能。解决这个问题应该是您的首要任务。
  • 如果您可以在系统上拥有自己的 Perl 代码,则可以安装 Perl 模块。通过local::lib 或使用您的代码复制它们。

标签: perl


【解决方案1】:

如果你有 Perl v5.9.5 或更新版本,你可以使用Time::Piece 核心模块。下面是相关操作的简单演示

  • 将日期从字符串转换为Time::Piece对象

    my $date = "12 May 2013 10:10:20 GMT";
    my $tp1 = Time::Piece->strptime($date, "%d %B %Y %T %Z");
    my $tp2 = ...
    
  • 找出2次之间的差异

    my $diff = $tp2 - $tp1;
    

    这会给你一个Time::Seconds 对象。

  • 最后,以秒(或其他)为单位显示差异。

    print $diff->seconds;
    
  • 或者你可以直接比较两者(感谢stevenl

    $tp2 > $tp1
    

参考资料:

  1. Time::Seconds
  2. Time::Piece
  3. man strftime 用于与 Time::Piece->strptime 一起使用的格式字符串
  4. man strptime 用于与$tp->strftime 一起使用的格式字符串
    • 请注意,如果您使用的是非 Unix 系统,则只有格式字符 aAbBcdHIjmMpSUwWxXyYZ% 是安全的(例如,Window 的 Perl 不支持 %e 说明符)。

【讨论】:

  • 除了做减法,还可以直接比较:$tp1 < $tp2
  • @stevenl,感谢您的提醒。将信息添加到帖子中。
  • 假设您的意思是 perl 5.9.5(实际上是 perl 5.10); “perl 5.95”不正确。
  • Duh doy,在那里打错字了。固定。
【解决方案2】:

将日期转换为格式yyyymmddhhmmss(例如20130512101020)并作为字符串进行比较。但是,如果没有模块,处理时区可能会变得很棘手。

【讨论】:

  • 嗯看起来不错。不必在这里有任何时区。 yyyymmddhhmmss 适用于所有情况?
  • @david: 找不着的情况下试试。
  • 是的,我正在尝试,但我认为找不到一个 :)
  • 为什么这个答案得到-1。你在开玩笑吗?
  • @david 因为任何关于将日期视为简单字符串或数字的日期的答案都是错误的答案。
【解决方案3】:

最流行的日期模块之一是DateTime。它有a FAQ,可以帮助您入门。

sub to_comparable {

       my ($date) = @_;
       my ($H,$M,$S,$d,$m,$Y) = $date =~ m{^([0-9]{2}):([0-9]{2}):([0-9]{2}), ([0-9]{2})/([0-9]{2})/([0-9]{4})\z}
          or die;
       return "$Y$m$d$H$M$S";
    }

    if (to_comparable($date2) < to_comparable($date1)) {
       ...
    } else {
       ...
    }

【讨论】:

  • 对不起,但正如我所说,我无法安装任何外部 perl 模块。
  • 谢谢,我正在尝试,但转换为 yyyymmddhhmmss 看起来更简单。你怎么看?
  • 是的!我在答案中添加了代码。试试看。它会起作用的。
猜你喜欢
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 2020-09-05
  • 1970-01-01
相关资源
最近更新 更多