我在 Perl 中使用localtime函数来获取当前日期和时间,但需要解析现有日期。我有以下格式的 GMT 日期:“20090103 12:00”我想将其解析为我可以使用的日期对象,然后将 GMT 时间/日期转换为我当前的时区,该时区目前是东部标准时间. 因此,我想将“20090103 12:00”转换为“20090103 7:00”任何有关如何执行此操作的信息将不胜感激。
Jared
问问题
59787 次
5 回答
48
因为 Perl 内置的日期处理接口有点笨拙,并且您最终会传递大约六个变量,所以更好的方法是使用DateTime或Time::Piece。DateTime 是全能歌唱、全能跳舞的 Perl 日期对象,您可能最终会想要使用它,但 Time::Piece 更简单且完全适合此任务,具有与 5.10 一起发布的优势,并且该技术是两者基本相同。
这是使用 Time::Piece 和strptime的简单、灵活的方法。
#!/usr/bin/perl
use 5.10.0;
use strict;
use warnings;
use Time::Piece;
# Read the date from the command line.
my $date = shift;
# Parse the date using strptime(), which uses strftime() formats.
my $time = Time::Piece->strptime($date, "%Y%m%d %H:%M");
# Here it is, parsed but still in GMT.
say $time->datetime;
# Create a localtime object for the same timestamp.
$time = localtime($time->epoch);
# And here it is localized.
say $time->datetime;
为了对比,这是手动方式。
由于格式是固定的,正则表达式就可以了,但如果格式发生变化,您将不得不调整正则表达式。
my($year, $mon, $day, $hour, $min) =
$date =~ /^(\d{4}) (\d{2}) (\d{2})\ (\d{2}):(\d{2})$/x;
然后将其转换为 Unix 纪元时间(自 1970 年 1 月 1 日以来的秒数)
use Time::Local;
# Note that all the internal Perl date handling functions take month
# from 0 and the year starting at 1900. Blame C (or blame Larry for
# parroting C).
my $time = timegm(0, $min, $hour, $day, $mon - 1, $year - 1900);
然后回到你的当地时间。
(undef, $min, $hour, $day, $mon, $year) = localtime($time);
my $local_date = sprintf "%d%02d%02d %02d:%02d\n",
$year + 1900, $mon + 1, $day, $hour, $min;
于 2009-01-04T22:19:58.397 回答
21
这是一个示例,使用DateTime及其strptime格式模块。
use DateTime;
use DateTime::Format::Strptime;
my $val = "20090103 12:00";
my $format = new DateTime::Format::Strptime(
pattern => '%Y%m%d %H:%M',
time_zone => 'GMT',
);
my $date = $format->parse_datetime($val);
print $date->strftime("%Y%m%d %H:%M %Z")."\n";
$date->set_time_zone("America/New_York"); # or "local"
print $date->strftime("%Y%m%d %H:%M %Z")."\n";
$ perl dates.pl
20090103 12:00 UTC
20090103 07:00 EST
如果您想解析本地时间,这就是您的方法:)
use DateTime;
my @time = (localtime);
my $date = DateTime->new(year => $time[5]+1900, month => $time[4]+1,
day => $time[3], hour => $time[2], minute => $time[1],
second => $time[0], time_zone => "America/New_York");
print $date->strftime("%F %r %Z")."\n";
$date->set_time_zone("Europe/Prague");
print $date->strftime("%F %r %Z")."\n";
于 2009-01-04T22:20:26.193 回答
6
这就是我要做的...
#!/usr/bin/perl
use Date::Parse;
use POSIX;
$orig = "20090103 12:00";
print strftime("%Y%m%d %R", localtime(str2time($orig, 'GMT')));
您也可以使用Time::ParseDate
andparsedate()
代替Date::Parse
and str2time()
。请注意,事实上的标准 atm。似乎是 DateTime (但您可能不想使用 OO 语法来转换时间戳)。
于 2009-01-05T10:11:09.163 回答
4
任君挑选:
- DateTime ::* (或者,在datetime.perl.org)
- 日期::Manip
- Date::Calc(2004 年最后一次更新)
毫无疑问,还有无数其他人,但他们可能是最有力的竞争者。
于 2009-01-04T22:18:46.620 回答
-2
use strict;
use warnings;
my ($sec,$min,$hour,$day,$month,$year)=localtime();
$year+=1900;
$month+=1;
$today_time = sprintf("%02d-%02d-%04d %02d:%02d:%02d",$day,$month,$year,$hour,$min,$sec);
print $today_time;
于 2014-04-18T09:53:18.783 回答