【问题标题】:how to get year difference between two date in perl如何在perl中获取两个日期之间的年份差异
【发布时间】:2012-06-19 02:25:52
【问题描述】:

如何在 perl 中获取两个日期之间的年份差异,如下面的日期

my $date1 = '2012-08-29T00:00:00.0000Z'
my $date2 = '2010-08-29T00:00:00.0000Z'

需要帮助和建议。谢谢

【问题讨论】:

标签: perl


【解决方案1】:
use DateTime::Format::RFC3339 qw( );
my $format = DateTime::Format::RFC3339->new();

my $dt1 = $format->parse_datetime('2010-08-29T00:00:00.0000Z');
my $dt2 = $format->parse_datetime('2012-08-29T00:00:00.0000Z');
my $dur = $dt2 - $dt1;

say sprintf "%d years", $dur->in_units('years');

参考:DateTimeDateTime::DurationDateTime::Format::RFC3339

【讨论】:

  • 在我使用上述代码时遇到此错误之间未定义的子例程 &Params::Validate::SCALAR 在 /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/DateTime 调用/Locale.pm 第 41 行。
  • @Zann,我们之前已经确定您破坏了 DateTime::Locale 的安装,需要重新安装。
  • 已重新安装。但仍然出现一些错误。 cpan DateTime::Locale CPAN: Storable loaded ok Going to read /root/.cpan/Metadata Database was generated on Tue, 19 Jun 2012 01:16:49 GMT DateTime::Locale 是最新的。 [root@sgnic2 ~]# cd /home/websites/sgnic/cgi-bin [root@sgnic2 cgi-bin]# perl zann.pl 在 /usr/lib/perl5/site_per 调用的未定义子例程 &Params::Validate::SCALAR l/5.8.8/i386-linux-thread-multi/DateTime/Locale.pm 第 41 行。
  • 这里不是调试损坏的安装的地方。创建一个新问题,以便您可以提供适当的信息并展示您为调试它所做的工作。
【解决方案2】:

其他人将发布的正确解决方案的轻量级替代方案:

my $date1 = '2012-08-29T00:00:00.0000Z';
my $date2 = '2010-08-29T00:00:00.0000Z';
my $years_diff = do { no warnings "numeric"; $date1 - $date2 };

请注意,在这个看似微不足道的问题中,可能有几十种不同的方法可以指定如何对部分年份进行四舍五入。

【讨论】:

  • 这并不能为大多数输入提供正确的答案。例如将$date1 更改为2012-08-28T00:00:00.0000Z
  • 你怎么知道在这种情况下想要什么答案,ikegami?正如我所说,有许多不同的舍入方式。
  • 除了 OP 没有要求四舍五入之外,您的代码也没有四舍五入。它有时返回 2,有时返回 1,持续时间为 2 年减去 1 天。 (如果我既不是 OP 也不是答案的作者,你必须用 @ikegami 标记我。我注意到你的问题是侥幸。)
  • @ikegami 我的代码返回年份(date1) - 年份(date2)。这与您的年份(date1-date2 的持续时间)一样可能是对“如何获得两个日期之间的年份差异”的解释
【解决方案3】:

如果您不关心小时或闰年,您可以截断时间并使用 Date::Simple。

my $days = Date::Simple->new(substr $date2, 0, 10) - Date::Simple->new(substr $date1, 0, 10);
my $years = int($days / 365);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    相关资源
    最近更新 更多