■Windows版Perlの細道・けもの道

■ナビゲータ

[南北館(最初のメニュー)]

  1. [Windows版Perlの細道・けもの道]
    1. [1.準備編]
    2. [2.基本編]
    3. [3.応用編]
      1. [3-1.固定長データとCSVデータとの変換]
      2. [3-2.重複データの処理]
      3. [3-3.フォルダ内の一括処理]
      4. [3-4.1つのファイルを複数のファイルに分割する]
      5. [3-5.文字コードの変換]
      6. [3-6.半角全角変換]
      7. [3-7.多次元配列の処理]
      8. [3-9.その他]
        1. [3-9-1.文字列のフォーマットを変更する]
        2. [3-9-2.メッセージを表示する]
        3. [3-9-3.ファイルのサイズを取得する]
        4. [3-9-4.当日・前日・前営業日、前月末日・当月末日・翌月末日を取得する]
        5. [3-9-5.複数レコードを1レコードにまとめる]
        6. [3-9-6.電卓プログラム]
        7. [3-9-7.素因数分解]
    4. [スクリプトと入力データのサンプル]
rubyではどう処理する?
同じことをrubyではこうしています。

3.応用編

3-9.その他

3-9-4.当日・前日・前営業日、前月末日・当月末日・翌月末日を取得する

今日の日付は「localtime」関数で取得します。実際には、「(秒,分,時,日,月,年,週,ユリウス日,サマータイムのフラグ) = localtime();」のような形式で指定し、結果は9項目(リスト)にセットされます。

ただし、以下の点に注意が必要です。

  1. 日、時、分、秒については、それぞれ数値でセットされます。
  2. 月については、0から11までの数値でセットされます。すなわち、0は1月を、11は12月を意味します。
  3. 年は1900年以後の年数で示されるため、1999年は「99」、2001年は「101」となっています。4桁の年号として利用するためには、1900を加算することになります。
  4. 「週」は0が日曜日、6が土曜日を表しています。
  5. ユリウス日は、1月1日からの累計の日数をあらわしています。ただし、第1日目が「0」になっていることに注意することが必要です。したがって、平年であれば12月31日が「364」、閏年であれば「365」となっています。
  6. サマータイムのフラグはサマータイムの時期かどうかを示すものですが、2006年現在の日本でサマータイムが実施されていないので、あまり関係ないといってよいでしょう。

前日の日付を取得するには、1日を秒数で表した86400秒(=24時間×60分×60秒)を引くことで求められます。

前営業日の算出では、国民の休日を考慮に入れるため、「Calendar::Japanese::Holiday」モジュールを使用しています。「Calendar::Japanese::Holiday」はインストールが必要ですので、PPM(Perl Package Manager)を使って、インストールします。インストール方法は[2-1-5.PPM(Perl Package Manager)によるモジュールのインストール]を参照してください。

前月末日は当月1日の前日を算出する方法を使っています。当月末日・翌月末日も同様の方法で算出しています。

【スクリプト】
# date.pl   
# 内容 :当日・前日・前営業日、前月末日・当月末日・翌月末日を取得する    
# Copyright (c) 2002-2011 Mitsuo Minagawa, All rights reserved.
# (minagawa@fb3.so-net.ne.jp)  
#使用方法 : c:\>perl date.pl    
use Time::Local qw( timelocal );    
use Calendar::Japanese::Holiday;    

open(OUT1,">output.txt");   

#   
# 当日の日時を取得  
#   
($sec,$min,$hours,$day,$month,$year,$wday,$yday,$isdst) = localtime();  
$year   =   $year   +   1900;   
$month  =   $month  +   1;  
print   OUT1    "当日 = ",$year,"/",$month,"/",$day," ",$hours,":",$min,":",$sec."\n";  
#   
# 前日の日時を取得:24時間×60分×60秒前 
#   
($sec,$min,$hours,$day,$month,$year,$wday,$yday,$isdst) = localtime(time - 86400);      
$year   =   $year   +   1900;   
$month  =   $month  +   1;  
print   OUT1    "前日 = ",$year,"/",$month,"/",$day," ",$hours,":",$min,":",$sec."\n";  

# 前営業日の日付を取得する(国民の祝日も考慮する)  
# (火曜日から金曜日までは前日、月曜日は、前週の金曜日とする)  
#   
($sec,$min,$hours,$day,$month,$year)    = (localtime(time - 86400))[0,1,2,3,4,5];   
$w_time = timelocal( $sec, $min, $hours, $day, $month, $year ); 
$w_year     =   $year   +   1900;   
$w_month    =   $month  +   1;  
$w_day      =   $day;   
#while  ($wday == 0 or $wday == 6)      {   #土曜日・日曜日は繰り返す   
while   (($wday == 0 or $wday == 6)  #土曜日・日曜日は繰り返す  
    or  (isHoliday($w_year, $w_month, $w_day))) { #国民の休日は除く 
        $w_time =   $w_time -   86400;  
        ($day,$month,$year,$wday)   =   (localtime($w_time))[3,4,5,6];  
        $w_year     =   $year   +   1900;   
        $w_month    =   $month  +   1;  
        $w_day      =   $day;   
}   
print   OUT1    "前営業日 = ",$w_year,"/",$w_month,"/",$w_day,"\n"; 
#   
# 前月末日を取得:(当月1日の前日)    
#   
($sec,$min,$hours,$day,$month,$year)    = (localtime())[0,1,2,3,4,5];   

$day    =   1;  

$w_time = timelocal( $sec, $min, $hours, $day, $month, $year ); 

($day,$month,$year) = (localtime($w_time - 86400))[3,4,5];  
$year   =   $year   +   1900;   
$month  =   $month  +   1;  
print   OUT1    "前月末日 = ",$year,"/",$month,"/",$day,"\n";   

#   
# 当月末日を取得:(翌月1日の前日)    
#   
($sec,$min,$hours,$day,$month,$year)    = (localtime())[0,1,2,3,4,5];   

$day    =   1;  

if      ($month     ==  11)     {   #12月なら翌年1月    
        $year       =   $year   +   1;  
        $month      =   1;  
}   
else                        {   
        $month      =   $month  +   1;  
}   

$w_time = timelocal( $sec, $min, $hours, $day, $month, $year ); 

($day,$month,$year) = (localtime($w_time - 86400))[3,4,5];  
$year   =   $year   +   1900;   
$month  =   $month  +   1;  
print   OUT1    "当月末日 = ",$year,"/",$month,"/",$day,"\n";   

#   
# 翌月末日を取得:(翌々月1日の前日)  
#   
($sec,$min,$hours,$day,$month,$year)    = (localtime())[0,1,2,3,4,5];   

$day    =   1;  

if      ($month     ==  11)     {   #12月なら翌年2月    
        $year       =   $year   +   1;  
        $month      =   2;  
}   
elsif   ($month     ==  10)     {   #11月なら翌年1月    
        $year       =   $year   +   1;  
        $month      =   1;  
}   
else                        {   
        $month      =   $month  +   2;  
}   

$w_time = timelocal( $sec, $min, $hours, $day, $month, $year ); 

($day,$month,$year) = (localtime($w_time - 86400))[3,4,5];  
$year   =   $year   +   1900;   
$month  =   $month  +   1;  
print   OUT1    "翌月末日 = ",$year,"/",$month,"/",$day,"\n";   

close(OUT1);    
    
【スクリプトとデータのサンプル】

スクリプトはこちらにあります。

【出力結果】
当日 = 2011/9/4 21:55:10
前日 = 2011/9/3 21:55:10
前営業日 = 2011/09/02
前月末日=2011/8/31
当月末日=2011/9/30
翌月末日=2011/10/31
    



Copyright (c) 2004-2013 Mitsuo Minagawa, All rights reserved.