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

■ナビゲータ

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

  1. [Windows版Rubyの細道・けもの道]
    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. [スクリプトと入力データのサンプル]
Perlではどう処理する?
同じことをPerlではこうしています。

3.応用編

3-9.その他

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

日付や時刻に関して、rubyでは「Timeクラス」、「Dateクラス」、「DateTimeクラス」という3種類のクラスがあります。Timeクラスは主としてシステム内の時刻を表現するためのクラスで、1秒が単位となります。Dateクラスは時刻を持たない日付を表現するクラスで、1日が単位となります。DateTimeクラスはDateクラスのサブクラスで、同様に1日が単位となります。

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

前営業日の算出では、国民の休日を考慮に入れるため、「date2」ライブラリを使用しています。「date2」については、http://www.funaba.org/ruby.htmlを参照してください。

前月末日・当月末日・翌月末日は末日を「-1」と指定することで算出できます。

また、printメソッドの引数で全角文字を使うため、マジックコメントを使っています。マジックコメントについては[2-1-5.スクリプトの中で漢字を使う]を参照してください。ただし、ruby1.8以前で実行するには、$KCODEを使用します。$KCODEについても[2-1-5.スクリプトの中で漢字を使う]を参照してください。

Timeクラスの場合、今日の日付は

        Time.now
   

で求めますが、Dateクラスの場合、今日の日付は

        DateTime.now
   

で求めます。

また、日付や時刻を文字列編集した結果が必要な場合は、「strftimeメソッド」を利用します。具体的には、「strftime(format文字列)」のように指定し、「format文字列」にしたがって、日付や時刻を編集した結果をセットします。Perlのように月が0から11までの数値でセットされたり、年が1900を引いた数値になっていないので、わかりやすくなっています。

format文字列 内  容
%A 英語表記の曜日の名称(例:Sunday,Monday・・・)
%a 英語表記の曜日の略称(例:Sun,Mon・・・)
%B 英語表記の月の名称(例:January,February・・・)
%b 英語表記の月の略称(例:Jan,Feb・・・)
%c 日付と時刻(英語表記の曜日の略称 英語表記の月の略称 日 時:分:秒 4桁の年)を表示する。%a %b %d %X %Yと同じ。
例:Mon Apr 14 15:38:49 2003)
%d 日(例:01〜31)
%H 24時間制の時(例:00〜23)
%l 12時間制の時(例:01〜12)
%j 1月1日からの通算日(例:001〜366)
%M 分(例:00〜59)
%m 月(例:01〜12)
%p 午前(例:AM)または午後(例:PM)
%S 秒(例:00〜59)
%U 1年の最初の日曜日を第1週の始まりとしたときの第xx週目
(例:00〜53)
%W 1年の最初の月曜日を第1週の始まりとしたときの第xx週目
(例:00〜53)
%w 曜日を数値で表した数(例:0〜6)
 0:日曜日、1:月曜日・・・6:土曜日
%X 時刻(時:分:秒 例:15:38:49)
%x 日付(月/日/年の下2桁 例:04/14/03→2003年4月14日)
%Y 西暦の4桁の年
%y 西暦の下2桁の年
%Z タイムゾーン(例:東京 (標準時))
%z タイムゾーン(例:+0900)(注)標準時から9時間進んでいることを意味する
%% %という文字そのものを表記する
【スクリプト】
# coding:windows-31j    
# date.rb   
# 内容 :当日・前日・前営業日、前月末日・当月末日・翌月末日を取得する    
# Copyright (c) 2002-2015 Mitsuo Minagawa, All rights reserved. 
# (minagawa@fb3.so-net.ne.jp)   
# 使用方法 : c:\>ruby date.rb   
#   
require "time"  
require "date"  
require "date/holiday"  

# 出力ファイル  
out1_file   =   open("output.txt","w")  

#w_date =   DateTime.now    
#out1_file.print    "今日の日時 = #{w_date}\n"  
w_date  =   DateTime.now.strftime("%Y/%m/%d")   
out1_file.print "今日の日付 = #{w_date}\n"  
#w_date2    =   DateTime.now.strftime("%x   %X")    
#out1_file.print    "今日の日時 月/日/年 および時刻 = #{w_date2}\n"    
#   
# 前日を取得    
#   
w_date  =   Time.now    
w_date  =   w_date - 86400  
w_date3 =   w_date.strftime("%Y/%m/%d") 
out1_file.print "前日の日付 = #{w_date3}\n" 
w_date  =   DateTime.now    
w_date  =   w_date - 1  
w_date3 =   w_date.strftime("%Y/%m/%d") 
out1_file.print "前日の日付 = #{w_date3}\n" 
# 前営業日の日付を取得する(国民の祝日等は考慮しないものとする)    
# (火曜日から金曜日までは前日、月曜日は、前週の金曜日とする)  
#   
w_date  =   DateTime.now    
#w_date =   Date.new(2011, 5, 6)    
w_date  =   w_date - 1  
w_week  =   w_date.strftime("%w")   
while   ((w_week <= "0" || w_week >= "6")   or  #土曜日・日曜日は繰り返す   
        (w_date.national_holiday?)) 
        w_date  =   w_date - 1  
        w_week  =   w_date.strftime("%w")   
end 
w_date3 =   w_date.strftime("%Y/%m/%d") 
out1_file.print "前営業日 = #{w_date3}\n"   
#   
# 前月末日を取得:   
#   
w_date  =   DateTime.now    

if      (w_date.month   ==  1)          # 1月の場合 
        w_year  =   w_date.year -   1   # 前年の12月にする。    
        w_month =   12  
else    
        w_year  =   w_date.year 
        w_month =   w_date.month    -   1   # 前月にする。  
end 

w_date  =   Date.new(w_year,w_month,-1) 
w_date4 =   w_date.strftime("%Y/%m/%d")     
out1_file.print "前月末日 = #{w_date4}\n"       

#   
# 当月末日を取得:   
#   
w_date  =   DateTime.now    

w_year  =   w_date.year 
w_month =   w_date.month    

w_date  =   Date.new(w_year,w_month,-1) 
w_date4 =   w_date.strftime("%Y/%m/%d")     
out1_file.print "当月末日 = #{w_date4}\n"       

#   
# 翌月末日を取得:   
#   
w_date  =   DateTime.now    

if      (w_date.month   ==  12)         # 12月の場合    
        w_year  =   w_date.year +   1   # 翌年の1月にする。 
        w_month =   1   
else    
        w_year  =   w_date.year 
        w_month =   w_date.month    +   1   # 翌月にする。  
end 

w_date  =   Date.new(w_year,w_month,-1) 
w_date4 =   w_date.strftime("%Y/%m/%d")     
out1_file.print "翌月末日 = #{w_date4}\n"       

# ファイルのクローズ    
out1_file.close 
   
【スクリプトとデータのサンプル】

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

【出力結果】
今日の日付 = 2011/09/05
前日の日付 = 2011/09/04
前日の日付 = 2011/09/04
前営業日 = 2011/09/02
前月末日 = 2011/08/31
当月末日 = 2011/09/30
翌月末日 = 2011/10/31
    


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