使用Perl的内置函数进行Perl Date转换

时间:2014-06-20 11:12:32

标签: regex perl perl-module perl-data-structures

我有以下格式的日期,它是如何存储在外部应用程序中的

06/12/2014 6:31 PM IST

我想将此格式更改为需要检查AM和PM以及剩余的分钟以硬编码为:00+5:30

2014-06-12 18:31:00+05:30

由于它不是一个简单的GMT改变PDT,我尝试了epoch,但问题是日期是不同的格式。

3 个答案:

答案 0 :(得分:2)

你可以用正则表达式和printf来做。在你的特殊情况下,我建议:

my $yourstring = '06/12/2014 6:31 PM IST';
my ($mm,$dd,$yy,$hh,$mi,$ampm) = $yourstring =~ m~(\d+)/(\d+)/(\d+)\s+(\d+):(\d+)\s+(AM|PM)\s+~;
if ($ampm eq 'PM' && $hh < 12) { $hh += 12 }
printf ('%04d-%02d-%02d %02d:%02d:00+05:30', $yy, $mm, $dd, $hh, $mi);

或查看DateTime::Format::DateParse

答案 1 :(得分:1)

最好的办法是使用现在内置在Time::Piece中的日期/时间函数的Perl。一旦您将时间转换为真正的Perl时间,您可以随意格式化它。

问题在于Time :: Piece在处理时区方面做得不好。处理字符串时区的最简单方法是简单地删除它们:

use strict;
use warnings;

use Time::Piece;

# This is what you have given
my $input_time="6/12/2014 6:31 PM IDT";

# Remove timezone (the last four characters)
my $munged_time = substr $input_time, 0, -4;

# This is a description of your "format" above
# You can find this by doing a "man date" on Unix.
# Sometimes it's "man strftime".
#
# The various %x are bits that represent the time
# in various formats.
# %m = month         %d = month date   %Y = four digit year
# %I = hour 01-12    %M = Minutes      %p = AM/PM  
my $time_format="%m/%d/%Y %I:%M %p";

# Now convert the time from the format to a Time::Zone
# Date Object.
my $time = Time::Piece->strptime($munged_time, $time_format);

# Now that the time is in a Time::Piece object, we can easily
# manipulate it to do whatever we want. We could add or subtract
# date times from each other, add or subtract hours, months, etc.

# Here, I'm just printing out the various bits and pieces of
# "datetime" that I am interested in. Note I'm using time->second
# even though I never specified seconds. It's okay, Time::Piece
# simply assumes that seconds are zero.
#
printf "%04d-%02d-%02d %02d:%02d:%02d+05:30\n",
    $time->year, $time->mon, $time->mday,
    $time->hour, $time->minute, $time->second;

答案 2 :(得分:0)

该问题不包含任何关于哪种时间格式可能的信息。月份和月份的日期总是2位数? 0到9范围内的小时是否始终没有前导0?分钟0到9是否可能没有前导0?哪些时区可能, IST 或其他时区?

以下是Perl正则表达式搜索和替换字符串的列表,必须全部应用这些字符串以重新格式化时区 IST 的日期和时间字符串,以格式YYYY-MM-DD获取日期和时间HH:MM:00 + 05:30

在字符串中使用 AM 重新格式化。

搜索:([01]?\d)/([0-3]?\d)/([12][09]\d\d) +([01]?\d:[0-5]?\d) AM IST
替换:$3-$1-$2 $4:00+05:30

使用字符串中的 12:xx PM 重新格式化。

搜索:([01]?\d)/([0-3]?\d)/([12][09]\d\d) +(12:[0-5]?\d) PM IST
替换:$3-$1-$2 $4:00+05:30

使用字符串中的 01:xx PM 重新格式化。

搜索:([01]?\d)/([0-3]?\d)/([12][09]\d\d) +0?1(:[0-5]?\d) PM IST
替换:$3-$1-$2 13$4:00+05:30

使用字符串中的 02:xx PM 重新格式化。

搜索:([01]?\d)/([0-3]?\d)/([12][09]\d\d) +0?2(:[0-5]?\d) PM IST
替换:$3-$1-$2 14$4:00+05:30

使用字符串中的 03:xx PM 重新格式化。

搜索:([01]?\d)/([0-3]?\d)/([12][09]\d\d) +0?3(:[0-5]?\d) PM IST
替换:$3-$1-$2 15$4:00+05:30

在字符串中使用 04:xx PM 重新格式化。

搜索:([01]?\d)/([0-3]?\d)/([12][09]\d\d) +0?4(:[0-5]?\d) PM IST
替换:$3-$1-$2 16$4:00+05:30

使用字符串中的 05:xx PM 重新格式化。

搜索:([01]?\d)/([0-3]?\d)/([12][09]\d\d) +0?5(:[0-5]?\d) PM IST
替换:$3-$1-$2 17$4:00+05:30

使用字符串中的 06:xx PM 重新格式化。

搜索:([01]?\d)/([0-3]?\d)/([12][09]\d\d) +0?6(:[0-5]?\d) PM IST
替换:$3-$1-$2 18$4:00+05:30

使用字符串中的 07:xx PM 重新格式化。

搜索:([01]?\d)/([0-3]?\d)/([12][09]\d\d) +0?7(:[0-5]?\d) PM IST
替换:$3-$1-$2 19$4:00+05:30

使用字符串中的 08:xx PM 重新格式化。

搜索:([01]?\d)/([0-3]?\d)/([12][09]\d\d) +0?8(:[0-5]?\d) PM IST
替换:$3-$1-$2 20$4:00+05:30

使用字符串中的 09:xx PM 重新格式化。

搜索:([01]?\d)/([0-3]?\d)/([12][09]\d\d) +0?9(:[0-5]?\d) PM IST
替换:$3-$1-$2 21$4:00+05:30

使用字符串中的 10:xx PM 重新格式化。

搜索:([01]?\d)/([0-3]?\d)/([12][09]\d\d) +10(:[0-5]?\d) PM IST
替换:$3-$1-$2 22$4:00+05:30

在字符串中使用 11:xx PM 重新格式化。

搜索:([01]?\d)/([0-3]?\d)/([12][09]\d\d) +11(:[0-5]?\d) PM IST
替换:$3-$1-$2 23$4:00+05:30

使用具有正向lookbehind和正向前瞻的表达式,在日期(月,月,日)或时间(小时,分钟)字符串中插入前导0:

搜索:(?<=[ \-:])(\d)(?=[ \-:])
替换:0$1

如果上面的表达式由于lookbehind / lookahead不起作用,也可以使用限制较少的正则表达式:

搜索:\b(\d)\b
替换:0$1