如何在Perl中比较不同格式的日期?

时间:2009-08-25 08:22:54

标签: perl timestamp

任何人都可以帮我解决如何将这个日期格式“星期一,2009年8月24日17:00:44 +0800”转换成这样的内容,“2009-08-24 17:00:44”在Perl中?我一直在使用CPAN浏览模块,但我仍然无法找到我想要的东西。使用Mail :: POP3Client从电子邮件帐户检索第一种格式。另一个来自数据库中的查询。我的目的是比较这两个日期,但如果它们的格式不同,它将不起作用。有任何建议吗? =)

3 个答案:

答案 0 :(得分:8)

我使用DateTime::Format::Strptime将日期转换为DateTime对象,然后要求它提供所需的日期表示。 e.g:

my $parser = DateTime::Format::Strptime->new(pattern => '%a, %d %b %Y %T %z');
my $dt = $parser->parse_datetime($original_timestamp);

# Postgres-format timestamp for db storage
my $pg_timestamp = DateTime::Format::Pg->format_datetime($dt);

# Epoch timestamp for if I'm going to do the comparison in code
my $epoch = $dt->epoch;

答案 1 :(得分:1)

我会使用Date::Calc

拆分字符串以获取所需的值并使用Decode _ Month(“Aug”)

use strict;
use warnings;
use Date::Calc qw(:all);

my $datetime = 'Mon, 24 Aug 2009 17:00:44 +0800';

# get each part
my (undef, $day, $month_text, $year, $time, undef) = split('/,?\s/', $datetime);

my $month = Decode_Month($month_text);

# put together in wanted format
my $newdatetime = sprintf("%04d-%02d-%02d $time", $year, $month, $day);

答案 2 :(得分:0)

如果您确定POP3客户端的时间戳格式不会改变,那么我建议您在数据库查询中转换格式。您还没有提到您使用的数据库,但我使用的所有数据库(Oracle,PostgreSQL,MySQL)都具有在select语句中为您提供所需格式的函数。

如果你告诉我们你正在使用什么数据库,我可以告诉你时间戳格式化功能是什么。