Skip to content

Instantly share code, notes, and snippets.

@eienf
Created March 21, 2017 12:19
Show Gist options
  • Save eienf/ed9a62f3935318711ef824a173b5375a to your computer and use it in GitHub Desktop.
Save eienf/ed9a62f3935318711ef824a173b5375a to your computer and use it in GitHub Desktop.
Julian Day Conversion Utility Functions
import Foundation
func jdFromDate(date : NSDate) -> Double {
let JD_JAN_1_1970_0000GMT = 2440587.5
return JD_JAN_1_1970_0000GMT + date.timeIntervalSince1970 / 86400
}
func dateFromJd(jd : Double) -> NSDate {
let JD_JAN_1_1970_0000GMT = 2440587.5
return NSDate(timeIntervalSince1970: (jd - JD_JAN_1_1970_0000GMT) * 86400)
}
func date(year: Int, month: Int, day: Int) -> NSDate {
let comps = NSDateComponents()
comps.year = year
comps.month = month
comps.day = day
comps.hour = 12
let gregorian = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
let date = gregorian?.dateFromComponents(comps)
return date!
}
func dateFromISO8601(string:String) -> NSDate {
var array = string.componentsSeparatedByString("-")
array = array.reverse()
var year = 1970, month = 1, day = 1
if array.count >= 3 {
year = Int(array[2]) ?? year
}
if array.count >= 2 {
month = Int(array[1]) ?? year
}
if array.count >= 1 {
day = Int(array[0]) ?? year
}
return date(year, month: month, day: day)
}
func dateByJapaneseCalendar(era: Int, year: Int, month:Int, day:Int ) -> NSDate {
let comps = NSDateComponents()
comps.era = era
comps.year = year
comps.month = month
comps.day = day
comps.hour = 12
let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierJapanese)
let date = calendar?.dateFromComponents(comps)
return date!
}
func dateByChineseCalendar(year: Int, month:Int, day:Int ) -> NSDate {
let comps = NSDateComponents()
comps.year = year
comps.month = month
comps.day = day
let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierRepublicOfChina)
let date = calendar?.dateFromComponents(comps)
return date!
}
func jdFromMjd(mjd:Double) -> Double {
let MJD_BASE_18581117 = 2400000.5
return mjd + MJD_BASE_18581117
}
func mjdFromJd(jd:Double) -> Double {
let MJD_BASE_18581117 = 2400000.5
return jd - MJD_BASE_18581117
}
func ldFromJd(jd:Double) -> Int {
let LILIAN_DAY_BASE = 2_299_159.5
return Int(jd - LILIAN_DAY_BASE)
}
func jdFromLd(ld:Int) -> Double {
let LILIAN_DAY_BASE = 2_299_159.5
return Double(ld) + LILIAN_DAY_BASE
}
func jdFromGregorianDate(date:NSDate) -> Double {
let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
let flags = NSCalendarUnit([.Year,.Month,.Day])
guard let comps = calendar?.components(flags, fromDate: date) else {
return 2440587.5
}
let year = comps.year, month = comps.month, day = comps.day
let y = year + (month - 3)/12
let m = (month - 3) % 12
let d = day - 1
let n = d + (153 * m + 2) / 5 + 365 * y + y / 4 - y / 100 + y / 400
let mjd = n - 678881
let jd = Double(mjd) + 2400000.5
return jd
}
func gregorianDateFromJd(jd:Double) -> NSDate {
let mjd = jd - 2400000.5
let n = Int(mjd) + 678881
let a = 4 * n + 3 + 4 * ( ( ( 4 * ( n + 1 ) / 146097 ) + 1 ) * 3 / 4 )
let b = 5 * ( ( a % 1461 ) / 4 ) + 2
let y = a / 1461
let m = b / 153
let d = ( b % 153 ) / 5
let day = d + 1
let month = ( m + 3 ) % 12
let year = y - m / 12
return date(year, month: month, day: day)
}
func jdFromJulianDate(year: Int, month: Int, day: Int ) -> Double {
let y = year + (month - 3)/12
let m = (month - 3) % 12
let d = day - 1
let n = d + (153 * m + 2) / 5 + 365 * y + y / 4
let mjd = n - 678883
let jd = Double(mjd) + 2400000.5
return jd
}
func julianDateFromJd(jd:Double) -> NSDateComponents {
let mjd = jd - 2400000.5
let n = Int(mjd) + 678883
let a = 4 * n + 3
let b = 5 * ( ( a % 1461 ) / 4 ) + 2
let y = a / 1461
let m = b / 153
let d = ( b % 153 ) / 5
let day = d + 1
let month = ( m + 3 ) % 12
let year = y - m / 12
let comps = NSDateComponents()
comps.year = year
comps.month = month
comps.day = day
return comps
}
// 0 = Wednesday, 1 = Thursday, 2 = Friday, 3 = Saturday,
// 4 = Sunday, 5 = Monday, 6 = Tuesday
func weekdayFromMjd_Wednesday0(mjd:Double) -> Int {
return Int(mjd) % 7
}
// 1 = Sunday, 2 = Monday, 3 = Tuesday
// 4 = Wednesday, 5 = Thursday, 6 = Friday, 7 = Saturday,
func weekdayFromMjd(mjd:Double) -> Int {
let weekday = weekdayFromMjd_Wednesday0(mjd)
return ( weekday + 3 ) % 7 + 1
}
func weekdayFromJd(jd:Double) -> Int {
let mjd = mjdFromJd(jd)
return weekdayFromMjd(mjd)
}
enum Weekday : Int {
case Sunday = 1
case Monday
case Tuesday
case Wednesday
case Thursday
case Friday
case Saturday
}
// 余り 0 1 2 3 4 5 6 7 8 9 10 11
// 十二支 寅 卯 辰 巳 午 未 申 酉 戌 亥 子 丑
func juunisiFromMjd_Tora0(mjd:Double) -> Int {
return Int(mjd) % 12
}
// 余り 0 1 2 3 4 5 6 7 8 9 10 11
// 十二支 子 丑 寅 卯 辰 巳 午 未 申 酉 戌 亥
func juunisiFromMjd(mjd:Double) -> Int {
return ( juunisiFromMjd_Tora0(mjd) + 2 ) % 12
}
enum Juunisi : Int {
case Ne = 0
case Usi
case Tora
case U
case Tatu
case Mi
case Uma
case Hituji
case Saru
case Tori
case Inu
case I
}
// 余り 0 1 2 3 4 5 6 7 8 9
// 十干 甲 乙 丙 丁 戊 己 庚 辛 壬 癸
func jikanFromMjd(mjd:Double) -> Int {
return Int(mjd) % 10
}
func jikanFromJd(jd:Double) -> Int {
return jikanFromMjd(mjdFromJd(jd))
}
enum Jikan : Int {
case Kinoe = 1
case Kinoto
case Hinoe
case Hinoto
case Tutinoe
case Tutinoto
case Kanoe
case Kanoto
case Mizunoe
case Mizunoto
}
// 0 = 甲寅
func kansiFromMjd_KinoeTora0(mjd:Double) -> Int {
return Int(mjd) % 60
}
// 0 = 甲子
func kansiFromMjd(mjd:Double) -> Int {
return ( kansiFromMjd_KinoeTora0(mjd) + 50 ) % 60
}
func kansiFromJd(jd:Double) -> Int {
return kansiFromMjd(mjdFromJd(jd))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment