ネコ情報
ネコを各種ブログ(Blog)から一括検索します。
トップ > 2 > 2 - 人気ブログ(Blog)検索結果詳細 (2008年11月20日 8時)
[日付・時刻]DateTime::Duration 期間を表すオブジェクト
日付と日付の間の期間を表すオブジェクト DateTime::Durationオブジェクトというものがあります。
DateTimeが日付の情報を表現するのに対して、DateTime::Duration は期間の情報を表現します。
日付にある期間を加えたり、ある期間を引いたりした場合は、addメソッドやsubstructメソッドを使用しましたが、内部的には、DateTime::Durationオブジェクトが作成された上で演算がなされています。
use strict; use warnings; use DateTime; # DateTimeオブジェクト同士の引き算 my $dt1 = DateTime->new( year => 2000 , month => 2, day => 1, hour => 12, minute => 44, second => 30 ); my $dt2 = DateTime->new( year => 2003 , month => 3, day => 19, hour => 23, minute => 54, second => 40 ); my $duration = $dt2 - $dt1; # 引き算の記号をそのまま使えます。 print "(1) 期間を取得する。\n"; print "期間は",$duration->years,"年と", $duration->months,"ヶ月と", $duration->days, "日と", $duration->hours, "時間と", $duration->minutes, "分と", $duration->seconds, "秒\n\n"; print "(2)期間の符号を判定する。\n"; if( $duration->is_positive ){ print "\$dt2は\$dt1より後の日付です。\n"; } elsif( $duration->is_zero ){ print "\$dt2は\$dt1と等しいです。\n"; } elsif( $duration->is_negative ){ print "\$dt2は\$dt1より前の日付です。\n"; } print "\n"; print "(3)期間を月換算で取得する。\n"; print "期間は月換算で", $duration->in_units( 'months' ), "ヶ月です。\n"; __END__
作者:perlcodesample
更新日:2008年11月19日 0時27分
[日付・時刻]DateTime 日付の引き算
日付の引き算には2種類あります。日付にある期間を引き算( たとえば1ヶ月前 )するものと、日付どうしの引き算( たとえば2008年10月10日と2009年3月14日の差 )するものがあります。(日付の足し算はこちら)
サンプル
DateTimeのインストールが必要です。
use strict; use warnings; use DateTime; print "(1) 日付の引き算\n"; my $dt = DateTime->now( time_zone => 'local' ); # 日の減算 my $dt_yesterday = $dt->clone; # オブジェクトのコピーを作成。 $dt_yesterday->subtract( days => 1 ); print "現在の日付は", $dt->date, "です。\n"; print "昨日の日付は", $dt_yesterday->date, "です。\n\n"; # 加算と減算を組み合わせる。 my $dt_mix = $dt->clone; $dt_mix = $dt_mix->add( months => 1 )->subtract( days => 1 ); # メソッドチェーンを利用することもできる。 =pod #またこのように短縮して記述できる。 my $dt_mix = $dt->clone->add( months => 1 )->subtract( days ); =cut print "(2)DateTimeオブジェクト同士の引き算\n"; my $dt1 = DateTime->new( year => 2000 , month => 2, day => 1 ); my $dt2 = DateTime->new( year => 2003 , month => 3, day => 19 ); my $duration = $dt2 - $dt1; # 引き算の記号をそのまま使えます。 print "期間は",$duration->years,"年と", $duration->months,"ヶ月と", $duration->days, "日\n"; __END__
解説
(1)日付の引き算
日付からある期間を減算するにはsubtractメソッドを使用します。
$dt->subtract( days => 1 ); # 日の減算 $dt->subtract( months => 1 );# 月の減算 $dt->subtract( years => 1 );# 年の減算 $dt->subtract( hours => 1 );# 時の減算 $dt->subtract( minutes => 1 );# 分の減算 $dt->subtract( seconds => 1 );# 秒の減算
(2)日付どうしの引き算
日付どうしの引き算を行うには、-記号を使って普通に計算するようにできます。(演算子のオーバーロードという機能を使って実現されています。)
戻り値は、DateTimeオブジェクトではなくて、期間を表すDateTime::Durationオブジェクトになります。
years, months, days メソッドで、期間の年月日を取得できます。
my $duration = $dt2 - $dt1; # 引き算の記号をそのまま使えます。 print "期間は",$duration->years,"年と", $duration->months,"ヶ月と", $duration->days, "日\n";
サイト案内
作者:perlcodesample
更新日:2008年11月18日 23時47分
実行結果 DateTime 日付の引き算
(1) 日付の引き算 現在の日付は2008-11-18です。 昨日の日付は2008-11-17です。 (2)DateTimeオブジェクト同士の引き算 期間は3年と1ヶ月と4日
作者:perlcodesample
更新日:2008年11月18日 23時50分
[日付・時刻]DateTime 日付の足し算
DateTimeオブジェクトは日付や時刻の計算を行うことができます。日付を加算するサンプルです。
サンプル
DateTimeのインストールが必要です。
use strict; use warnings; use DateTime; print "(1)-1 日付の足し算\n"; my $dt = DateTime->now( time_zone => 'local' ); # 日の加算 my $dt_tommorow = $dt->clone; # オブジェクトのコピーを作成。 $dt_tommorow->add( days => 1 ); # DateTimeオブジェクト自身に変更が加わる。 # 月の加算 my $dt_next_month = $dt->clone; $dt_next_month->add( months => 1 ); # 年の加算 my $dt_next_year = $dt->clone; $dt_next_year->add( years => 1 ); print "現在は", $dt->date, "です。\n\n"; print "明日は", $dt_tommorow->date, "です。\n"; print "1年後は", $dt_next_month->date, "です。\n"; print "1年後は", $dt_next_year->date, "です。\n\n"; print "(1)-2 時刻の加算\n"; # 時の加算 my $dt_next_hour = $dt->clone; $dt_next_hour->add( hours => 1 ); # 分の加算 my $dt_next_minutes = $dt->clone; $dt_next_minutes->add( minutes => 1 ); # 秒の加算 my $dt_next_second = $dt->clone; $dt_next_second->add( seconds => 1 ); print "現在は", $dt->time, "です。\n\n"; print "1時間後は", $dt_next_hour->time, "です。\n"; print "1分後は", $dt_next_minutes->time, "です。\n"; print "1秒後は", $dt_next_second->time, "です。\n"; __END__
解説
(1)日付と時刻の加算
日付や時刻を加算するにはaddメソッドを使用します。引数名には、days, manths のように末尾にsがつきます。
$dt->add( days => 1 ); # 日の加算 $dt->add( months => 1 );# 月の加算 $dt->add( years => 1 );# 年の加算 $dt->add( hours => 1 );# 時の加算 $dt->add( minutes => 1 );# 分の加算 $dt->add( seconds => 1 );# 秒の加算 #まとめて加算 $dt->add( years => 1, months => 1, days => 1, hours => 1, minutes => 1, seconds => 1 );
addメソッドは、DateTimeオブジェクトそのものに変更を加えます。元のDateTimeオブジェクトを残しておきたい場合は、cloneメソッドで、元のオブジェクトをコピーします。
my $dt_clone = $dt->clone;
サイト案内
作者:perlcodesample
更新日:2008年11月18日 23時6分
[日付・時刻]実行結果 DateTime 日付の加算
実行結果
(1)-1 日付の加算 現在は2008-11-18です。 明日は2008-11-19です。 1年後は2008-12-18です。 1年後は2009-11-18です。 (1)-2 時刻の加算 現在は23:04:06です。 1時間後は00:04:06です。 1分後は23:05:06です。 1秒後は23:04:07です。
作者:perlcodesample
更新日:2008年11月18日 23時6分
[日付・時刻]DateTime 日付の書式指定 strftime
日付を書式化するためのは、strftimeメソッドを使用します。全書式をサンプルで試しています。
サンプル
DateTimeのインストールが必要です。
use strict; use warnings; use DateTime; print "(1)strftime 書式指定一覧\n"; my $dt = DateTime->now( time_zone => 'local' ); print '%a : 曜日の省略名 : ', $dt->strftime( "%a" ), "\n"; print '%A : 曜日名 : ', $dt->strftime( "%A" ), "\n"; print '%b : 月の省略名 : ', $dt->strftime( "%b" ), "\n"; print '%B : 月名 : ', $dt->strftime( "%B" ), "\n"; print '%c : デフォルトのフォーマット : ', $dt->strftime( "%c" ), "\n"; print '%C : 年の最初の2桁 : ', $dt->strftime( "%C" ), "\n"; print '%d : 日( 01 から 31 ) : ', $dt->strftime( "%d" ), "\n"; print '%D : %m/%d/%y と同じ。月日年 : ', $dt->strftime( "%D" ), "\n"; print '%e : 日( 1 から 31 ) 1桁の数字( 1 〜 9 )の2桁目はスペースになる。 : ', $dt->strftime( "%e" ), "\n"; print '%F : %Y-%m-%d と同じ( 2008-11-31 など ) : ', $dt->strftime( "%F" ), "\n"; print '%G : 年( %Yとの違いはよくわからない) : ', $dt->strftime( "%G" ), "\n"; print '%g : 年の下2桁 ( 00 〜 99 ) : ', $dt->strftime( "%g" ), "\n"; print '%h : %b と同じ。月の省略名 : ', $dt->strftime( "%h" ), "\n"; print '%H : 時( 00 から 23 ) : ', $dt->strftime( "%H" ), "\n"; print '%I : 時( 01 から 12 ) 12時間表記での時刻 : ', $dt->strftime( "%I" ), "\n"; print '%j : 年の最初から初めて何日目か。( 001 から 366 ) : ', $dt->strftime( "%j" ), "\n"; print '%k : 時( 0 から 23 ) 1桁の数字( 0〜 9 )の2桁目はスペースになる。 : ', $dt->strftime( "%k" ), "\n"; print '%l : 時( 1 から 12 ) 12時間表記での時刻 1桁の数字( 0〜 9 )の2桁目はスペースになる。 : ', $dt->strftime( "%l" ), "\n"; print '%m : 月の番号( 01 から 12 ) : ', $dt->strftime( "%m" ), "\n"; print '%M : 分( 00 から 59 ) : ', $dt->strftime( "%M" ), "\n"; print '%n : 改行文字 : ', $dt->strftime( "%n" ), "\n"; print '%N : ミリ秒( %3N と書くとミリ秒を3桁で、 %6Nと書くとミリ秒を6桁で表示 ) : ', $dt->strftime( "%3N" ), "\n"; print '%p : AM か PM : ', $dt->strftime( "%p" ), "\n"; print '%P : am か pm : ', $dt->strftime( "%P" ), "\n"; print '%r : %I:%M:%S %p と同じ。( 11:55:23 PM など) : ', $dt->strftime( "%r" ), "\n"; print '%R : 時分( 15:16 など ) : ', $dt->strftime( "%R" ), "\n"; print '%s : エポックからの秒数 : ', $dt->strftime( "%s" ), "\n"; print '%S : 秒( 00 から 61 ) : ', $dt->strftime( "%S" ), "\n"; print '%t : タブ文字 : ', $dt->strftime( "%t" ), "\n"; print '%T : %H:%M:%S と同じ。時分秒( 23:14:03 など ) : ', $dt->strftime( "%T" ), "\n"; print '%u : 曜日の番号( 1 から 7。 月曜日が1 ) : ', $dt->strftime( "%u" ), "\n"; print '%U : 年の最初から数えて何週目か。( 00 から 53 ) 年の最初の日曜日を週の最初として数える。最初の日曜日の週が01。その前の週が00。 : ', $dt->strftime( "%U" ), "\n"; print '%V : 年の最初から数えて何週目か。( 01 から 53 ) 少なくとも4日を持つ週を年の最初の週とする。月曜日を週の最初として数える。 : ', $dt->strftime( "%V" ), "\n"; print '%w : 曜日の番号( 0 から 6。 日曜日が0 ) : ', $dt->strftime( "%w" ), "\n"; print '%W : 年の最初から数えて何週目か( 00 から 53 ) 年の最初の月曜日を週の最初として数える。最初の月曜日の週が01。その前の週が00。 : ', $dt->strftime( "%W" ), "\n"; print '%x : 日付のデフォルトのフォーマット : ', $dt->strftime( "%x" ), "\n"; print '%X : 時刻のデフォルトのフォーマット : ', $dt->strftime( "%X" ), "\n"; print '%y : 年の下の2桁 : ', $dt->strftime( "%y" ), "\n"; print '%Y : 年 : ', $dt->strftime( "%Y" ), "\n"; print '%z : UTC(協定世界時)からのタイムゾーンの時刻のずれ) : ', $dt->strftime( "%z" ), "\n"; print '%Z : タイムゾーン名 : ', $dt->strftime( "%Z" ), "\n"; print '%% : % : ', $dt->strftime( "%%" ), "\n"; print '%{method} : DateTime.pm のメソッドを利用することができる。例 %{ymd} : ', $dt->strftime( "%{ymd}" ), "\n"; __END__
(1)DateTimeの書式指定
書式指定を行うには、strftimeメソッドを利用します。引数には、書式指定子を渡します。
my $dt = DateTime->now( time_zone => 'local' ); print '%a : 曜日の省略名 : ', $dt->strftime( "%a" ), "\n";
以下のように文字列を組み合わせて複数指定することもできます。
$dt->strftime( "今日の日付 : %Y年%m月%d日" );
strftime書式一覧
strftime Patternsで解説されています。
| %a | 曜日の省略名 |
| %A | 曜日名 |
| %b | 月の省略名 |
| %B | 月名 |
| %c | デフォルトのフォーマット |
| %C | 年の最初の2桁 |
| %d | 日( 01 から 31 ) |
| %D | %m/%d/%y と同じ。月日年 |
| %e | 日( 1 から 31 ) :1桁の数字( 1 〜 9 )の2桁目はスペースになる。 |
| %F | %Y-%m-%d と同じ( 2008-11-31 など ) |
| %G | 年( %Yとの違いはよくわからない) |
| %g | 年の下2桁 ( 00 〜 99 ) |
| %h | %b と同じ。月の省略名 |
| %H | 時( 00 から 23 ) |
| %I | 時( 01 から 12 ) 12時間表記での時刻 |
| %j | 年の最初から初めて何日目か。( 001 から 366 ) |
| %k | 時( 0 から 23 ) : 1桁の数字( 0〜 9 )の2桁目はスペースになる。 |
| %l | 時( 1 から 12 ) 12時間表記での時刻 : 1桁の数字( 0〜 9 )の2桁目はスペースになる。 |
| %m | 月の番号( 01 から 12 ) |
| %M | 分( 00 から 59 ) |
| %n | 改行文字 |
| %N | ミリ秒( %3N と書くとミリ秒を3桁で、 %6Nと書くとミリ秒を6桁で表示 ) |
| %p | AM か PM |
| %P | am か pm |
| %r | %I:%M:%S %p と同じ。( 11:55:23 PM など) |
| %R | 時分( 15:16 など ) |
| %s | エポックからの秒数 |
| %S | 秒( 00 から 61 ) |
| %t | タブ文字 |
| %T | %H:%M:%S と同じ。時分秒( 23:14:03 など ) |
| %u | 曜日の番号( 1 から 7。 月曜日が1 ) |
| %U | 年の最初から数えて何週目か。( 00 から 53 ) : 年の最初の日曜日を週の最初として数える。最初の日曜日の週が01。その前の週が00。 |
| %V | 年の最初から数えて何週目か。( 01 から 53 ) : 少なくとも4日を持つ週を年の最初の週とする。月曜日を週の最初として数える。 |
| %w | 曜日の番号( 0 から 6。 日曜日が0 ) |
| %W | 年の最初から数えて何週目か( 00 から 53 ) 年の最初の月曜日を週の最初として数える。最初の月曜日の週が01。その前の週が00。 |
| %x | 日付のデフォルトのフォーマット |
| %X | 時刻のデフォルトのフォーマット |
| %y | 年の下の2桁 |
| %Y | 年 |
| %z | UTC(協定世界時)からのタイムゾーンの時刻のずれ) |
| %Z | タイムゾーン名 |
| %% | % |
| %{method} | DateTime.pm のメソッドを利用することができる。例 %{ymd} |
サイト案内
作者:perlcodesample
更新日:2008年11月16日 23時12分
実行結果 DateTime 日付の書式指定 strftime
実行結果
(1)strftime 書式指定一覧
%a : 曜日の省略名 : Mon
%A : 曜日名 : Monday
%b : 月の省略名 : Nov
%B : 月名 : November
%c : デフォルトのフォーマット : Nov 17, 2008 12:09:37 AM
%C : 年の最初の2桁 : 20
%d : 日( 01 から 31 ) : 17
%D : %m/%d/%y と同じ。月日年 : 11/17/08
%e : 日( 1 から 31 ) 1桁の数字( 1 〜 9 )の2桁目はスペースになる。 : 17
%F : %Y-%m-%d と同じ( 2008-11-31 など ) : 2008-11-17
%G : 年( %Yとの違いはよくわからない) : 2008
%g : 年の下2桁 ( 00 〜 99 ) : 08
%h : %b と同じ。月の省略名 : Nov
%H : 時( 00 から 23 ) : 00
%I : 時( 01 から 12 ) 12時間表記での時刻 : 12
%j : 年の最初から初めて何日目か。( 001 から 366 ) : 322
%k : 時( 0 から 23 ) 1桁の数字( 0〜 9 )の2桁目はスペースになる。 : 0
%l : 時( 1 から 12 ) 12時間表記での時刻 1桁の数字( 0〜 9 )の2桁目はスペースになる。 : 12
%m : 月の番号( 01 から 12 ) : 11
%M : 分( 00 から 59 ) : 09
%n : 改行文字 :
%N : ミリ秒( %3N と書くとミリ秒を3桁で、 %6Nと書くとミリ秒を6桁で表示 ) : 000
%p : AM か PM : AM
%P : am か pm : am
%r : %I:%M:%S %p と同じ。( 11:55:23 PM など) : 12:09:37 AM
%R : 時分( 15:16 など ) : 00:09
%s : エポックからの秒数 : 1226848177
%S : 秒( 00 から 61 ) : 37
%t : タブ文字 :
%T : %H:%M:%S と同じ。時分秒( 23:14:03 など ) : 00:09:37
%u : 曜日の番号( 1 から 7。 月曜日が1 ) : 1
%U : 年の最初から数えて何週目か。( 00 から 53 ) : 年の最初の日曜日を週の最初として数える。最初の日曜日の週が01。その前の
週が00。 : 46
%V : 年の最初から数えて何週目か。( 01 から 53 ) : 少なくとも4日を持つ週を年の最初の週とする。月曜日を週の最初として数え
る。 : 47
%w : 曜日の番号( 0 から 6。 日曜日が0 ) : 1
%W : 年の最初から数えて何週目か( 00 から 53 ) 年の最初の月曜日を週の最初として数える。最初の月曜日の週が01。その前の週
が00。 : 46
%x : 日付のデフォルトのフォーマット : Nov 17, 2008
%X : 時刻のデフォルトのフォーマット : 12:09:37 AM
%y : 年の下の2桁 : 08
%Y : 年 : 2008
%z : UTC(協定世界時)からのタイムゾーンの時刻のずれ) : +0900
%Z : タイムゾーン名 : JST
%% : % : %
%{method} : DateTime.pm のメソッドを利用することができる。%{ymd} : 2008-11-17
作者:perlcodesample
更新日:2008年11月17日 0時22分
[読み物]Windowsでコマンドプロンプトを立ち上げずにPerlスクリプトを実行する方法
テキストファイルをちょっとだけ編集したい場合に、perlスクリプトを作成して、コマンドプロンプトを立ち上げて、ファイル名を指定して、perlを実行という手順は非常に面倒です。
デスクトップだけでテキストファイルをperlで編集する方法を紹介します。
( WndowsXPで動作確認していますが、他のWindowsではもしかしたら動かないかもしれません。)
使用方法
ファイル一式 をダウンロードして、中にある5つのファイルをデスクトップに配置します。( バッチファイルやPerlスクリプトなどです。解説は後ほど行います。)
| ファイル名 | 役割 |
| (1)perledit.bat | Perlスクリプト実行するためのバッチファイル。ここに入力ファイルをドラッグ&ドロップする。 |
| (2)perleditdebug.bat | スクリプトのデバッグ用のバッチファイル。 |
| (3)editscript.pl | 実行するスクリプト。 |
| (4)editresult.txt | 出力先のファイル。編集した内容がここに出力されます |
| (5)input.txt | 入力ファイル。入力ファイルはinput.txtという名前でなくてもなんでも大丈夫です。 |
入力ファイルをperledit.bat にドラッグ&ドロップすると、editresult.txtに編集内容が出力されます。
perleditdebug.bat はデバッグ用のバッチファイルで、スクリプトをデバッグするときに使用します。入力ファイルをperleditdebug.batにドラッグ&ドロップするとデバッガが起動します。
ファイル
(1)perledit.bat
スクリプト実行するためのバッチファイルです。
set script="%USERPROFILE%\デスクトップ\editscript.pl" set file="%1" perl %script% %file% > "%USERPROFILE%\デスクトップ\editresult.txt"
%USERPROFILE%\デスクトップ がデスクトップのパスになります。
%1でドラッグ&ドロップしたファイルを受け取ることができます。
リダイレクトで、デスクトップの editresult.txt に出力しています。
(2)perleditdebug.bat
スクリプトのデバッグ用のバッチファイルです。たいてい何回かはスクリプトがちゃんと動かないのでデバッグするためのものです。
set script="%USERPROFILE%\デスクトップ\editscript.pl" set file="%1" perl -d %script% %file%
(3)editscript.pl
実行するスクリプトです。スクリプト1,スクリプト2というところに実行したい内容を記述します。
__END__でスクリプトを終えておくと。実行したい内容をスクリプトの一番上にコピー&ペーストするだけで、実行する内容を変更することができて便利です。
#------------------------------------------------------------------------------ use strict; use warnings; my @file = @ARGV; # ディレクトリが空白を含むのでそのための対処 my $file = join( ' ', @file ); open my $fh, "<", $file or die $!; #------------------------------------------------------------------------------ ### スクリプト1 while( my $line = <$fh> ){ # ここにやりたいことを書く。 print $line; } __END__ ### スクリプト2 while( my $line = <$fh> ){ # ここにやりたいことを書く。 } __END__
(4)editresult.txt
ここに、編集した内容が出力されます。この名前のファイルが上書きされますので注意してください。
(5)input.txt
perledit.batにドラッグ&ドロップします。名前はinput.txtでなくてなんでもよいです。
ファイル名には空白を含めないほうがよいです。ファイル名はたぶん英語にしておいたほうがよいです。
サイト案内
作者:perlcodesample
更新日:2008年11月15日 13時4分
[日付・時刻]DateTime::Duration 期間を表すオブジェクト
日付と日付の間の期間を表すオブジェクト DateTime::Durationオブジェクトというものがあります。
DateTimeが日付の情報を表現するのに対して、DateTime::Duration は期間の情報を表現します。
日付にある期間を加えたり、ある期間を引いたりした場合は、addメソッドやsubstructメソッドを使用しましたが、内部的には、DateTime::Durationオブジェクトが作成された上で演算がなされています。
use strict; use warnings; use DateTime; # DateTimeオブジェクト同士の引き算 my $dt1 = DateTime->new( year => 2000 , month => 2, day => 1, hour => 12, minute => 44, second => 30 ); my $dt2 = DateTime->new( year => 2003 , month => 3, day => 19, hour => 23, minute => 54, second => 40 ); my $duration = $dt2 - $dt1; # 引き算の記号をそのまま使えます。 print "(1) 期間を取得する。\n"; print "期間は",$duration->years,"年と", $duration->months,"ヶ月と", $duration->days, "日と", $duration->hours, "時間と", $duration->minutes, "分と", $duration->seconds, "秒\n\n"; print "(2)期間の符号を判定する。\n"; if( $duration->is_positive ){ print "\$dt2は\$dt1より後の日付です。\n"; } elsif( $duration->is_zero ){ print "\$dt2は\$dt1と等しいです。\n"; } elsif( $duration->is_negative ){ print "\$dt2は\$dt1より前の日付です。\n"; } print "\n"; print "(3)期間を月換算で取得する。\n"; print "期間は月換算で", $duration->in_units( 'months' ), "ヶ月です。\n"; __END__
作者:perlcodesample
更新日:2008年11月18日 15時27分
[日付・時刻]DateTime 日付の引き算
日付の引き算には2種類あります。日付にある期間を引き算( たとえば1ヶ月前 )するものと、日付どうしの引き算( たとえば2008年10月10日と2009年3月14日の差 )するものがあります。(日付の足し算はこちら)
サンプル
DateTimeのインストールが必要です。
use strict; use warnings; use DateTime; print "(1) 日付の引き算\n"; my $dt = DateTime->now( time_zone => 'local' ); # 日の減算 my $dt_yesterday = $dt->clone; # オブジェクトのコピーを作成。 $dt_yesterday->subtract( days => 1 ); print "現在の日付は", $dt->date, "です。\n"; print "昨日の日付は", $dt_yesterday->date, "です。\n\n"; # 加算と減算を組み合わせる。 my $dt_mix = $dt->clone; $dt_mix = $dt_mix->add( months => 1 )->subtract( days => 1 ); # メソッドチェーンを利用することもできる。 =pod #またこのように短縮して記述できる。 my $dt_mix = $dt->clone->add( months => 1 )->subtract( days ); =cut print "(2)DateTimeオブジェクト同士の引き算\n"; my $dt1 = DateTime->new( year => 2000 , month => 2, day => 1 ); my $dt2 = DateTime->new( year => 2003 , month => 3, day => 19 ); my $duration = $dt2 - $dt1; # 引き算の記号をそのまま使えます。 print "期間は",$duration->years,"年と", $duration->months,"ヶ月と", $duration->days, "日\n"; __END__
解説
(1)日付の引き算
日付からある期間を減算するにはsubtractメソッドを使用します。
$dt->subtract( days => 1 ); # 日の減算 $dt->subtract( months => 1 );# 月の減算 $dt->subtract( years => 1 );# 年の減算 $dt->subtract( hours => 1 );# 時の減算 $dt->subtract( minutes => 1 );# 分の減算 $dt->subtract( seconds => 1 );# 秒の減算
(2)日付どうしの引き算
日付どうしの引き算を行うには、-記号を使って普通に計算するようにできます。(演算子のオーバーロードという機能を使って実現されています。)
戻り値は、DateTimeオブジェクトではなくて、期間を表すDateTime::Durationオブジェクトになります。
years, months, days メソッドで、期間の年月日を取得できます。
my $duration = $dt2 - $dt1; # 引き算の記号をそのまま使えます。 print "期間は",$duration->years,"年と", $duration->months,"ヶ月と", $duration->days, "日\n";
サイト案内
作者:perlcodesample
更新日:2008年11月18日 14時47分
実行結果 DateTime 日付の引き算
(1) 日付の引き算 現在の日付は2008-11-18です。 昨日の日付は2008-11-17です。 (2)DateTimeオブジェクト同士の引き算 期間は3年と1ヶ月と4日
作者:perlcodesample
更新日:2008年11月18日 14時50分
[日付・時刻]DateTime 日付の足し算
DateTimeオブジェクトは日付や時刻の計算を行うことができます。日付を加算するサンプルです。
サンプル
DateTimeのインストールが必要です。
use strict; use warnings; use DateTime; print "(1)-1 日付の足し算\n"; my $dt = DateTime->now( time_zone => 'local' ); # 日の加算 my $dt_tommorow = $dt->clone; # オブジェクトのコピーを作成。 $dt_tommorow->add( days => 1 ); # DateTimeオブジェクト自身に変更が加わる。 # 月の加算 my $dt_next_month = $dt->clone; $dt_next_month->add( months => 1 ); # 年の加算 my $dt_next_year = $dt->clone; $dt_next_year->add( years => 1 ); print "現在は", $dt->date, "です。\n\n"; print "明日は", $dt_tommorow->date, "です。\n"; print "1年後は", $dt_next_month->date, "です。\n"; print "1年後は", $dt_next_year->date, "です。\n\n"; print "(1)-2 時刻の加算\n"; # 時の加算 my $dt_next_hour = $dt->clone; $dt_next_hour->add( hours => 1 ); # 分の加算 my $dt_next_minutes = $dt->clone; $dt_next_minutes->add( minutes => 1 ); # 秒の加算 my $dt_next_second = $dt->clone; $dt_next_second->add( seconds => 1 ); print "現在は", $dt->time, "です。\n\n"; print "1時間後は", $dt_next_hour->time, "です。\n"; print "1分後は", $dt_next_minutes->time, "です。\n"; print "1秒後は", $dt_next_second->time, "です。\n"; __END__
解説
(1)日付と時刻の加算
日付や時刻を加算するにはaddメソッドを使用します。引数名には、days, manths のように末尾にsがつきます。
$dt->add( days => 1 ); # 日の加算 $dt->add( months => 1 );# 月の加算 $dt->add( years => 1 );# 年の加算 $dt->add( hours => 1 );# 時の加算 $dt->add( minutes => 1 );# 分の加算 $dt->add( seconds => 1 );# 秒の加算 #まとめて加算 $dt->add( years => 1, months => 1, days => 1, hours => 1, minutes => 1, seconds => 1 );
addメソッドは、DateTimeオブジェクトそのものに変更を加えます。元のDateTimeオブジェクトを残しておきたい場合は、cloneメソッドで、元のオブジェクトをコピーします。
my $dt_clone = $dt->clone;
サイト案内
作者:perlcodesample
更新日:2008年11月18日 14時6分
[日付・時刻]実行結果 DateTime 日付の加算
実行結果
(1)-1 日付の加算 現在は2008-11-18です。 明日は2008-11-19です。 1年後は2008-12-18です。 1年後は2009-11-18です。 (1)-2 時刻の加算 現在は23:04:06です。 1時間後は00:04:06です。 1分後は23:05:06です。 1秒後は23:04:07です。
作者:perlcodesample
更新日:2008年11月18日 14時6分
[日付・時刻]DateTime 日付の書式指定 strftime
日付を書式化するためのは、strftimeメソッドを使用します。全書式をサンプルで試しています。
サンプル
DateTimeのインストールが必要です。
use strict; use warnings; use DateTime; print "(1)strftime 書式指定一覧\n"; my $dt = DateTime->now( time_zone => 'local' ); print '%a : 曜日の省略名 : ', $dt->strftime( "%a" ), "\n"; print '%A : 曜日名 : ', $dt->strftime( "%A" ), "\n"; print '%b : 月の省略名 : ', $dt->strftime( "%b" ), "\n"; print '%B : 月名 : ', $dt->strftime( "%B" ), "\n"; print '%c : デフォルトのフォーマット : ', $dt->strftime( "%c" ), "\n"; print '%C : 年の最初の2桁 : ', $dt->strftime( "%C" ), "\n"; print '%d : 日( 01 から 31 ) : ', $dt->strftime( "%d" ), "\n"; print '%D : %m/%d/%y と同じ。月日年 : ', $dt->strftime( "%D" ), "\n"; print '%e : 日( 1 から 31 ) 1桁の数字( 1 〜 9 )の2桁目はスペースになる。 : ', $dt->strftime( "%e" ), "\n"; print '%F : %Y-%m-%d と同じ( 2008-11-31 など ) : ', $dt->strftime( "%F" ), "\n"; print '%G : 年( %Yとの違いはよくわからない) : ', $dt->strftime( "%G" ), "\n"; print '%g : 年の下2桁 ( 00 〜 99 ) : ', $dt->strftime( "%g" ), "\n"; print '%h : %b と同じ。月の省略名 : ', $dt->strftime( "%h" ), "\n"; print '%H : 時( 00 から 23 ) : ', $dt->strftime( "%H" ), "\n"; print '%I : 時( 01 から 12 ) 12時間表記での時刻 : ', $dt->strftime( "%I" ), "\n"; print '%j : 年の最初から初めて何日目か。( 001 から 366 ) : ', $dt->strftime( "%j" ), "\n"; print '%k : 時( 0 から 23 ) 1桁の数字( 0〜 9 )の2桁目はスペースになる。 : ', $dt->strftime( "%k" ), "\n"; print '%l : 時( 1 から 12 ) 12時間表記での時刻 1桁の数字( 0〜 9 )の2桁目はスペースになる。 : ', $dt->strftime( "%l" ), "\n"; print '%m : 月の番号( 01 から 12 ) : ', $dt->strftime( "%m" ), "\n"; print '%M : 分( 00 から 59 ) : ', $dt->strftime( "%M" ), "\n"; print '%n : 改行文字 : ', $dt->strftime( "%n" ), "\n"; print '%N : ミリ秒( %3N と書くとミリ秒を3桁で、 %6Nと書くとミリ秒を6桁で表示 ) : ', $dt->strftime( "%3N" ), "\n"; print '%p : AM か PM : ', $dt->strftime( "%p" ), "\n"; print '%P : am か pm : ', $dt->strftime( "%P" ), "\n"; print '%r : %I:%M:%S %p と同じ。( 11:55:23 PM など) : ', $dt->strftime( "%r" ), "\n"; print '%R : 時分( 15:16 など ) : ', $dt->strftime( "%R" ), "\n"; print '%s : エポックからの秒数 : ', $dt->strftime( "%s" ), "\n"; print '%S : 秒( 00 から 61 ) : ', $dt->strftime( "%S" ), "\n"; print '%t : タブ文字 : ', $dt->strftime( "%t" ), "\n"; print '%T : %H:%M:%S と同じ。時分秒( 23:14:03 など ) : ', $dt->strftime( "%T" ), "\n"; print '%u : 曜日の番号( 1 から 7。 月曜日が1 ) : ', $dt->strftime( "%u" ), "\n"; print '%U : 年の最初から数えて何週目か。( 00 から 53 ) 年の最初の日曜日を週の最初として数える。最初の日曜日の週が01。その前の週が00。 : ', $dt->strftime( "%U" ), "\n"; print '%V : 年の最初から数えて何週目か。( 01 から 53 ) 少なくとも4日を持つ週を年の最初の週とする。月曜日を週の最初として数える。 : ', $dt->strftime( "%V" ), "\n"; print '%w : 曜日の番号( 0 から 6。 日曜日が0 ) : ', $dt->strftime( "%w" ), "\n"; print '%W : 年の最初から数えて何週目か( 00 から 53 ) 年の最初の月曜日を週の最初として数える。最初の月曜日の週が01。その前の週が00。 : ', $dt->strftime( "%W" ), "\n"; print '%x : 日付のデフォルトのフォーマット : ', $dt->strftime( "%x" ), "\n"; print '%X : 時刻のデフォルトのフォーマット : ', $dt->strftime( "%X" ), "\n"; print '%y : 年の下の2桁 : ', $dt->strftime( "%y" ), "\n"; print '%Y : 年 : ', $dt->strftime( "%Y" ), "\n"; print '%z : UTC(協定世界時)からのタイムゾーンの時刻のずれ) : ', $dt->strftime( "%z" ), "\n"; print '%Z : タイムゾーン名 : ', $dt->strftime( "%Z" ), "\n"; print '%% : % : ', $dt->strftime( "%%" ), "\n"; print '%{method} : DateTime.pm のメソッドを利用することができる。例 %{ymd} : ', $dt->strftime( "%{ymd}" ), "\n"; __END__
(1)DateTimeの書式指定
書式指定を行うには、strftimeメソッドを利用します。引数には、書式指定子を渡します。
my $dt = DateTime->now( time_zone => 'local' ); print '%a : 曜日の省略名 : ', $dt->strftime( "%a" ), "\n";
以下のように文字列を組み合わせて複数指定することもできます。
$dt->strftime( "今日の日付 : %Y年%m月%d日" );
strftime書式一覧
strftime Patternsで解説されています。
| %a | 曜日の省略名 |
| %A | 曜日名 |
| %b | 月の省略名 |
| %B | 月名 |
| %c | デフォルトのフォーマット |
| %C | 年の最初の2桁 |
| %d | 日( 01 から 31 ) |
| %D | %m/%d/%y と同じ。月日年 |
| %e | 日( 1 から 31 ) :1桁の数字( 1 〜 9 )の2桁目はスペースになる。 |
| %F | %Y-%m-%d と同じ( 2008-11-31 など ) |
| %G | 年( %Yとの違いはよくわからない) |
| %g | 年の下2桁 ( 00 〜 99 ) |
| %h | %b と同じ。月の省略名 |
| %H | 時( 00 から 23 ) |
| %I | 時( 01 から 12 ) 12時間表記での時刻 |
| %j | 年の最初から初めて何日目か。( 001 から 366 ) |
| %k | 時( 0 から 23 ) : 1桁の数字( 0〜 9 )の2桁目はスペースになる。 |
| %l | 時( 1 から 12 ) 12時間表記での時刻 : 1桁の数字( 0〜 9 )の2桁目はスペースになる。 |
| %m | 月の番号( 01 から 12 ) |
| %M | 分( 00 から 59 ) |
| %n | 改行文字 |
| %N | ミリ秒( %3N と書くとミリ秒を3桁で、 %6Nと書くとミリ秒を6桁で表示 ) |
| %p | AM か PM |
| %P | am か pm |
| %r | %I:%M:%S %p と同じ。( 11:55:23 PM など) |
| %R | 時分( 15:16 など ) |
| %s | エポックからの秒数 |
| %S | 秒( 00 から 61 ) |
| %t | タブ文字 |
| %T | %H:%M:%S と同じ。時分秒( 23:14:03 など ) |
| %u | 曜日の番号( 1 から 7。 月曜日が1 ) |
| %U | 年の最初から数えて何週目か。( 00 から 53 ) : 年の最初の日曜日を週の最初として数える。最初の日曜日の週が01。その前の週が00。 |
| %V | 年の最初から数えて何週目か。( 01 から 53 ) : 少なくとも4日を持つ週を年の最初の週とする。月曜日を週の最初として数える。 |
| %w | 曜日の番号( 0 から 6。 日曜日が0 ) |
| %W | 年の最初から数えて何週目か( 00 から 53 ) 年の最初の月曜日を週の最初として数える。最初の月曜日の週が01。その前の週が00。 |
| %x | 日付のデフォルトのフォーマット |
| %X | 時刻のデフォルトのフォーマット |
| %y | 年の下の2桁 |
| %Y | 年 |
| %z | UTC(協定世界時)からのタイムゾーンの時刻のずれ) |
| %Z | タイムゾーン名 |
| %% | % |
| %{method} | DateTime.pm のメソッドを利用することができる。例 %{ymd} |
サイト案内
作者:perlcodesample
更新日:2008年11月16日 14時12分
実行結果 DateTime 日付の書式指定 strftime
実行結果
(1)strftime 書式指定一覧
%a : 曜日の省略名 : Mon
%A : 曜日名 : Monday
%b : 月の省略名 : Nov
%B : 月名 : November
%c : デフォルトのフォーマット : Nov 17, 2008 12:09:37 AM
%C : 年の最初の2桁 : 20
%d : 日( 01 から 31 ) : 17
%D : %m/%d/%y と同じ。月日年 : 11/17/08
%e : 日( 1 から 31 ) 1桁の数字( 1 〜 9 )の2桁目はスペースになる。 : 17
%F : %Y-%m-%d と同じ( 2008-11-31 など ) : 2008-11-17
%G : 年( %Yとの違いはよくわからない) : 2008
%g : 年の下2桁 ( 00 〜 99 ) : 08
%h : %b と同じ。月の省略名 : Nov
%H : 時( 00 から 23 ) : 00
%I : 時( 01 から 12 ) 12時間表記での時刻 : 12
%j : 年の最初から初めて何日目か。( 001 から 366 ) : 322
%k : 時( 0 から 23 ) 1桁の数字( 0〜 9 )の2桁目はスペースになる。 : 0
%l : 時( 1 から 12 ) 12時間表記での時刻 1桁の数字( 0〜 9 )の2桁目はスペースになる。 : 12
%m : 月の番号( 01 から 12 ) : 11
%M : 分( 00 から 59 ) : 09
%n : 改行文字 :
%N : ミリ秒( %3N と書くとミリ秒を3桁で、 %6Nと書くとミリ秒を6桁で表示 ) : 000
%p : AM か PM : AM
%P : am か pm : am
%r : %I:%M:%S %p と同じ。( 11:55:23 PM など) : 12:09:37 AM
%R : 時分( 15:16 など ) : 00:09
%s : エポックからの秒数 : 1226848177
%S : 秒( 00 から 61 ) : 37
%t : タブ文字 :
%T : %H:%M:%S と同じ。時分秒( 23:14:03 など ) : 00:09:37
%u : 曜日の番号( 1 から 7。 月曜日が1 ) : 1
%U : 年の最初から数えて何週目か。( 00 から 53 ) : 年の最初の日曜日を週の最初として数える。最初の日曜日の週が01。その前の
週が00。 : 46
%V : 年の最初から数えて何週目か。( 01 から 53 ) : 少なくとも4日を持つ週を年の最初の週とする。月曜日を週の最初として数え
る。 : 47
%w : 曜日の番号( 0 から 6。 日曜日が0 ) : 1
%W : 年の最初から数えて何週目か( 00 から 53 ) 年の最初の月曜日を週の最初として数える。最初の月曜日の週が01。その前の週
が00。 : 46
%x : 日付のデフォルトのフォーマット : Nov 17, 2008
%X : 時刻のデフォルトのフォーマット : 12:09:37 AM
%y : 年の下の2桁 : 08
%Y : 年 : 2008
%z : UTC(協定世界時)からのタイムゾーンの時刻のずれ) : +0900
%Z : タイムゾーン名 : JST
%% : % : %
%{method} : DateTime.pm のメソッドを利用することができる。%{ymd} : 2008-11-17
作者:perlcodesample
更新日:2008年11月16日 15時22分
[読み物]Windowsでコマンドプロンプトを立ち上げずにPerlスクリプトを実行する方法
テキストファイルをちょっとだけ編集したい場合に、perlスクリプトを作成して、コマンドプロンプトを立ち上げて、ファイル名を指定して、perlを実行という手順は非常に面倒です。
デスクトップだけでテキストファイルをperlで編集する方法を紹介します。
( WndowsXPで動作確認していますが、他のWindowsではもしかしたら動かないかもしれません。)
使用方法
ファイル一式 をダウンロードして、中にある5つのファイルをデスクトップに配置します。( バッチファイルやPerlスクリプトなどです。解説は後ほど行います。)
| ファイル名 | 役割 |
| (1)perledit.bat | Perlスクリプト実行するためのバッチファイル。ここに入力ファイルをドラッグ&ドロップする。 |
| (2)perleditdebug.bat | スクリプトのデバッグ用のバッチファイル。 |
| (3)editscript.pl | 実行するスクリプト。 |
| (4)editresult.txt | 出力先のファイル。編集した内容がここに出力されます |
| (5)input.txt | 入力ファイル。入力ファイルはinput.txtという名前でなくてもなんでも大丈夫です。 |
入力ファイルをperledit.bat にドラッグ&ドロップすると、editresult.txtに編集内容が出力されます。
perleditdebug.bat はデバッグ用のバッチファイルで、スクリプトをデバッグするときに使用します。入力ファイルをperleditdebug.batにドラッグ&ドロップするとデバッガが起動します。
ファイル
(1)perledit.bat
スクリプト実行するためのバッチファイルです。
set script="%USERPROFILE%\デスクトップ\editscript.pl" set file="%1" perl %script% %file% > "%USERPROFILE%\デスクトップ\editresult.txt"
%USERPROFILE%\デスクトップ がデスクトップのパスになります。
%1でドラッグ&ドロップしたファイルを受け取ることができます。
リダイレクトで、デスクトップの editresult.txt に出力しています。
(2)perleditdebug.bat
スクリプトのデバッグ用のバッチファイルです。たいてい何回かはスクリプトがちゃんと動かないのでデバッグするためのものです。
set script="%USERPROFILE%\デスクトップ\editscript.pl" set file="%1" perl -d %script% %file%
(3)editscript.pl
実行するスクリプトです。スクリプト1,スクリプト2というところに実行したい内容を記述します。
__END__でスクリプトを終えておくと。実行したい内容をスクリプトの一番上にコピー&ペーストするだけで、実行する内容を変更することができて便利です。
#------------------------------------------------------------------------------ use strict; use warnings; my @file = @ARGV; # ディレクトリが空白を含むのでそのための対処 my $file = join( ' ', @file ); open my $fh, "<", $file or die $!; #------------------------------------------------------------------------------ ### スクリプト1 while( my $line = <$fh> ){ # ここにやりたいことを書く。 print $line; } __END__ ### スクリプト2 while( my $line = <$fh> ){ # ここにやりたいことを書く。 } __END__
(4)editresult.txt
ここに、編集した内容が出力されます。この名前のファイルが上書きされますので注意してください。
(5)input.txt
perledit.batにドラッグ&ドロップします。名前はinput.txtでなくてなんでもよいです。
ファイル名には空白を含めないほうがよいです。ファイル名はたぶん英語にしておいたほうがよいです。
サイト案内
作者:perlcodesample
更新日:2008年11月15日 4時4分
