需要将数据作为string转换为Excel可读格式

我有一个包含这种格式的datestring的数据文件:

June 11, 2012 3:47:56 PM GMT-07:00 

我已经使用Perl脚本来处理该文件中的一些其他数据元素,然后将其输出为Excel的csv。 而不是愚弄Excel中的函数和公式来尝试将date – string转换为Excel可以读取的东西,我想我应该可以在Perl中更简单/快速地完成。

目的/期望的最终结果是一个时间和date戳记,我可以在Excel中做简单的math运算(例如,通过设置时间戳来获得条目之间的年龄差异)。

为此,我想结束我的date,看起来像这样:

 6/11/2012 3:47:56 PM 

真的,我只需要转换date,时间是完美的,并删除格林威治时间差异垃圾。

我看过代码片段和对模块的引用,这些模块似乎是以另一种方式转换的,即从“6/24/12”到“2012年6月24日”,但是这对我来说是错误的方向。

我在cpan中查找了模块时间:: piece,但并不真正了解它。 我在一个Cygwin exec中工作,所以不是一个真正的unix系统,并没有很多的man页面或perldocs的方式。

你可以使用模块Date :: Parse和POSIX函数strftime 。 CPAN中有很多模块可以parsingdate。

使用strftime格式化date真的很酷的文章

 use strict; use Date::Parse; use POSIX qw/strftime/; my $time = str2time( 'June 11, 2012 3:47:56 PM GMT-07:00' ); my $date = strftime "%m/%d/%Y %H:%M:%S %p", localtime($time); print $date; 

祝你好运!

如果你原来的string是:$ timestring,那么这应该工作(未testing):

 my %months = (January => '1', February =>'2', March => '3', ...); 

等等

 $timestring =~ s<^(w+)\x20(\d{1,2}),\x20(\d{4})(\x20\(?:\d{1,2}\:){2}\d{1,2}\x20PM).*$><"$months{$1}/$2/$3$4">eeg 
 use DateTime; use DateTime::Format::Strptime; # YOU MUST ADAPT THIS PATTERN my $pat = "%b %d, %Y"; #incomplete my $d = DateTime::Format::Strptime->new( pattern => $pat, on_error => 'croak' ); my $dt = $d->parse_datetime($strdate); say $dt->mdy("/") . " " . $dt->hms(":") . " " . $dt->am_or_pm; 

但请注意,Excel优先selectISO格式的date时间types:

 say $dt->ymd('-') . 'T' . $dt->hms(':'); 

为了优化模式$ pat,请阅读DateTime :: Format :: Strptime的模块文档。 它最适合parsing非常均匀的input数据。 遇到最轻微的偏差,模块将不会parsing它(但你可以解决这个问题)

许多人有他们最喜欢的时间parsing技术。 我喜欢Time :: Piece,因为它带有Perl(至less在5.10以上的版本):

 my $time_string = "June 11, 2012 3:47:56 PM GMT-7:00"; my $time_string =~ / GMT.*$//; # That "GMT-7:00" messes things up! say $time_string # June 11, 2012 3:47:56 PM GMT my $time = Time::Piece->strptime( $time_string, "%B %d, %Y %l:%M:%S %p" ); say $time->strftime("%D %l:%M:%S %p"); 

$foo->bar是面向对象的编码风格,它正在成为Perl未来的方式,所以你最好使用它 。

这并不是那么复杂。 基本上,你创build一个包含所有数据的容器 。 散列可以容纳各种信息的方式。

当我这样做:

 my $time = Time::Piece->strptime( "$time_string", "$time_format" ); 

我创build了一个名为$timeTime::Piece对象(nee容器),用于存储时间。

当你说$time->Weekday ,你实际上正在执行一个名为Weekday的子例程,它接受你的$time 容器 ,从中提取信息,parsing时间并返回星期几。

strptimestrptime P ass TIME构造函数 (它是创build容器的函数)将取出你的时间string(第一个参数)和它的格式(第二个参数)并创build$time对象。 各种%M%d指定特定的时间字段。 这些可以在strptime手册中find。

您可以使用Unix date命令来使用这些格式:

 $ date "+%m/%d/%y" 08/23/13 $ date "+%m/%d/%Y" 08/23/2013 $ date "%Y-%m-%d" 2013-08-23 

这可能会让你感觉更舒适。

strftimeSTR ing F ormat TIME )方法(nee子程序)与strptime相反。 这需要时间(在$time并以您指定的格式返回时间。