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