Skip to content

Instantly share code, notes, and snippets.

@komasaru
Created August 5, 2013 04:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save komasaru/6153584 to your computer and use it in GitHub Desktop.
Save komasaru/6153584 to your computer and use it in GitHub Desktop.
Ruby script to calc the number of days.
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 1
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment