1

Perl 正規表現を使用して、この特定の変換 (これらの日付形式) の例を見つけるのにかなり苦労しましたが、役に立ちませんでした。これらの形式間で日付を変換するのを手伝ってもらえますか?

Dec 26 2012 12:00AM ==>  201212126

以下は私の最初の試みでしたが、実行が遅すぎます(明らかに、substrを5回使用しましたが、これはばかげています)。

# Format the input time to yyyymmdd from 'Dec 26 2012 12:00AM' like format.
sub formatTime($)
{
    #Get passed in value of format 'Dec 26 2012 12:00AM'.
    my $col = shift; 

    if (substr($col, 4, 1) eq " "){
        substr($col, 4, 1) = "0";
    }

    return substr($col, 7, 4).$months{substr($col, 0, 3)}.substr($col, 4, 2);
}

注: これは作業用で、入力ファイルを非常に大きな DB 取り込みに変換するためのものです。残念ながら、Python は、スクリプト作成に選択した言語であるプラットフォームではサポートされていません。独自の Perl 正規表現を作成しようとしましたが、この他の部分を実行している間、それを読んで理解する時間がありません。昨日の Perl スクリプトの作成と残りのオンザフライでの学習のほとんどをすでに無駄にしていました。この変換には時間がかかりすぎました。

4

3 に答える 3

19

モジュールDateTime + DateTime::Format::Strptimeを使用することをお勧めします。

#!/usr/local/bin/perl
use strict;

use DateTime;
use DateTime::Format::Strptime;

my $strp = DateTime::Format::Strptime->new(
      pattern => '%b %d %Y %l:%M%p',
      locale  => 'en_US',
);

# convert date to 
my $date = 'Dec 26 2012 10:10AM';
my $dt   = $strp->parse_datetime( $date );
printf "%s -> %s\n", $date, $dt->strftime("%Y-%m-%d %H:%M");

出力

Dec 26 2012 10:10AM -> 2012-12-26 10:10
于 2012-09-21T13:12:11.957 に答える
1

では、どの部分Dec 26 2012 12:00AMが面白いのでしょうか?

Dec    26   2012     12:00      AM
$month $day $year $hour:$minute $pm

したがって、単純な正規表現を定義し、興味深い情報を取得して、適切な変数に入れます。

my ($month, $day, $year, $hour, $minute, $pm)
  = ($string =~ m{
        (\w{3})   \s+             # 3 word characters
        (\d{1,2}) \s+             # 1 or 2 digits
        (\d{4})   \s+             # 4 digits
        (\d{2}) : (\d{2}) (AM|PM) # the hour, minute and AM/PM context
      }ix;
    );

次に、月を数値にし、AM/PM 情報を使用します。

$month = {
  Jan => 1,
  Feb => 2,
  ...
  Dec => 12,
}->{$month} or die "Unknown month $month";

$hour += $pm =~ /pm/i ? 12 : 0; # if $pm contains "pm", then add 12 h

次に、次の方法で適切にゼロが埋め込まれた文字列を作成しますsprintf

my $format_string = "%04d%02d%02d" . ($include_hour ? "%02d%02d" : "");
my $date = sprintf $format_string,
  $year, $month, $day, $hour, $minute;

野心があれば、タイムゾーンも簡単に追加できます;-)

このメソッドは、入力が のような場合に奇妙な結果を生成します。これは時間として16:00PM出力2800されるためです。これは明らかに間違っています。それが問題になる可能性がある場合は、pm修正のみを行ってif $hour <= 12ください。ただし、これ$include_hourは が true 値に設定されている場合にのみ問題になります。

于 2012-09-21T13:12:21.290 に答える
-1
use strict;
use warnings;

my $str = "Dec 26 2012 12:00AM";

my %months = (
    Jan => "01",
    [...]
    Dec => "12"
);
$str =~ /^(\w{3}) (\d{1,2}) (\d{4})/; 

print $3.$months{$1}.$2;
于 2012-09-21T13:28:28.903 に答える