【问题标题】:How can I get approximate time passed since some timestamp?如何获得自某个时间戳以来经过的大致时间?
【发布时间】:2010-03-20 21:59:44
【问题描述】:

CPAN 上是否有任何有用的模块可以返回日期间隔的最大分数,即返回两个日期之间的整数年/月/日/小时/分钟/秒,用于“N 天前”这样的句子或“M 个月前”

【问题讨论】:

    标签: perl datetime formatting


    【解决方案1】:

    DateTimeDateTime::Duration 是最好的模块:

    use strict;
    use warnings;
    
    use DateTime;
    use DateTime::Duration;
    use Data::Dumper;
    
    my $dt1 = DateTime->now;
    my $dt2 = DateTime->new(
        year => 2001,
        month => 01,
        day => 01
    );
    
    my $duration = $dt1 - $dt2;
    print Dumper($duration);
    

    产生:

    $VAR1 = bless( {
                     'seconds' => 38,
                     'minutes' => 181,
                     'end_of_month' => 'wrap',
                     'nanoseconds' => 0,
                     'days' => 20,
                     'months' => 110
                   }, 'DateTime::Duration' );
    

    您可以使用姐妹模块DateTime::FormatDateTime::Format::Duration 格式化绝对时间和持续时间。

    【讨论】:

    • 有时DateTime & Co. 只是矫枉过正。我讨厌安装它:D
    【解决方案2】:

    嗯,写你自己的并不难。

    Calculate relative time in C#

    【讨论】:

    • 这是一个值得交叉引用的古老问题!
    【解决方案3】:

    Time::Duration 似乎是您尝试完成的任务的自然选择。我还没有尝试过。唯一需要注意的是,它已经为您提供了诸如“M 个月前”之类的短语,因此您可能需要将其输出解析为非英语输出。

    【讨论】:

      【解决方案4】:

      您可以看看 CPAN 上的 Time::Ago 模块(我是作者)。它是 Rails 中 time_ago_in_words() 助手的 Perl 端口。

      给定一个持续时间,它返回一个可读的字符串近似值。来自 Rails 文档:

      0 29 秒 少于一分钟 30 秒 1 分 29 秒 1分钟 1 分 30 秒 44 分 29 秒 [2..44] 分钟 44 分 30 秒 89 分 29 秒 约1小时 89 分 30 秒 23 小时 59 分 29 秒 大约 [2..24] 小时 23 小时 59 分钟 30 秒 41 小时 59 分钟 29 秒 1天 41 小时 59 分钟 30 秒 29 天 23 小时 59 分钟 29 秒 [2..29] 天 29 天 23 小时 59 分钟 30 秒 44 天 23 小时 59 分钟 29 秒 约1个月 44 天 23 小时 59 分钟 30 秒 59 天 23 小时 59 分钟 29 秒 约2个月 59 天 23 小时 59 分钟 30 秒 1 年 - 1 秒 [2..12] 个月 1 年 1 年 3 个月 约1年 1 年、3 个月 1 年、9 个月 1年以上 1 年,9 个月 2 年 - 1 秒 将近2年 最长 2 年时间或日期 (与 1 年相同的规则)

      CPAN module

      Repository

      【讨论】:

        【解决方案5】:

        [这不是一个真正的答案,但我认为它是相关的。]

        如果您要进行日期/时间操作和计算,最好不要使用 DateTime 系列模块。他们不仅拥有我发现的最佳时区处理能力,而且它们都可以相互协作。我在这个领域从来没有遇到过我在 DateTime 中找不到模块来解决它的问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多