Created
March 21, 2017 12:19
-
-
Save eienf/ed9a62f3935318711ef824a173b5375a to your computer and use it in GitHub Desktop.
Julian Day Conversion Utility Functions
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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