#!/usr/bin/perl use feature 'say'; use strict; use warnings; use utf8; use Time::Piece; binmode STDOUT, ":utf8"; my $t = localtime; ### 日時の表示 say $t; #Sat Mar 3 14:53:37 2012 say $t->datetime; #2012-03-03T14:53:37 say $t->datetime( date => '/', T => ' ', time => '-' ); #2012/03/03 14-53-37 say $t->strftime('%Y*%m*%d %H@%M@%S'); #2012*03*03 14@53@37 注:UTF8フラグが落ちてます ### 年月日の表示 say $t->ymd; #2012-03-03 say $t->ymd("/"); #2012/03/03 say $t->ymd(""); #20120303 say $t->year; #2012 say $t->mon; #3 say $t->mday; #3 ### 曜日の表示 say $t->wday; #7 say $t->wdayname; #Sat say $t->wdayname( qw/日 月 火 水 木 金 土/ ); #土 #wdaynameを何度も使うのなら #デフォルトの曜日を変更してしまう $t->day_list(qw/日 月 火 水 木 金 土/); say $t->wdayname; #土 ### 時分秒の表示 say $t->hms; #14:53:37 say $t->hms("-"); #14-53-37 say $t->hms(""); #145337 say $t->hour; #14 say $t->min; #53 say $t->sec; #37 ### 他 #閏年判定 say $t->is_leap_year ? "閏年" : "Not閏年"; #閏年 #最終日 say $t->month_last_day; #31 ### 任意の時間を設定 $t = localtime->strptime('2000-01-01 12:00:00', '%Y-%m-%d %H:%M:%S'); say $t->datetime; #2000-01-01T12:00:00 ### 時間の比較 my $BaseDate = localtime->strptime('20001122', '%Y%m%d'); my $TestDate = localtime->strptime('20111122', '%Y%m%d'); say $BaseDate < $TestDate ? "もうすぎたよ" : "まだ過ぎてないよ"; #もうすぎだよ ### 時間の加減・減算(秒単位で返ってくる) my $date1 = localtime->strptime('20120101', '%Y%m%d'); my $date2 = localtime->strptime('20130101', '%Y%m%d'); my $days = ($date2 - $date1) / (24 * 60 * 60); say $days; #366
ただ、一つ注意。
strftimeメソッドは、utf8フラグを落とすことに注意。
#!/usr/bin/perl use strict; use warnings; use Time::Piece; use utf8; use Devel::Peek; my $t = localtime; Dump $t->wdayname(qw/日 月 火 水 木 金 土/); Dump $t->strftime('%Y年%m月%d日');
実行結果
SV = PV(0x7fd56b801170) at 0x7fd56b842708 REFCNT = 1 FLAGS = (TEMP,POK,pPOK,UTF8) PV = 0x105d08220 "\346\227\245"\0 [UTF8 "\x{65e5}"] CUR = 3 LEN = 16 SV = PV(0x7fd56b801190) at 0x7fd56b842708 REFCNT = 1 FLAGS = (TEMP,POK,pPOK) PV = 0x105d06df0 "2012\345\271\26403\346\234\21004\346\227\245"\0 CUR = 17 LEN = 32
wdaynameメソッドの方には、UTF8フラグが残っているけど
strftimeメソッドの方には、UTF8フラグがないですよね。
上の例のように
binmode STDOUT, ":utf8";
して、標準出力する際にフラグを落とすようにしている場合
文字化けしちゃいます。
美しくないけど
binmode STDOUT, ":utf8"; するなら
use Encode;
say decode_utf8($t->strftimeメソッド);
のように内部にあるデータには徹底してフラグをつけるか
binmode STDOUT, ":utf8"; を使わないなら
use Encode;
say encode_utf8($t->strftime以外のメソッド);
say $t->strftimeメソッド;
とするしかないのかな…。
おまけ。
1日後、1ヶ月後を簡単に求めるのに
Time::Secondsを使う方法があります。
#!/usr/bin/perl use strict; use warnings; use utf8; use feature 'say'; use Time::Piece; use Time::Seconds; my $t = localtime; say $t->ymd; #2012-03-03 $t += ONE_MONTH; say $t->ymd; #2012-04-03 $t += ONE_MONTH; say $t->ymd; #2012-05-03 $t += ONE_MONTH * 2; say $t->ymd; #2012-07-03
Time::Secondsを利用すると以下の定数が使えるようになります。
ONE_DAY
ONE_WEEK
ONE_HOUR
ONE_MINUTE
ONE_MONTH
ONE_YEAR
ONE_FINANCIAL_MONTH
LEAP_YEAR
NON_LEAP_YEAR
後は、掛け算して加減算するなりすればよいですね。
0 件のコメント:
コメントを投稿