在Perl中重新格式化日期(以后在MySQL中使用)

时间:2016-04-12 14:41:32

标签: perl date datetime format

我正在编写一个Perl脚本来打开.csv文件,进行一些更改,在四个字段上对其进行排序,然后将其写回新文件。发现因为这个数据将用于加载MySQL表,我还需要重新格式化Date变量。目前,日期在文件中为00/00/0000,对于MySQL,需要将它们格式化为0000-00-00。现在,我只是尝试在一个字段中执行此操作,但实际上我需要在.csv文件中的每一行的三个Date字段中执行此操作。

此脚本正在运行 - 但它没有重新格式化日期字段我尝试对此进行测试。

dmgr

我添加到此脚本中的两行(不起作用)是 my $ in_date my $ db_date 行。现在我还需要重新格式化DATETIME的两个字段(在每一行的末尾),即10/23/2015 10:47,我只需要在该字段中重新格式化日期,我就是这样。甚至不确定从哪里开始处理那个。

请放心,因为我是Perl的菜鸟。

编辑 - SORRY,不得不重新编辑,因为我没有注意到我的脚本的第一部分没有复制。

1 个答案:

答案 0 :(得分:1)

使用Time::Piece模块解析和重新格式化日期时间值,而不是使用一堆字符串函数。它有strptimestrftime方法为您执行此操作。这个简短的程序显示了您提到的两种日期时间格式的重新格式化。 ymd是一种便捷方法,相当于strftime('%Y-%m-%d')

use strict;
use warnings 'all';
use feature 'say';

use Time::Piece;

my $in_date = '01/02/2003';
my $db_date = Time::Piece->strptime($in_date, '%m/%d/%Y')->ymd;
say "$in_date -> $db_date";

$in_date = '01/02/2003 04:05';
$db_date = Time::Piece->strptime($in_date, '%m/%d/%Y %H:%M')->strftime('%Y-%m-%d %H:%M');
say "$in_date -> $db_date";

输出

01/02/2003 -> 2003-02-01
01/02/2003 04:05 -> 2003-02-01 04:05

更新

如果您愿意,可以编写一个子程序,该子程序将原始日期及其格式字符串与所需格式一起使用。喜欢这个

use strict;
use warnings 'all';
use feature 'say';

use Time::Piece;

my $in_date = '01/02/2003';
my $db_date = date_from_to($in_date, '%m/%d/%Y', '%Y-%m-%d');
say "$in_date -> $db_date";

$in_date = '01/02/2003 04:05';
$db_date = date_from_to($in_date, '%m/%d/%Y %H:%M', '%Y-%m-%d %H:%M');
say "$in_date -> $db_date";

sub date_from_to {
    my ($date, $from, $to) = @_;
    Time::Piece->strptime($date, $from)->strftime($to);
}

输出与上面程序的输出相同

更新

关于您的评论,您的代码应如下所示

$_ = join '-', (split /\//)[2,0,1] for $fields[14, 20, 23];

$_ = Time::Piece->strptime($_,'%m/%d/%Y %H:%M')->strftime('%Y-%m-%d %H:%M') for @fields[38,39];

push @data, \@fields;

但我希望看到处理日期字段的方式有一些一致性,比如

$_ = Time::Piece->strptime($_, '%m/%d/%Y')->strftime('%Y-%m-%d') for @fields[14,20,23];

$_ = Time::Piece->strptime($_, '%m/%d/%Y %H:%M')->strftime('%Y-%m-%d %H:%M') for @fields[38,39];

push @data, \@fields