日付や時刻に関して、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