私がTime::Pieceを気に入っているのは、Perl に付属しているという理由だけで、リビジョン 5.10 を信じています。何十もの日付/時刻モジュールが見つかり、誰もがお気に入りを持っていますがTime::Piece
、公式ディストリビューションの一部になったので、それに切り替える時が来ました.
Time::Piece を使用するには、時間文字列の特定の側面を表すために文字形式を使用するstrptime ( STR ing P ass TIME ) とstrftime ( STR ing Format TIME )について知る必要があります。%x
その理由はTime::Piece
、同じ%x
フォーマット文字を使用して、時間文字列を時間オブジェクトに変換し、場合によってはその時間オブジェクトを文字列にフォーマットするためです。
のマンページからstrftime
:
%j
10 進数としての年間通算日 (範囲は 001 から 366)。
と:
%y
世紀を含まない 10 進数としての年 (範囲は 00 から 99)。
日付を変換するには:
use Time::Piece;
my $old_time = "12212"; #YYddd
my $time = Time::Piece->strptime( $old_time, "%y%j" );
my $new_time = $time->ymd("/"); Now in YY/MM/DD format
おっと
ちょっと待ってください — strptime は %j を認識しません。これは間違った答えになります。
私はこれをテストしませんでした。なぜなら、私は睡眠中にできるように Time::Piece を頻繁に使用していたからです。私は%j
以前に使用したことがありませんTime::Piece
。perldocには%j
、動作しないことについては何も言及されておらず、エラーも発生しません。イケてないよ。
新しい戦略。YYddd
文字列を年と日に解析できます。すると、年の初め01/01/$year
を として取得できます。その後、日を取り、年に追加できます。ただし、これを正しく行うには、Time::Secondsからの定数が必要です。
use strict;
use warnings;
use feature qw(say);
use Time::Piece;
use Time::Seconds;
my $old_date = "12212";
$old_date =~ /(..)(.*)/;
my $year = $1;
my $days = $2;
my $time = Time::Piece->strptime("01/01/$year", "%m/%d/%y");
$time += ( ( $days - 1 ) * ONE_DAY); #01/01/$year is day 1 and not 0
say $time->strftime("%y/%m/%d");
それが12/07/30
答えになります。
発表
モジュールの所有者がTime::Piece
モジュールのエラーを修正しました。バージョン 1.23 が動作するようになりました:
use warnings;
use strict;
use autodie;
use feature qw(say);
use Data::Dumper;
use Time::Piece;
my $old_time = "12212"; #YYddd
my $time = Time::Piece->strptime( $old_time, "%y%j" );
my $new_time = $time->ymd("/"); #Now in YY/MM/DD format
say "Version: $Time::Piece::VERSION";
say $new_time;
これは出力します:
Version: 1.23
2012/07/30