干支

wikipedia:干支

干支(かんし、えと、中国語: 干支、ピンイン: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>

干支による紀日
https://ja.wikipedia.org/wiki/%E5%B9%B2%E6%94%AF#%E5%B9%B2%E6%94%AF%E3%81%AB%E3%82%88%E3%82%8B%E7%B4%80%E6%97%A5

干支による紀年
https://ja.wikipedia.org/wiki/%E5%B9%B2%E6%94%AF#%E5%B9%B2%E6%94%AF%E3%81%AB%E3%82%88%E3%82%8B%E7%B4%80%E5%B9%B4




干支紀日の求め方
https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E9%80%9A%E6%97%A5#%E5%B9%B2%E6%94%AF%E7%B4%80%E6%97%A5%E3%81%AE%E6%B1%82%E3%82%81%E6%96%B9

該当日の修正ユリウス日を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丁亥 

あってるかな?