1

次の形式の日付文字列を含むデータを含むファイルがあります。

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

私はすでに Perl スクリプトを使用して、そのファイルから他のデータ要素を操作し、それを Excel の csv として出力しています。Excel で関数や数式をいじって、文字列としての日付を Excel が読み取れるものに変換しようとするのではなく、Perl でより簡単/迅速に変換できるはずだと考えています。

目的/望ましい最終結果は、Excel で簡単な計算を行うことができる時刻と日付のスタンプです (つまり、タイムスタンプを計算してエントリ間の年齢差を取得します)。

そのために、次のような日付スタンプで終了したいと考えています。

6/11/2012 3:47:56 PM

実際には、日付を変換する必要があるだけです。時刻は完璧であり、GMT差分のガベージを削除します。

コード スニペットやモジュールへの参照が逆に変換されているように見えるのを見たことがあります...つまり、「2012 年 6 月 24 日」から「2012 年 6 月 24 日」に変換されているように見えますが、それは私にとって間違った方向に進んでいます。

モジュール time::piece を cpan で調べましたが、よくわかりません。私は Cygwin exec で作業しているため、実際の UNIX システムではなく、man ページや perldocs の方法があまりありません。

4

5 に答える 5

1

モジュールDate::Parseおよび POSIX functionsを使用できますstrftime。CPAN には、日付を解析できるモジュールがたくさんあります。

strftime で日付をフォーマットする 本当にクールな記事

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;

幸運を!

于 2012-07-06T22:28:30.533 に答える
0

元の文字列が $timestring の場合、これは機能するはずです (テストされていません):

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
于 2012-07-07T00:41:29.610 に答える
0
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 は ISO 形式の Datetime 型を優先することに注意してください。

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

パターン $pat の微調整については、DateTime::Format::Strptimeのモジュール ドキュメントを参照してください。非常に均一な入力データの解析に最適です。わずかな逸脱に遭遇すると、モジュールはそれを解析しません (ただし、これを回避することはできます)。

于 2012-07-07T21:39:27.520 に答える
0

多くの人は、お気に入りの時間解析手法を持っています。Time::Pieceが好きなのは、Perl (少なくとも 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 の将来の方法になりつつあるオブジェクト指向のコーディング スタイルなので、慣れたほうがよいでしょ

それほど複雑ではありません。基本的に、すべてのデータを保持するコンテナーを作成します。ハッシュがさまざまな情報を保持できる方法のようなものです。

私がこれを行うとき:

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

Time::Piece時間を格納するというオブジェクト(旧コンテナ)を作成しています$time

と言うとき、実際には、コンテナを受け取り、そこから情報を抽出し、時刻を解析し、曜日を返す$time->Weekdayというサブルーチンを実行しています。Weekday$time

( STR ing P ass TIME )コンストラクターstrptime(コンテナーを作成する関数) は、時間文字列 (最初の引数) とその形式 (2 番目の引数) を取得し、そのオブジェクトを作成します。さまざまな特定の時間フィールドを指定します。これらはstrptimeマンページにあります。$time%M%d

Unixdateコマンドを使用して、これらのフォーマットをいじることができます。

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

そうすることで、より快適に過ごせるようになるかもしれません。

( STR ing Format TIME ) メソッドstrftime(サブルーチン) は の反対です。これには時間がかかります (指定した形式で時間が返されます。strptime$time

于 2013-08-23T19:48:20.500 に答える