干支(かんし、えと、中国語: 干支、ピンイン:gānzhī)は、十干と十二支を組み合わせた60を周期とする数詞。
$ irb irb(main):001:0> hs = ['甲','乙','丙','丁','戊','己','庚','辛','壬','癸'] => ["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"] irb(main):003:0> eb = ['子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥'] => ["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"] irb(main):008:0> for i in 0..59 irb(main):009:1> print "#{hs[ i % 10 ]}#{eb[ i % 12 ]} " irb(main):010:1> end 甲子 乙丑 丙寅 丁卯 戊辰 己巳 庚午 辛未 壬申 癸酉 甲戌 乙亥 丙子 丁丑 戊寅 己卯 庚辰 辛巳 壬午 癸未 甲申 乙酉 丙戌 丁亥 戊子 己丑 庚寅 辛卯 壬辰 癸巳 甲午 乙未 丙申 丁酉 戊戌 己亥 庚子 辛丑 壬寅 癸卯 甲辰 乙巳 丙午 丁未 戊申 己酉 庚戌 辛亥 壬子 癸丑 甲寅 乙卯 丙辰 丁巳 戊午 己未 庚申 辛酉 壬戌 癸亥 => 0..59 irb(main):011:0>
該当日の修正ユリウス日を60で割って余りを求める。
修正ユリウス日(MJD)
https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E9%80%9A%E6%97%A5#%E4%BF%AE%E6%AD%A3%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E6%97%A5%EF%BC%88MJD%EF%BC%89
グレゴリオ暦から修正ユリウス日への換算
https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E9%80%9A%E6%97%A5#%E3%82%B0%E3%83%AC%E3%82%B4%E3%83%AA%E3%82%AA%E6%9A%A6%E3%81%8B%E3%82%89%E4%BF%AE%E6%AD%A3%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E6%97%A5%E3%81%B8%E3%81%AE%E6%8F%9B%E7%AE%97
修正ユリウス日が導入された理由
https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E9%80%9A%E6%97%A5#%E4%BF%AE%E6%AD%A3%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E6%97%A5%E3%81%8C%E5%B0%8E%E5%85%A5%E3%81%95%E3%82%8C%E3%81%9F%E7%90%86%E7%94%B1
ユリウス通日の考案
https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E9%80%9A%E6%97%A5#%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E9%80%9A%E6%97%A5%E3%81%AE%E8%80%83%E6%A1%88
ユリウス日(理科年表オフィシャルサイト)
https://www.rikanenpyo.jp/kaisetsu/koyomi/koyomi_011.html
干支を表示するcalを作るぞ
(hscal.rb)
#!/usr/bin/env ruby require 'date' HS = ['甲寅','乙卯','丙辰','丁巳','戊午','己未','庚申','辛酉','壬戌','癸亥', '甲子','乙丑','丙寅','丁卯','戊辰','己巳','庚午','辛未','壬申','癸酉', '甲戌','乙亥','丙子','丁丑','戊寅','己卯','庚辰','辛巳','壬午','癸未', '甲申','乙酉','丙戌','丁亥','戊子','己丑','庚寅','辛卯','壬辰','癸巳', '甲午','乙未','丙申','丁酉','戊戌','己亥','庚子','辛丑','壬寅','癸卯', '甲辰','乙巳','丙午','丁未','戊申','己酉','庚戌','辛亥','壬子','癸丑'] if ARGV.size == 0 date = Date.today elsif ARGV[0] =~ /^(\d+)$/ date = Date.parse("#{$1}-01-01") elsif ARGV[0] =~ /^(\d+)-([1-9]|0[1-9]|1[0-2])$/ date = Date.parse("#{$1}-#{$2}-01") elsif ARGV[0] =~ /^(\d+)-([1-9]|0[1-9]|1[0-2])-([1-9]|0[1-9]|1[0-9]|2[0-9]|3[01])$/ date = Date.parse("#{$1}-#{$2}-#{$3}") else puts "invalid argument" exit(0) end day = date.day month = date.month year = date.year lastday = Date.new(year, month, -1).day if month == 1 month = 13 year -= 1 elsif month == 2 month = 14 year -= 1 else #pass end mjd = ( 365.25 * year.to_f ).to_i + ( year.to_f / 400.to_f ).to_i - ( year.to_f / 100.to_f ).to_i + ( 30.59 * ( month.to_f - 2.to_f ) ).to_i + 1 - 678912 month = date.month year = date.year printf "%d年%2d月\n", year, month puts "Sun Mon Tue Wed Thu Fri Sat " cwday = mjd % 7 i = cwday while i % 7 != 4 print " " i -= 1 end (1..lastday).each do |d| printf "%2d%s ", d, HS[ ( mjd + d - 1 ) % 60 ] if cwday % 7 == 3 print "\n" end cwday += 1 end print "\n"
使ってみる。
$ ./hscal.rb 2022年 9月 Sun Mon Tue Wed Thu Fri Sat 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丙戌 $ ./hscal.rb 2022 2022年 1月 Sun Mon Tue Wed Thu Fri Sat 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甲申 $ ./hscal.rb 2022-11 2022年11月 Sun Mon Tue Wed Thu Fri Sat 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丁亥
あってるかな?