1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
| require 'date'
# 使用方法
USAGE = <<"EOS"
USAGE : ruby calc_num_of_days.rb DATE_FROM DATE_TO
- The formart of DATE_FROM and DATE_TO is "YYYYMMDD".
EOS
# [CLASS] 引数
class Arg
def initialize
@date_f = ""
@date_t = ""
end
def check
begin
# 引数の数が2個以外はエラー
if ARGV.length == 2
# 日付桁数チェック
return false unless ARGV[0].to_s =~ /^\d{8}$/
return false unless ARGV[1].to_s =~ /^\d{8}$/
# 日付妥当性チェック ( FROM )
y_f = ARGV[0].to_s[0,4].to_i
m_f = ARGV[0].to_s[4,2].to_i
d_f = ARGV[0].to_s[6,2].to_i
if Date.valid_date?(y_f, m_f, d_f)
@date_f = ARGV[0].to_s
else
return false
end
# 日付妥当性チェック ( TO )
y_t = ARGV[1].to_s[0,4].to_i
m_t = ARGV[1].to_s[4,2].to_i
d_t = ARGV[1].to_s[6,2].to_i
if Date.valid_date?(y_t, m_t, d_t)
@date_t = ARGV[1].to_s
else
return false
end
else
return false
end
return true
rescue => e
STDERR.puts "[EXCEPTION][#{self.class.name}.check] #{e}"
exit! 1
end
end
def get_date(n)
return n == 1 ? @date_f : @date_t
end
end
# [CLASS] 計算
class Calc
def initialize(date_f, date_t)
@date_f = date_f
@date_t = date_t
end
def calc
begin
# 日付 ( FROM )
y = @date_f[0,4].to_i
m = @date_f[4,2].to_i
d = @date_f[6,2].to_i
jd_f = calc_jd(0, y, m, d)
jd2_f = calc_jd(1, y, m, d)
puts "[ #{y}年#{sprintf("%02d", m)}月#{sprintf("%02d", d)}日 ]"
puts "\t ユリウス日 : #{sprintf("%9.1f", jd_f)} 日"
puts "\t修正ユリウス日 : #{sprintf("%9.1f", jd2_f)} 日"
# 日付 ( TO )
y = @date_t[0,4].to_i
m = @date_t[4,2].to_i
d = @date_t[6,2].to_i
jd_t = calc_jd(0, y, m, d)
jd2_t = calc_jd(1, y, m, d)
puts "[ #{y}年#{sprintf("%02d", m)}月#{sprintf("%02d", d)}日 ]"
puts "\t ユリウス日 : #{sprintf("%9.1f", jd_t)} 日"
puts "\t修正ユリウス日 : #{sprintf("%9.1f", jd2_t)} 日"
# 日数
puts "[[ 経過日数 ]]\n\t#{jd_t - jd_f} 日"
rescue => e
STDERR.puts "[EXCEPTION][#{self.class.name}.calc] #{e}"
exit 1
end
end
private
# ユリウス日計算
# kbn : 0 ( ユリウス日 )
# 1 ( 修正ユリウス日 )
def calc_jd(kbn, y, m, d)
jd = (365.25 * y).truncate
jd += (y / 400).truncate
jd -= (y / 100).truncate
jd += (30.59 * (m - 2)).truncate
jd += d
if kbn == 0
jd += 1721088.5
else
jd -= 678912
end
end
end
#### MAIN ####
if __FILE__ == $0
# 引数チェック( エラーなら終了 )
obj_arg = Arg.new
unless obj_arg.check
puts USAGE
exit!
end
# 日付取得
date_f = obj_arg.get_date(1)
date_t = obj_arg.get_date(2)
# 日数計算
obj_calc = Calc.new(date_f, date_t)
obj_calc.calc
end
|