从某个时间戳开始,我怎样才能获得大概的时间?

时间:2010-03-20 21:59:44

标签: perl datetime formatting

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

5 个答案:

答案 0 :(得分:4)

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格式化绝对时间和持续时间。

答案 1 :(得分:2)

嗯,写自己的并不是很难。

Calculate relative time in C#

答案 2 :(得分:1)

Time::Duration似乎是您尝试完成的自然选择。我没有尝试过。只有警告似乎它已经为你提供了像“M个月前”这样的短语,所以你可能需要解析它的输出以获得非英语输出。

答案 3 :(得分:1)

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

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

0  29 secs
  less than a minute

30 secs  1 min, 29 secs
  1 minute

1 min, 30 secs  44 mins, 29 secs
  [2..44] minutes

44 mins, 30 secs  89 mins, 29 secs
  about 1 hour

89 mins, 30 secs  23 hrs, 59 mins, 29 secs
  about [2..24] hours

23 hrs, 59 mins, 30 secs  41 hrs, 59 mins, 29 secs
  1 day

41 hrs, 59 mins, 30 secs  29 days, 23 hrs, 59 mins, 29 secs
  [2..29] days

29 days, 23 hrs, 59 mins, 30 secs  44 days, 23 hrs, 59 mins, 29 secs
  about 1 month

44 days, 23 hrs, 59 mins, 30 secs  59 days, 23 hrs, 59 mins, 29 secs
  about 2 months

59 days, 23 hrs, 59 mins, 30 secs  1 yr minus 1 sec
  [2..12] months

1 yr  1 yr, 3 months
  about 1 year

1 yr, 3 months  1 yr, 9 months
  over 1 year

1 yr, 9 months  2 yr minus 1 sec
  almost 2 years

2 yrs  max time or date
  (same rules as 1 yr)

CPAN module

Repository

答案 4 :(得分:0)

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

如果您要进行日期/时间操作和计算,最好保留DateTime系列模块。他们不仅对我找到的时区进行了最好的处理,而且他们都相互合作。我在这个领域从未遇到任何问题,我在DateTime中找不到解决它的模块。

相关问题