メニュー

関連ページリンク

トップ > 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";

サイト案内

  • DateTimeの目次へ
  • 目次へ
  • トップページへ
  • 作者: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;
    

     

    サイト案内

  • DateTimeの目次へ
  • 目次へ
  • トップページへ
  • 作者: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桁で表示 )
    %pAM か PM
    %Pam か 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
    %zUTC(協定世界時)からのタイムゾーンの時刻のずれ)
    %Zタイムゾーン名
    %%%
    %{method}DateTime.pm のメソッドを利用することができる。例 %{ymd}

    サイト案内

  • DateTimeの目次へ
  • 目次へ
  • トップページへ
  • 作者: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スクリプトなどです。解説は後ほど行います。)

    f:id:perlcodesample:20081115130654g:image

    ファイル名役割
    (1)perledit.batPerlスクリプト実行するためのバッチファイル。ここに入力ファイルをドラッグ&ドロップする。
    (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";
    

    サイト案内

  • DateTimeの目次へ
  • 目次へ
  • トップページへ
  • 作者: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;
    

     

    サイト案内

  • DateTimeの目次へ
  • 目次へ
  • トップページへ
  • 作者: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桁で表示 )
    %pAM か PM
    %Pam か 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
    %zUTC(協定世界時)からのタイムゾーンの時刻のずれ)
    %Zタイムゾーン名
    %%%
    %{method}DateTime.pm のメソッドを利用することができる。例 %{ymd}

    サイト案内

  • DateTimeの目次へ
  • 目次へ
  • トップページへ
  • 作者: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スクリプトなどです。解説は後ほど行います。)

    f:id:perlcodesample:20081115130654g:image

    ファイル名役割
    (1)perledit.batPerlスクリプト実行するためのバッチファイル。ここに入力ファイルをドラッグ&ドロップする。
    (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分

    このブログのホーム