├── .DS_Store ├── .swiftpm └── xcode │ ├── package.xcworkspace │ ├── contents.xcworkspacedata │ └── xcuserdata │ │ └── licardo.xcuserdatad │ │ └── UserInterfaceState.xcuserstate │ └── xcuserdata │ └── licardo.xcuserdatad │ └── xcschemes │ └── xcschememanagement.plist ├── Package.swift ├── README.md ├── Sources ├── .DS_Store └── LunarCore │ ├── LCMemoryCache.swift │ └── LunarCore.swift └── Tests ├── LinuxMain.swift └── LunarCoreTests ├── LunarCoreTests.swift └── XCTestManifests.swift /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/L1cardo/LunarCore/66e43917046e22676a037642eed0783b1ccb304e/.DS_Store -------------------------------------------------------------------------------- /.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.swiftpm/xcode/package.xcworkspace/xcuserdata/licardo.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/L1cardo/LunarCore/66e43917046e22676a037642eed0783b1ccb304e/.swiftpm/xcode/package.xcworkspace/xcuserdata/licardo.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /.swiftpm/xcode/xcuserdata/licardo.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | LunarCore.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | LunarCore 16 | 17 | primary 18 | 19 | 20 | LunarCoreTests 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:5.3 2 | // The swift-tools-version declares the minimum version of Swift required to build this package. 3 | 4 | import PackageDescription 5 | 6 | let package = Package( 7 | name: "LunarCore", 8 | products: [ 9 | .library( 10 | name: "LunarCore", 11 | targets: ["LunarCore"] 12 | ), 13 | ], 14 | targets: [ 15 | .target( 16 | name: "LunarCore", 17 | dependencies: [] 18 | ), 19 | .testTarget( 20 | name: "LunarCoreTests", 21 | dependencies: ["LunarCore"] 22 | ), 23 | ] 24 | ) 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LunarCore 2 | 3 | 生成1890 - 2100 年的农历数据 4 | 5 | 源代码为 @cyanzhong 写的 Objective-C 版本的 [LunarCore](https://github.com/cyanzhong/LunarCore), 由@Elors改写为 Swift 版本 [LunarCore-Swift](https://github.com/Elors/LunarCore-Swift) 6 | 7 | 我在这两个的基础上将 LunarCore 写为了支持 Swift Package Manager 的版本,使用起来应该更加方便简单 8 | 9 | ## 安装 10 | 11 | #### Swift Package Manager 12 | 13 | 通过 URL https://github.com/L1cardo/LunarCore 安装 14 | 15 | ## 使用 16 | 17 | ```swift 18 | import LunarCore 19 | ``` 20 | 21 | ##### LunarCore.calendar 22 | 23 | 计算一个日历面板(42 天)的所有信息 24 | 25 | ```swift 26 | /// 计算一个日历面板(42 天)的所有信息 27 | /// - Parameters: 28 | /// - year: 公历年 29 | /// - month: 月(1-12) 30 | /// - Returns: 一个日历面板(42 天)的所有信息 [String: Any] 31 | 32 | LunarCore.calendar(_ year: Int, _ month: Int) -> [String: Any] 33 | ``` 34 | 35 | 返回的数据格式如下所示: 36 | 37 | ```swift 38 | [ 39 | "firstDay": 3, 40 | "monthDays": 31, 41 | "monthData": [ 42 | [ 43 | "lunarDayName": "初八", 44 | "solarFestival": "", 45 | "month": 6, 46 | "lunarMonthName": "五月", 47 | "worktime": 0, 48 | "GanZhiYear": "庚子", 49 | "lunarDay": 8, 50 | "zodiac": "鼠", 51 | "year": 2020, 52 | "lunarFestival": "", 53 | "day": 28, 54 | "term": "" 55 | ], 56 | ...... 57 | ] 58 | ``` 59 | 60 | ##### LunarCore.solarToLunar 61 | 62 | 公历转换成农历 63 | 64 | ```swift 65 | /// 公历转换成农历 66 | /// - Parameters: 67 | /// - _year: 公历年 68 | /// - _month: 公历月 69 | /// - _day: 公历日 70 | /// - Returns: 农历年月日 71 | LunarCore.solarToLunar(_ _year: Int, _ _month: Int, _ _day: Int) -> [String: Any] 72 | ``` 73 | 74 | 返回的数据格式如下所示: 75 | 76 | ```swift 77 | [ 78 | "worktime": 0, 79 | "weekFestival": "", 80 | "term": "小暑", 81 | "lunarDayName": "十六", 82 | "GanZhiYear": "庚子", 83 | "lunarFestival": "", 84 | "lunarMonthName": "五月", 85 | "solarFestival": "", 86 | "zodiac": "鼠", 87 | "lunarDay": 16 88 | ] 89 | ``` 90 | 91 | ##### LunarCore.lunarToSolar 92 | 93 | 将农历转换为公历 94 | 95 | ```swift 96 | /// 将农历转换为公历 97 | /// - Parameters: 98 | /// - year: 农历年 99 | /// - month: 月(1-13,有闰月) 100 | /// - day: 日 101 | /// - Returns: 公历数据 102 | LunarCore.lunarToSolar(_ _year: Int, _ _month: Int, _ _day: Int) -> [String: Any] 103 | ``` 104 | 105 | 返回的数据格式如下: 106 | 107 | ```swift 108 | [ 109 | "year": 2020, 110 | "month": 6, 111 | "day": 7 112 | ] 113 | ``` 114 | 115 | ##### LunarCore.isLeapYear 116 | 117 | 判断公历年是否是闰年 118 | 119 | ```swift 120 | /// 判断公历年是否是闰年 121 | /// - Parameter year: 公历年 122 | /// - Returns: 是否是闰年 123 | LunarCore.isLeapYear(_ year: Int) -> Bool 124 | ``` 125 | -------------------------------------------------------------------------------- /Sources/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/L1cardo/LunarCore/66e43917046e22676a037642eed0783b1ccb304e/Sources/.DS_Store -------------------------------------------------------------------------------- /Sources/LunarCore/LCMemoryCache.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LCMemoryCache.swift 3 | // 4 | // 5 | // Created by Licardo on 2020/7/1. 6 | // 7 | 8 | import Foundation 9 | 10 | /** 11 | * 缓存 主要是缓存节气信息 12 | */ 13 | struct LCMemoryCache { 14 | var current: Int? { 15 | didSet { 16 | clear() 17 | } 18 | } 19 | 20 | var cache: [String: Any?] 21 | 22 | init() { 23 | cache = [:] 24 | } 25 | 26 | public func get(key: String) -> Any? { 27 | let a = cache[key] ?? nil 28 | return a 29 | } 30 | 31 | public mutating func setKey(_ key: String, Value value: Any?) { 32 | cache[key] = value 33 | } 34 | 35 | private mutating func clear() { 36 | cache.removeAll() 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Sources/LunarCore/LunarCore.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LunarCore.swift 3 | // 4 | // 5 | // Created by Licardo on 2020/7/1. 6 | // 7 | 8 | import Foundation 9 | 10 | private let minYear = 1890 // 最小年限 11 | private let maxYear = 2100 // 最大年限 12 | private let weekStart = 0 // 周首日(可改成 app 配置) 13 | 14 | /// 获得本地化的字符串 这里 app 可以自行实现 15 | /// - Parameter key: 本地化的字符串 16 | /// - Returns: 本地化的字符串 17 | private func i18n(_ key: String?) -> String { 18 | return key ?? "" 19 | } 20 | 21 | // MARK: - LunarCore 22 | 23 | public class LunarCore { 24 | /** 25 | * 1890 - 2100 年的农历数据 26 | * 数据格式:[0,2,9,21936] 27 | * [闰月所在月,0为没有闰月; *正月初一对应公历月; *正月初一对应公历日; *农历每月的天数的数组(需转换为二进制,得到每月大小,0=小月(29日),1=大月(30日));] 28 | */ 29 | private static let lunarInfo = [ 30 | [2, 1, 21, 22184], [0, 2, 9, 21936], [6, 1, 30, 9656], [0, 2, 17, 9584], [0, 2, 6, 21168], [5, 1, 26, 43344], [0, 2, 13, 59728], [0, 2, 2, 27296], [3, 1, 22, 44368], [0, 2, 10, 43856], [8, 1, 30, 19304], [0, 2, 19, 19168], [0, 2, 8, 42352], [5, 1, 29, 21096], [0, 2, 16, 53856], [0, 2, 4, 55632], [4, 1, 25, 27304], [0, 2, 13, 22176], [0, 2, 2, 39632], [2, 1, 22, 19176], [0, 2, 10, 19168], [6, 1, 30, 42200], [0, 2, 18, 42192], [0, 2, 6, 53840], [5, 1, 26, 54568], [0, 2, 14, 46400], [0, 2, 3, 54944], [2, 1, 23, 38608], [0, 2, 11, 38320], [7, 2, 1, 18872], [0, 2, 20, 18800], [0, 2, 8, 42160], [5, 1, 28, 45656], [0, 2, 16, 27216], [0, 2, 5, 27968], [4, 1, 24, 44456], [0, 2, 13, 11104], [0, 2, 2, 38256], [2, 1, 23, 18808], [0, 2, 10, 18800], [6, 1, 30, 25776], [0, 2, 17, 54432], [0, 2, 6, 59984], [5, 1, 26, 27976], [0, 2, 14, 23248], [0, 2, 4, 11104], [3, 1, 24, 37744], [0, 2, 11, 37600], [7, 1, 31, 51560], [0, 2, 19, 51536], [0, 2, 8, 54432], [6, 1, 27, 55888], [0, 2, 15, 46416], [0, 2, 5, 22176], [4, 1, 25, 43736], [0, 2, 13, 9680], [0, 2, 2, 37584], [2, 1, 22, 51544], [0, 2, 10, 43344], [7, 1, 29, 46248], [0, 2, 17, 27808], [0, 2, 6, 46416], [5, 1, 27, 21928], [0, 2, 14, 19872], [0, 2, 3, 42416], [3, 1, 24, 21176], [0, 2, 12, 21168], [8, 1, 31, 43344], [0, 2, 18, 59728], [0, 2, 8, 27296], [6, 1, 28, 44368], [0, 2, 15, 43856], [0, 2, 5, 19296], [4, 1, 25, 42352], [0, 2, 13, 42352], [0, 2, 2, 21088], [3, 1, 21, 59696], [0, 2, 9, 55632], [7, 1, 30, 23208], [0, 2, 17, 22176], [0, 2, 6, 38608], [5, 1, 27, 19176], [0, 2, 15, 19152], [0, 2, 3, 42192], [4, 1, 23, 53864], [0, 2, 11, 53840], [8, 1, 31, 54568], [0, 2, 18, 46400], [0, 2, 7, 46752], [6, 1, 28, 38608], [0, 2, 16, 38320], [0, 2, 5, 18864], [4, 1, 25, 42168], [0, 2, 13, 42160], [10, 2, 2, 45656], [0, 2, 20, 27216], [0, 2, 9, 27968], [6, 1, 29, 44448], [0, 2, 17, 43872], [0, 2, 6, 38256], [5, 1, 27, 18808], [0, 2, 15, 18800], [0, 2, 4, 25776], [3, 1, 23, 27216], [0, 2, 10, 59984], [8, 1, 31, 27432], [0, 2, 19, 23232], [0, 2, 7, 43872], [5, 1, 28, 37736], [0, 2, 16, 37600], [0, 2, 5, 51552], [4, 1, 24, 54440], [0, 2, 12, 54432], [0, 2, 1, 55888], [2, 1, 22, 23208], [0, 2, 9, 22176], [7, 1, 29, 43736], [0, 2, 18, 9680], [0, 2, 7, 37584], [5, 1, 26, 51544], [0, 2, 14, 43344], [0, 2, 3, 46240], [4, 1, 23, 46416], [0, 2, 10, 44368], [9, 1, 31, 21928], [0, 2, 19, 19360], [0, 2, 8, 42416], [6, 1, 28, 21176], [0, 2, 16, 21168], [0, 2, 5, 43312], [4, 1, 25, 29864], [0, 2, 12, 27296], [0, 2, 1, 44368], [2, 1, 22, 19880], [0, 2, 10, 19296], [6, 1, 29, 42352], [0, 2, 17, 42208], [0, 2, 6, 53856], [5, 1, 26, 59696], [0, 2, 13, 54576], [0, 2, 3, 23200], [3, 1, 23, 27472], [0, 2, 11, 38608], [11, 1, 31, 19176], [0, 2, 19, 19152], [0, 2, 8, 42192], [6, 1, 28, 53848], [0, 2, 15, 53840], [0, 2, 4, 54560], [5, 1, 24, 55968], [0, 2, 12, 46496], [0, 2, 1, 22224], [2, 1, 22, 19160], [0, 2, 10, 18864], [7, 1, 30, 42168], [0, 2, 17, 42160], [0, 2, 6, 43600], [5, 1, 26, 46376], [0, 2, 14, 27936], [0, 2, 2, 44448], [3, 1, 23, 21936], [0, 2, 11, 37744], [8, 2, 1, 18808], [0, 2, 19, 18800], [0, 2, 8, 25776], [6, 1, 28, 27216], [0, 2, 15, 59984], [0, 2, 4, 27424], [4, 1, 24, 43872], [0, 2, 12, 43744], [0, 2, 2, 37600], [3, 1, 21, 51568], [0, 2, 9, 51552], [7, 1, 29, 54440], [0, 2, 17, 54432], [0, 2, 5, 55888], [5, 1, 26, 23208], [0, 2, 14, 22176], [0, 2, 3, 42704], [4, 1, 23, 21224], [0, 2, 11, 21200], [8, 1, 31, 43352], [0, 2, 19, 43344], [0, 2, 7, 46240], [6, 1, 27, 46416], [0, 2, 15, 44368], [0, 2, 5, 21920], [4, 1, 24, 42448], [0, 2, 12, 42416], [0, 2, 2, 21168], [3, 1, 22, 43320], [0, 2, 9, 26928], [7, 1, 29, 29336], [0, 2, 17, 27296], [0, 2, 6, 44368], [5, 1, 26, 19880], [0, 2, 14, 19296], [0, 2, 3, 42352], [4, 1, 24, 21104], [0, 2, 10, 53856], [8, 1, 30, 59696], [0, 2, 18, 54560], [0, 2, 7, 55968], [6, 1, 27, 27472], [0, 2, 15, 22224], [0, 2, 5, 19168], [4, 1, 25, 42216], [0, 2, 12, 42192], [0, 2, 1, 53584], [2, 1, 21, 55592], [0, 2, 9, 54560] 31 | ] 32 | 33 | // 阳历每月天数 34 | private static let solarDaysOfMonth = [31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] 35 | 36 | // Memory Cache 37 | private static var memoryCache = LCMemoryCache() 38 | 39 | // GMT 0 的时区 40 | private static let timeZone = TimeZone(secondsFromGMT: 0)! 41 | 42 | // 错误码表 43 | private static var errorCode: [Int: String] { 44 | [ 45 | 100: "输入的年份超过了可查询范围,仅支持1891至2100年", 46 | 101: "参数输入错误,请查阅文档" 47 | ] 48 | } 49 | 50 | // 1890 ~ 2100 年农历新年数据 51 | private static var springFestival: [[Int]] = { 52 | [ 53 | [1, 21], [2, 9], [1, 30], [2, 17], [2, 6], [1, 26], [2, 14], [2, 2], [1, 22], [2, 10], [1, 31], [2, 19], [2, 8], [1, 29], [2, 16], [2, 4], [1, 25], [2, 13], [2, 2], [1, 22], [2, 10], [1, 30], 54 | [2, 18], [2, 6], [1, 26], [2, 14], [2, 4], [1, 23], [2, 11], [2, 1], [2, 20], [2, 8], [1, 28], [2, 16], [2, 5], [1, 24], [2, 13], [2, 2], [1, 23], [2, 10], [1, 30], [2, 17], [2, 6], [1, 26], 55 | [2, 14], [2, 4], [1, 24], [2, 11], [1, 31], [2, 19], [2, 8], [1, 27], [2, 15], [2, 5], [1, 25], [2, 13], [2, 2], [1, 22], [2, 10], [1, 29], [2, 17], [2, 6], [1, 27], [2, 14], [2, 3], [1, 24], 56 | [2, 12], [1, 31], [2, 18], [2, 8], [1, 28], [2, 15], [2, 5], [1, 25], [2, 13], [2, 2], [1, 21], [2, 9], [1, 30], [2, 17], [2, 6], [1, 27], [2, 15], [2, 3], [1, 23], [2, 11], [1, 31], [2, 18], 57 | [2, 7], [1, 28], [2, 16], [2, 5], [1, 25], [2, 13], [2, 2], [2, 20], [2, 9], [1, 29], [2, 17], [2, 6], [1, 27], [2, 15], [2, 4], [1, 23], [2, 10], [1, 31], [2, 19], [2, 7], [1, 28], [2, 16], 58 | [2, 5], [1, 24], [2, 12], [2, 1], [1, 22], [2, 9], [1, 29], [2, 18], [2, 7], [1, 26], [2, 14], [2, 3], [1, 23], [2, 10], [1, 31], [2, 19], [2, 8], [1, 28], [2, 16], [2, 5], [1, 25], [2, 12], 59 | [2, 1], [1, 22], [2, 10], [1, 29], [2, 17], [2, 6], [1, 26], [2, 13], [2, 3], [1, 23], [2, 11], [1, 31], [2, 19], [2, 8], [1, 28], [2, 15], [2, 4], [1, 24], [2, 12], [2, 1], [1, 22], [2, 10], 60 | [1, 30], [2, 17], [2, 6], [1, 26], [2, 14], [2, 2], [1, 23], [2, 11], [2, 1], [2, 19], [2, 8], [1, 28], [2, 15], [2, 4], [1, 24], [2, 12], [2, 2], [1, 21], [2, 9], [1, 29], [2, 17], [2, 5], 61 | [1, 26], [2, 14], [2, 3], [1, 23], [2, 11], [1, 31], [2, 19], [2, 7], [1, 27], [2, 15], [2, 5], [1, 24], [2, 12], [2, 2], [1, 22], [2, 9], [1, 29], [2, 17], [2, 6], [1, 26], [2, 14], [2, 3], 62 | [1, 24], [2, 10], [1, 30], [2, 18], [2, 7], [1, 27], [2, 15], [2, 5], [1, 25], [2, 12], [2, 1], [1, 21], [2, 9] 63 | ] 64 | }() 65 | 66 | // 农历数据 67 | private static var lunarCalendarData: [String: [String]] { 68 | var dict: [String: [String]] = [:] 69 | // 天干 70 | dict["heavenlyStems"] = ["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"] 71 | // 地支 72 | dict["earthlyBranches"] = ["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"] 73 | // 对应地支十二生肖 74 | dict["zodiac"] = ["鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"] 75 | // 二十四节气 76 | dict["solarTerm"] = ["立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑", "大暑", "立秋", "处暑", "白露", "秋分", 77 | "寒露", "霜降", "立冬", "小雪", "大雪", "冬至", "小寒", "大寒"] 78 | dict["monthCn"] = ["正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "冬", "腊"] 79 | dict["dateCn"] = ["初一", "初二", "初三", "初四", "初五", "初六", "初七", "初八", "初九", "初十", "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", 80 | "十九", "二十", "廿一", "廿二", "廿三", "廿四", "廿五", "廿六", "廿七", "廿八", "廿九", "三十", "卅一"] 81 | return dict 82 | } 83 | 84 | // 中国节日放假安排,外部设置,0无特殊安排,1工作,2放假 85 | private static var worktime: [String: [String: Int]] { 86 | var dicts: [String: [String: Int]] = [:] 87 | dicts["y2020"] = ["d0101": 2, "d0119": 1, "d0124": 2, "d0125": 2, "d0126": 2, "d0127": 2, "d0128": 2, "d0129": 2, "d0130": 2, "d0201": 1, "d0404": 2, "d0405": 2, "d0406": 2, "d0426": 1, "d0501": 2, "d0502": 2, "d0503": 2, "d0504": 2, "d0505": 2, "d0509": 1, "d0625": 2, "d0626": 2, "d0627": 2, "d0628": 1, "d0927": 1, "d1001": 2, "d1002": 2, "d1003": 2, "d1004": 2, "d1005": 2, "d1006": 2, "d1007": 2, "d1008": 2, "d1010": 1] 88 | dicts["y2021"] = ["d0101": 2, "d0102": 2, "d0103": 2, "d0207": 1, "d0212": 2, "d0213": 2, "d0214": 2, "d0215": 2, "d0216": 2, "d0217": 2, "d0218": 2, "d0220": 1, "d0403": 2, "d0404": 2, "d0405": 2, "d0501": 2, "d0502": 2, "d0503": 2, "d0612": 2, "d0613": 2, "d0614": 2, "d0918": 1, "d0919": 2, "d0920": 2, "d0921": 2, "d0926": 1, "d1001": 2, "d1002": 2, "d1003": 2, "d1004": 2, "d1005": 2, "d1006": 2, "d1007": 2, "d1009": 1] 89 | return dicts 90 | } 91 | 92 | // 公历节日 93 | // 星号表示不重要的节日 94 | // 破折号前面的是缩略写法 95 | private static var solarFestival: [String: String] { 96 | [ 97 | "d0101": "元旦节", 98 | "d0120": "水瓶", 99 | "d0202": "湿地日-世界湿地日", 100 | "d0210": "*国际气象节", 101 | "d0214": "情人节", 102 | "d0219": "双鱼", 103 | "d0301": "*国际海豹日", 104 | "d0303": "*全国爱耳日", 105 | "d0305": "学雷锋-学雷锋纪念日", 106 | "d0308": "妇女节", 107 | "d0312": "植树节 孙中山逝世纪念日", 108 | "d0314": "*国际警察日", 109 | "d0315": "消费者-消费者权益日", 110 | "d0317": "*中国国医节 国际航海日", 111 | "d0321": "白羊 世界森林日 消除种族歧视国际日 世界儿歌日", 112 | "d0322": "*世界水日", 113 | "d0323": "*世界气象日", 114 | "d0324": "*世界防治结核病日", 115 | "d0325": "*全国中小学生安全教育日", 116 | "d0330": "*巴勒斯坦国土日", 117 | "d0401": "愚人节 全国爱国卫生运动月 税收宣传月", 118 | "d0407": "*世界卫生日", 119 | "d0420": "金牛", 120 | "d0422": "地球日-世界地球日", 121 | "d0423": "*世界图书和版权日", 122 | "d0424": "*亚非新闻工作者日", 123 | "d0501": "劳动节", 124 | "d0504": "青年节", 125 | "d0505": "*碘缺乏病防治日", 126 | "d0508": "*世界红十字日", 127 | "d0512": "护士节-国际护士节", 128 | "d0515": "*国际家庭日", 129 | "d0517": "*世界电信日", 130 | "d0518": "博物馆-国际博物馆日", 131 | "d0520": "*全国学生营养日", 132 | "d0521": "双子", 133 | "d0522": "*国际生物多样性日", 134 | "d0531": "*世界无烟日", 135 | "d0601": "儿童节-国际儿童节", 136 | "d0605": "环境日-世界环境日", 137 | "d0606": "*全国爱眼日", 138 | "d0617": "*防治荒漠化和干旱日", 139 | "d0622": "巨蟹", 140 | "d0623": "奥林匹克-国际奥林匹克日", 141 | "d0625": "*全国土地日", 142 | "d0626": "*国际禁毒日", 143 | "d0701": "建党节 香港回归纪念日 中共诞辰 世界建筑日", 144 | "d0702": "*国际体育记者日", 145 | "d0707": "*抗日战争纪念日", 146 | "d0711": "*世界人口日", 147 | "d0723": "狮子", 148 | "d0730": "*非洲妇女日", 149 | "d0801": "建军节", 150 | "d0808": "*中国男子节(爸爸节)", 151 | "d0823": "处女", 152 | "d0903": "抗日战争-抗日战争胜利纪念", 153 | "d0908": "*国际扫盲日 国际新闻工作者日", 154 | "d0909": "*毛泽东逝世纪念", 155 | "d0910": "教师节-中国教师节", 156 | "d0914": "*世界清洁地球日", 157 | "d0916": "*国际臭氧层保护日", 158 | "d0918": "*九一八事变纪念日", 159 | "d0920": "*国际爱牙日", 160 | "d0923": "天秤", 161 | "d0927": "*世界旅游日", 162 | "d0928": "*孔子诞辰", 163 | "d1001": "国庆节 世界音乐日 国际老人节", 164 | "d1002": "*国际和平与民主自由斗争日", 165 | "d1004": "*世界动物日", 166 | "d1006": "*老人节", 167 | "d1008": "*全国高血压日", 168 | "d1009": "*世界邮政日 万国邮联日", 169 | "d1010": "*辛亥革命纪念日 世界精神卫生日", 170 | "d1013": "*世界保健日 国际教师节", 171 | "d1014": "*世界标准日", 172 | "d1015": "*国际盲人节(白手杖节)", 173 | "d1016": "*世界粮食日", 174 | "d1017": "*世界消除贫困日", 175 | "d1022": "*世界传统医药日", 176 | "d1024": "天蝎 联合国日 世界发展信息日", 177 | "d1031": "万圣节 世界勤俭日", 178 | "d1107": "*十月社会主义革命纪念日", 179 | "d1108": "*中国记者日", 180 | "d1109": "*全国消防安全宣传教育日", 181 | "d1110": "*世界青年节", 182 | "d1111": "光棍节 国际科学与和平周(本日所属的一周)", 183 | "d1112": "*孙中山诞辰纪念日", 184 | "d1114": "*世界糖尿病日", 185 | "d1117": "*国际大学生节 世界学生节", 186 | "d1121": "*世界问候日 世界电视日", 187 | "d1123": "射手", 188 | "d1129": "*国际声援巴勒斯坦人民国际日", 189 | "d1201": "艾滋病-世界艾滋病日", 190 | "d1203": "*世界残疾人日", 191 | "d1205": "*国际经济和社会发展志愿人员日", 192 | "d1208": "*国际儿童电视日", 193 | "d1209": "*世界足球日", 194 | "d1210": "*世界人权日", 195 | "d1212": "*西安事变纪念日", 196 | "d1213": "*南京大屠杀(1937年)纪念日!紧记血泪史!", 197 | "d1220": "*澳门回归纪念", 198 | "d1221": "*国际篮球日", 199 | "d1222": "摩羯", 200 | "d1224": "平安夜", 201 | "d1225": "圣诞节", 202 | "d1226": "*毛泽东诞辰纪念" 203 | ] 204 | } 205 | 206 | // 农历节日 207 | private static var lunarFestival: [String: String] { 208 | [ 209 | "d0101": "春节", 210 | "d0115": "元宵节", 211 | "d0202": "龙抬头节", 212 | "d0505": "端午节", 213 | "d0707": "七夕节", 214 | "d0715": "中元节", 215 | "d0815": "中秋节", 216 | "d0909": "重阳节", 217 | "d1001": "寒衣节", 218 | "d1015": "下元节", 219 | "d1208": "腊八节", 220 | "d1223": "小年", 221 | "d0100": "除夕" 222 | ] 223 | } 224 | 225 | // 周节日 226 | private static var weekFestival: [String: String] { 227 | [ 228 | "0513": "*世界哮喘日", 229 | "0521": "母亲节-国际母亲节 救助贫困母亲日", 230 | "0531": "*全国助残日", 231 | "0533": "*国际牛奶日", 232 | "0627": "*中国文化遗产日", 233 | "0631": "父亲节", 234 | "0717": "*国际合作节", 235 | "0731": "*被奴役国家周", 236 | "0933": "*国际和平日", 237 | "0937": "*全民国防教育日", 238 | "0941": "*国际聋人节 世界儿童日", 239 | "0951": "*世界海事日 世界心脏病日", 240 | "1012": "*国际住房日 世界建筑日 世界人居日", 241 | "1024": "*国际减灾日", 242 | "1025": "*世界视觉日", 243 | "1145": "感恩节", 244 | "1221": "*国际儿童电视广播日" 245 | ] 246 | } 247 | 248 | // 节气 249 | private static var solarTerms: [Int: [String]] { 250 | [ 251 | 1890: ["d0204", "d0218", "d0305", "d0320", "d0405", "d0420", "d0505", "d0521", "d0606", "d0621", "d0707", "d0723", "d0807", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 252 | 1891: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1024", "d1108", "d1122", "d1207", "d1222", "d0105", "d0120"], 253 | 1892: ["d0204", "d0219", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0922", "d1008", "d1023", "d1107", "d1122", "d1206", "d1221", "d0106", "d0120"], 254 | 1893: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0723", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0105", "d0120"], 255 | 1894: ["d0204", "d0218", "d0305", "d0320", "d0405", "d0420", "d0505", "d0521", "d0606", "d0621", "d0707", "d0723", "d0807", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 256 | 1895: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 257 | 1896: ["d0204", "d0219", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0922", "d1008", "d1023", "d1107", "d1122", "d1206", "d1221", "d0106", "d0120"], 258 | 1897: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0105", "d0120"], 259 | 1898: ["d0204", "d0218", "d0305", "d0320", "d0405", "d0420", "d0505", "d0521", "d0606", "d0621", "d0707", "d0723", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 260 | 1899: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0621", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 261 | 1900: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1207", "d1222", "d0106", "d0120"], 262 | 1901: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0421", "d0506", "d0522", "d0606", "d0622", "d0708", "d0723", "d0808", "d0824", "d0908", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1222", "d0106", "d0121"], 263 | 1902: ["d0205", "d0219", "d0306", "d0321", "d0406", "d0421", "d0506", "d0522", "d0607", "d0622", "d0708", "d0724", "d0808", "d0824", "d0908", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1223", "d0106", "d0121"], 264 | 1903: ["d0205", "d0220", "d0307", "d0322", "d0406", "d0421", "d0507", "d0522", "d0607", "d0622", "d0708", "d0724", "d0809", "d0824", "d0909", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1223", "d0106", "d0121"], 265 | 1904: ["d0205", "d0220", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1207", "d1222", "d0107", "d0121"], 266 | 1905: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0421", "d0506", "d0522", "d0606", "d0622", "d0708", "d0723", "d0808", "d0824", "d0908", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1222", "d0106", "d0121"], 267 | 1906: ["d0205", "d0219", "d0306", "d0321", "d0406", "d0421", "d0506", "d0522", "d0606", "d0622", "d0708", "d0724", "d0808", "d0824", "d0908", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1223", "d0106", "d0121"], 268 | 1907: ["d0205", "d0220", "d0307", "d0322", "d0406", "d0421", "d0507", "d0522", "d0607", "d0622", "d0708", "d0724", "d0809", "d0824", "d0909", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1223", "d0106", "d0121"], 269 | 1908: ["d0205", "d0220", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1207", "d1222", "d0107", "d0121"], 270 | 1909: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0421", "d0506", "d0522", "d0606", "d0622", "d0708", "d0723", "d0808", "d0824", "d0908", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1222", "d0106", "d0121"], 271 | 1910: ["d0205", "d0219", "d0306", "d0321", "d0406", "d0421", "d0506", "d0522", "d0606", "d0622", "d0708", "d0724", "d0808", "d0824", "d0908", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1223", "d0106", "d0121"], 272 | 1911: ["d0205", "d0220", "d0307", "d0322", "d0406", "d0421", "d0507", "d0522", "d0607", "d0622", "d0708", "d0724", "d0809", "d0824", "d0909", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1223", "d0106", "d0121"], 273 | 1912: ["d0205", "d0220", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1009", "d1024", "d1108", "d1122", "d1207", "d1222", "d0107", "d0121"], 274 | 1913: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0421", "d0506", "d0522", "d0606", "d0622", "d0708", "d0723", "d0808", "d0824", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1208", "d1222", "d0106", "d0120"], 275 | 1914: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0421", "d0506", "d0522", "d0606", "d0622", "d0708", "d0724", "d0808", "d0824", "d0908", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1223", "d0106", "d0121"], 276 | 1915: ["d0205", "d0220", "d0306", "d0322", "d0406", "d0421", "d0506", "d0522", "d0607", "d0622", "d0708", "d0724", "d0808", "d0824", "d0909", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1223", "d0106", "d0121"], 277 | 1916: ["d0205", "d0220", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1024", "d1108", "d1122", "d1207", "d1222", "d0106", "d0121"], 278 | 1917: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0421", "d0506", "d0521", "d0606", "d0622", "d0708", "d0723", "d0808", "d0824", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1208", "d1222", "d0106", "d0120"], 279 | 1918: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0421", "d0506", "d0522", "d0606", "d0622", "d0708", "d0724", "d0808", "d0824", "d0908", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1222", "d0106", "d0121"], 280 | 1919: ["d0205", "d0220", "d0306", "d0322", "d0406", "d0421", "d0506", "d0522", "d0607", "d0622", "d0708", "d0724", "d0808", "d0824", "d0909", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1223", "d0106", "d0121"], 281 | 1920: ["d0205", "d0220", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1024", "d1108", "d1122", "d1207", "d1222", "d0106", "d0121"], 282 | 1921: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0708", "d0723", "d0808", "d0824", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1207", "d1222", "d0106", "d0120"], 283 | 1922: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0421", "d0506", "d0522", "d0606", "d0622", "d0708", "d0724", "d0808", "d0824", "d0908", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1222", "d0106", "d0121"], 284 | 1923: ["d0205", "d0219", "d0306", "d0321", "d0406", "d0421", "d0506", "d0522", "d0607", "d0622", "d0708", "d0724", "d0808", "d0824", "d0909", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1223", "d0106", "d0121"], 285 | 1924: ["d0205", "d0220", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1024", "d1108", "d1122", "d1207", "d1222", "d0106", "d0121"], 286 | 1925: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0708", "d0723", "d0808", "d0824", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1207", "d1222", "d0106", "d0120"], 287 | 1926: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0421", "d0506", "d0522", "d0606", "d0622", "d0708", "d0723", "d0808", "d0824", "d0908", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1222", "d0106", "d0121"], 288 | 1927: ["d0205", "d0219", "d0306", "d0321", "d0406", "d0421", "d0506", "d0522", "d0607", "d0622", "d0708", "d0724", "d0808", "d0824", "d0909", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1223", "d0106", "d0121"], 289 | 1928: ["d0205", "d0220", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0106", "d0121"], 290 | 1929: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1207", "d1222", "d0106", "d0120"], 291 | 1930: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0421", "d0506", "d0522", "d0606", "d0622", "d0708", "d0723", "d0808", "d0824", "d0908", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1222", "d0106", "d0121"], 292 | 1931: ["d0205", "d0219", "d0306", "d0321", "d0406", "d0421", "d0506", "d0522", "d0607", "d0622", "d0708", "d0724", "d0808", "d0824", "d0908", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1223", "d0106", "d0121"], 293 | 1932: ["d0205", "d0220", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0621", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0106", "d0121"], 294 | 1933: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1207", "d1222", "d0106", "d0120"], 295 | 1934: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0421", "d0506", "d0522", "d0606", "d0622", "d0708", "d0723", "d0808", "d0824", "d0908", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1222", "d0106", "d0121"], 296 | 1935: ["d0205", "d0219", "d0306", "d0321", "d0406", "d0421", "d0506", "d0522", "d0606", "d0622", "d0708", "d0724", "d0808", "d0824", "d0908", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1223", "d0106", "d0121"], 297 | 1936: ["d0205", "d0220", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0621", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0106", "d0121"], 298 | 1937: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1207", "d1222", "d0106", "d0120"], 299 | 1938: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0421", "d0506", "d0522", "d0606", "d0622", "d0708", "d0723", "d0808", "d0824", "d0908", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1222", "d0106", "d0121"], 300 | 1939: ["d0205", "d0219", "d0306", "d0321", "d0406", "d0421", "d0506", "d0522", "d0606", "d0622", "d0708", "d0724", "d0808", "d0824", "d0908", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1223", "d0106", "d0121"], 301 | 1940: ["d0205", "d0220", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0621", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0106", "d0121"], 302 | 1941: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1207", "d1222", "d0106", "d0120"], 303 | 1942: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0421", "d0506", "d0522", "d0606", "d0622", "d0708", "d0723", "d0808", "d0824", "d0908", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1222", "d0106", "d0121"], 304 | 1943: ["d0205", "d0219", "d0306", "d0321", "d0406", "d0421", "d0506", "d0522", "d0606", "d0622", "d0708", "d0724", "d0808", "d0824", "d0908", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1223", "d0106", "d0121"], 305 | 1944: ["d0205", "d0220", "d0306", "d0321", "d0405", "d0420", "d0505", "d0521", "d0606", "d0621", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0106", "d0121"], 306 | 1945: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1024", "d1108", "d1122", "d1207", "d1222", "d0106", "d0120"], 307 | 1946: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0421", "d0506", "d0522", "d0606", "d0622", "d0708", "d0723", "d0808", "d0824", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1208", "d1222", "d0106", "d0120"], 308 | 1947: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0421", "d0506", "d0522", "d0606", "d0622", "d0708", "d0724", "d0808", "d0824", "d0908", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1223", "d0106", "d0121"], 309 | 1948: ["d0205", "d0220", "d0305", "d0321", "d0405", "d0420", "d0505", "d0521", "d0606", "d0621", "d0707", "d0723", "d0807", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0106", "d0121"], 310 | 1949: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1024", "d1108", "d1122", "d1207", "d1222", "d0105", "d0120"], 311 | 1950: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0708", "d0723", "d0808", "d0824", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1208", "d1222", "d0106", "d0120"], 312 | 1951: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0421", "d0506", "d0522", "d0606", "d0622", "d0708", "d0724", "d0808", "d0824", "d0908", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1223", "d0106", "d0121"], 313 | 1952: ["d0205", "d0220", "d0305", "d0321", "d0405", "d0420", "d0505", "d0521", "d0606", "d0621", "d0707", "d0723", "d0807", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0106", "d0121"], 314 | 1953: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1024", "d1108", "d1122", "d1207", "d1222", "d0105", "d0120"], 315 | 1954: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0708", "d0723", "d0808", "d0824", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1207", "d1222", "d0106", "d0120"], 316 | 1955: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0421", "d0506", "d0522", "d0606", "d0622", "d0708", "d0723", "d0808", "d0824", "d0908", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1222", "d0106", "d0121"], 317 | 1956: ["d0205", "d0220", "d0305", "d0320", "d0405", "d0420", "d0505", "d0521", "d0606", "d0621", "d0707", "d0723", "d0807", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0106", "d0121"], 318 | 1957: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1024", "d1108", "d1122", "d1207", "d1222", "d0105", "d0120"], 319 | 1958: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1207", "d1222", "d0106", "d0120"], 320 | 1959: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0421", "d0506", "d0522", "d0606", "d0622", "d0708", "d0723", "d0808", "d0824", "d0908", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1222", "d0106", "d0121"], 321 | 1960: ["d0205", "d0219", "d0305", "d0320", "d0405", "d0420", "d0505", "d0521", "d0606", "d0621", "d0707", "d0723", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0106", "d0121"], 322 | 1961: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0621", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 323 | 1962: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1207", "d1222", "d0106", "d0120"], 324 | 1963: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0421", "d0506", "d0522", "d0606", "d0622", "d0708", "d0723", "d0808", "d0824", "d0908", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1222", "d0106", "d0121"], 325 | 1964: ["d0205", "d0219", "d0305", "d0320", "d0405", "d0420", "d0505", "d0521", "d0606", "d0621", "d0707", "d0723", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0106", "d0121"], 326 | 1965: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0621", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 327 | 1966: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1207", "d1222", "d0106", "d0120"], 328 | 1967: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0421", "d0506", "d0522", "d0606", "d0622", "d0708", "d0723", "d0808", "d0824", "d0908", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1222", "d0106", "d0121"], 329 | 1968: ["d0205", "d0219", "d0305", "d0320", "d0405", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0723", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0106", "d0121"], 330 | 1969: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0621", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 331 | 1970: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1207", "d1222", "d0106", "d0120"], 332 | 1971: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0421", "d0506", "d0522", "d0606", "d0622", "d0708", "d0723", "d0808", "d0824", "d0908", "d0924", "d1009", "d1024", "d1108", "d1123", "d1208", "d1222", "d0106", "d0121"], 333 | 1972: ["d0205", "d0219", "d0305", "d0320", "d0405", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0723", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0106", "d0121"], 334 | 1973: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0505", "d0521", "d0606", "d0621", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 335 | 1974: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1207", "d1222", "d0106", "d0120"], 336 | 1975: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0421", "d0506", "d0522", "d0606", "d0622", "d0708", "d0723", "d0808", "d0824", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1208", "d1222", "d0106", "d0121"], 337 | 1976: ["d0205", "d0219", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0723", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0106", "d0121"], 338 | 1977: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0505", "d0521", "d0606", "d0621", "d0707", "d0723", "d0807", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 339 | 1978: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1024", "d1108", "d1123", "d1207", "d1222", "d0106", "d0120"], 340 | 1979: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0421", "d0506", "d0521", "d0606", "d0622", "d0708", "d0723", "d0808", "d0824", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1208", "d1222", "d0106", "d0120"], 341 | 1980: ["d0205", "d0219", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0723", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0106", "d0121"], 342 | 1981: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0505", "d0521", "d0606", "d0621", "d0707", "d0723", "d0807", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 343 | 1982: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1024", "d1108", "d1122", "d1207", "d1222", "d0106", "d0120"], 344 | 1983: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0708", "d0723", "d0808", "d0824", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1208", "d1222", "d0106", "d0120"], 345 | 1984: ["d0204", "d0219", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0106", "d0121"], 346 | 1985: ["d0204", "d0219", "d0305", "d0321", "d0405", "d0420", "d0505", "d0521", "d0606", "d0621", "d0707", "d0723", "d0807", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 347 | 1986: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1024", "d1108", "d1122", "d1207", "d1222", "d0105", "d0120"], 348 | 1987: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0824", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1207", "d1222", "d0106", "d0120"], 349 | 1988: ["d0204", "d0219", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0106", "d0121"], 350 | 1989: ["d0204", "d0219", "d0305", "d0320", "d0405", "d0420", "d0505", "d0521", "d0606", "d0621", "d0707", "d0723", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 351 | 1990: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0621", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1024", "d1108", "d1122", "d1207", "d1222", "d0105", "d0120"], 352 | 1991: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1207", "d1222", "d0106", "d0120"], 353 | 1992: ["d0204", "d0219", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0106", "d0121"], 354 | 1993: ["d0204", "d0218", "d0305", "d0320", "d0405", "d0420", "d0505", "d0521", "d0606", "d0621", "d0707", "d0723", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 355 | 1994: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0621", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 356 | 1995: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1207", "d1222", "d0106", "d0120"], 357 | 1996: ["d0204", "d0219", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0106", "d0121"], 358 | 1997: ["d0204", "d0218", "d0305", "d0320", "d0405", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0723", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 359 | 1998: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0621", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 360 | 1999: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1207", "d1222", "d0106", "d0120"], 361 | 2000: ["d0204", "d0219", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0106", "d0121"], 362 | 2001: ["d0204", "d0218", "d0305", "d0320", "d0405", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0723", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 363 | 2002: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0621", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 364 | 2003: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1207", "d1222", "d0106", "d0120"], 365 | 2004: ["d0204", "d0219", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0106", "d0121"], 366 | 2005: ["d0204", "d0218", "d0305", "d0320", "d0405", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0723", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 367 | 2006: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0505", "d0521", "d0606", "d0621", "d0707", "d0723", "d0807", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 368 | 2007: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1009", "d1024", "d1108", "d1123", "d1207", "d1222", "d0106", "d0120"], 369 | 2008: ["d0204", "d0219", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0922", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0106", "d0121"], 370 | 2009: ["d0204", "d0218", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0723", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 371 | 2010: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0505", "d0521", "d0606", "d0621", "d0707", "d0723", "d0807", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 372 | 2011: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1024", "d1108", "d1123", "d1207", "d1222", "d0106", "d0120"], 373 | 2012: ["d0204", "d0219", "d0305", "d0320", "d0404", "d0420", "d0505", "d0520", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0922", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0106", "d0121"], 374 | 2013: ["d0204", "d0218", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 375 | 2014: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0505", "d0521", "d0606", "d0621", "d0707", "d0723", "d0807", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 376 | 2015: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0622", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1024", "d1108", "d1122", "d1207", "d1222", "d0106", "d0120"], 377 | 2016: ["d0204", "d0219", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0922", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0106", "d0120"], 378 | 2017: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 379 | 2018: ["d0204", "d0219", "d0305", "d0321", "d0405", "d0420", "d0505", "d0521", "d0606", "d0621", "d0707", "d0723", "d0807", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 380 | 2019: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0621", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1024", "d1108", "d1122", "d1207", "d1222", "d0105", "d0120"], 381 | 2020: ["d0204", "d0219", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0621", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0106", "d0120"], 382 | 2021: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0105", "d0120"], 383 | 2022: ["d0204", "d0219", "d0305", "d0320", "d0405", "d0420", "d0505", "d0521", "d0606", "d0621", "d0707", "d0723", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 384 | 2023: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0621", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1024", "d1108", "d1122", "d1207", "d1222", "d0105", "d0120"], 385 | 2024: ["d0204", "d0219", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0621", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1008", "d1023", "d1107", "d1122", "d1206", "d1221", "d0106", "d0120"], 386 | 2025: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0105", "d0120"], 387 | 2026: ["d0204", "d0218", "d0305", "d0320", "d0405", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0723", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 388 | 2027: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0621", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 389 | 2028: ["d0204", "d0219", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0621", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1008", "d1023", "d1107", "d1122", "d1206", "d1221", "d0106", "d0120"], 390 | 2029: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0105", "d0120"], 391 | 2030: ["d0204", "d0218", "d0305", "d0320", "d0405", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0723", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 392 | 2031: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0506", "d0521", "d0606", "d0621", "d0707", "d0723", "d0808", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 393 | 2032: ["d0204", "d0219", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0621", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1008", "d1023", "d1107", "d1122", "d1206", "d1221", "d0106", "d0120"], 394 | 2033: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0105", "d0120"], 395 | 2034: ["d0204", "d0218", "d0305", "d0320", "d0405", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0723", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 396 | 2035: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0505", "d0521", "d0606", "d0621", "d0707", "d0723", "d0807", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 397 | 2036: ["d0204", "d0219", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0621", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1008", "d1023", "d1107", "d1122", "d1206", "d1221", "d0106", "d0120"], 398 | 2037: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0105", "d0120"], 399 | 2038: ["d0204", "d0218", "d0305", "d0320", "d0405", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0723", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 400 | 2039: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0505", "d0521", "d0606", "d0621", "d0707", "d0723", "d0807", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 401 | 2040: ["d0204", "d0219", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0621", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1008", "d1023", "d1107", "d1122", "d1206", "d1221", "d0106", "d0120"], 402 | 2041: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0420", "d0505", "d0520", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0922", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0105", "d0120"], 403 | 2042: ["d0204", "d0218", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0723", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 404 | 2043: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0505", "d0521", "d0606", "d0621", "d0707", "d0723", "d0807", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 405 | 2044: ["d0204", "d0219", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0621", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1007", "d1023", "d1107", "d1122", "d1206", "d1221", "d0106", "d0120"], 406 | 2045: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0922", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0105", "d0120"], 407 | 2046: ["d0204", "d0218", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 408 | 2047: ["d0204", "d0219", "d0306", "d0321", "d0405", "d0420", "d0505", "d0521", "d0606", "d0621", "d0707", "d0723", "d0807", "d0823", "d0908", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 409 | 2048: ["d0204", "d0219", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0620", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1007", "d1023", "d1107", "d1121", "d1206", "d1221", "d0106", "d0120"], 410 | 2049: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0621", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0105", "d0119"], 411 | 2050: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 412 | 2051: ["d0204", "d0219", "d0305", "d0320", "d0405", "d0420", "d0505", "d0521", "d0606", "d0621", "d0707", "d0723", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 413 | 2052: ["d0204", "d0219", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0620", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1007", "d1023", "d1107", "d1121", "d1206", "d1221", "d0105", "d0120"], 414 | 2053: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0621", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0105", "d0119"], 415 | 2054: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 416 | 2055: ["d0204", "d0219", "d0305", "d0320", "d0405", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0723", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 417 | 2056: ["d0204", "d0219", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0620", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1007", "d1023", "d1107", "d1121", "d1206", "d1221", "d0105", "d0120"], 418 | 2057: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0621", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1008", "d1023", "d1107", "d1122", "d1206", "d1221", "d0105", "d0119"], 419 | 2058: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0105", "d0120"], 420 | 2059: ["d0204", "d0219", "d0305", "d0320", "d0405", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0723", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 421 | 2060: ["d0204", "d0219", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0620", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1007", "d1022", "d1106", "d1121", "d1206", "d1221", "d0105", "d0120"], 422 | 2061: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0621", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1008", "d1023", "d1107", "d1122", "d1206", "d1221", "d0105", "d0119"], 423 | 2062: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0105", "d0120"], 424 | 2063: ["d0204", "d0218", "d0305", "d0320", "d0405", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0723", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 425 | 2064: ["d0204", "d0219", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0620", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1007", "d1022", "d1106", "d1121", "d1206", "d1221", "d0105", "d0120"], 426 | 2065: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0621", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1008", "d1023", "d1107", "d1122", "d1206", "d1221", "d0105", "d0119"], 427 | 2066: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0105", "d0120"], 428 | 2067: ["d0204", "d0218", "d0305", "d0320", "d0405", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0723", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 429 | 2068: ["d0204", "d0219", "d0305", "d0320", "d0404", "d0419", "d0504", "d0520", "d0605", "d0620", "d0706", "d0722", "d0806", "d0822", "d0907", "d0922", "d1007", "d1022", "d1106", "d1121", "d1206", "d1221", "d0105", "d0120"], 430 | 2069: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0621", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1008", "d1023", "d1107", "d1122", "d1206", "d1221", "d0105", "d0119"], 431 | 2070: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0420", "d0505", "d0520", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0922", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0105", "d0120"], 432 | 2071: ["d0204", "d0218", "d0305", "d0320", "d0405", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0723", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 433 | 2072: ["d0204", "d0219", "d0305", "d0320", "d0404", "d0419", "d0504", "d0520", "d0605", "d0620", "d0706", "d0722", "d0806", "d0822", "d0907", "d0922", "d1007", "d1022", "d1106", "d1121", "d1206", "d1221", "d0105", "d0120"], 434 | 2073: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0621", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1007", "d1023", "d1107", "d1122", "d1206", "d1221", "d0105", "d0119"], 435 | 2074: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0420", "d0505", "d0520", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0922", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0105", "d0120"], 436 | 2075: ["d0204", "d0218", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 437 | 2076: ["d0204", "d0219", "d0305", "d0320", "d0404", "d0419", "d0504", "d0520", "d0605", "d0620", "d0706", "d0722", "d0806", "d0822", "d0907", "d0922", "d1007", "d1022", "d1106", "d1121", "d1206", "d1221", "d0105", "d0120"], 438 | 2077: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0621", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1007", "d1023", "d1107", "d1122", "d1206", "d1221", "d0105", "d0119"], 439 | 2078: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0621", "d0706", "d0722", "d0807", "d0823", "d0907", "d0922", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0105", "d0120"], 440 | 2079: ["d0204", "d0218", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 441 | 2080: ["d0204", "d0219", "d0305", "d0320", "d0404", "d0419", "d0504", "d0520", "d0605", "d0620", "d0706", "d0722", "d0806", "d0822", "d0907", "d0922", "d1007", "d1022", "d1106", "d1121", "d1206", "d1221", "d0105", "d0120"], 442 | 2081: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0620", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1007", "d1023", "d1107", "d1121", "d1206", "d1221", "d0105", "d0119"], 443 | 2082: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0621", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0105", "d0120"], 444 | 2083: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 445 | 2084: ["d0204", "d0219", "d0304", "d0319", "d0404", "d0419", "d0504", "d0520", "d0605", "d0620", "d0706", "d0722", "d0806", "d0822", "d0906", "d0922", "d1007", "d1022", "d1106", "d1121", "d1206", "d1221", "d0105", "d0120"], 446 | 2085: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0620", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1007", "d1023", "d1107", "d1121", "d1206", "d1221", "d0104", "d0119"], 447 | 2086: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0621", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0105", "d0119"], 448 | 2087: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"], 449 | 2088: ["d0204", "d0219", "d0304", "d0319", "d0404", "d0419", "d0504", "d0520", "d0604", "d0620", "d0706", "d0722", "d0806", "d0822", "d0906", "d0922", "d1007", "d1022", "d1106", "d1121", "d1206", "d1221", "d0105", "d0120"], 450 | 2089: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0620", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1007", "d1023", "d1107", "d1121", "d1206", "d1221", "d0104", "d0119"], 451 | 2090: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0621", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1008", "d1023", "d1107", "d1122", "d1206", "d1221", "d0105", "d0119"], 452 | 2091: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0105", "d0120"], 453 | 2092: ["d0204", "d0219", "d0304", "d0319", "d0404", "d0419", "d0504", "d0520", "d0604", "d0620", "d0706", "d0722", "d0806", "d0822", "d0906", "d0922", "d1007", "d1022", "d1106", "d1121", "d1206", "d1221", "d0105", "d0120"], 454 | 2093: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0620", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1007", "d1022", "d1106", "d1121", "d1206", "d1221", "d0104", "d0119"], 455 | 2094: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0621", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1008", "d1023", "d1107", "d1122", "d1206", "d1221", "d0105", "d0119"], 456 | 2095: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0105", "d0120"], 457 | 2096: ["d0204", "d0218", "d0304", "d0319", "d0404", "d0419", "d0504", "d0520", "d0604", "d0620", "d0706", "d0722", "d0806", "d0822", "d0906", "d0922", "d1007", "d1022", "d1106", "d1121", "d1206", "d1221", "d0105", "d0120"], 458 | 2097: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0620", "d0706", "d0722", "d0806", "d0822", "d0907", "d0922", "d1007", "d1022", "d1106", "d1121", "d1206", "d1221", "d0104", "d0119"], 459 | 2098: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0419", "d0505", "d0520", "d0605", "d0621", "d0706", "d0722", "d0807", "d0822", "d0907", "d0922", "d1008", "d1023", "d1107", "d1122", "d1206", "d1221", "d0105", "d0119"], 460 | 2099: ["d0203", "d0218", "d0305", "d0320", "d0404", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0722", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1221", "d0105", "d0120"], 461 | 2100: ["d0204", "d0218", "d0305", "d0320", "d0405", "d0420", "d0505", "d0521", "d0605", "d0621", "d0707", "d0723", "d0807", "d0823", "d0907", "d0923", "d1008", "d1023", "d1107", "d1122", "d1207", "d1222", "d0105", "d0120"] 462 | ] 463 | } 464 | 465 | /// 格式化日期 466 | /// - Parameters: 467 | /// - month: 月份 468 | /// - day: 日期 469 | /// - Returns: 格式化后的日期 470 | private static func formatDay(_ month: Int, _ day: Int) -> String { 471 | return String(format: "d%02d%02d", month + 1, day) 472 | } 473 | 474 | /// 以年月和长度构造一个日历 475 | /// - Parameters: 476 | /// - year: 年 477 | /// - month: 月 478 | /// - len: 参数 479 | /// - start: 开始日期 480 | /// - Returns: 整月日历 481 | private static func createMonthData(_ year: Int, _ month: Int, _ len: Int, _ start: Int) -> [[String: Int]] { 482 | var monthData: [[String: Int]] = [] 483 | 484 | if len < 1 { return monthData } 485 | 486 | var k = start 487 | for _ in 0.. Date? { 502 | let calendar = Calendar.current 503 | var comp = DateComponents() 504 | comp.year = year 505 | comp.month = month + 1 506 | comp.day = day 507 | let date = calendar.date(from: comp) 508 | return date 509 | } 510 | 511 | /// 构造 NSDate 512 | /// - Parameters: 513 | /// - year: 年 514 | /// - month: 月 515 | /// - day: 日 516 | /// - Returns: NSDate 517 | private static func newDate(_ year: Int, _ month: Int, _ day: Int) -> Date { 518 | return date(year, month - 1, day)! 519 | } 520 | 521 | /// 获得以周为单位的节日 522 | /// - Parameters: 523 | /// - year: 年 524 | /// - month: 月 525 | /// - day: 日 526 | /// - Returns: 节日 527 | private static func getWeekFestival(_ year: Int, _ month: Int, _ day: Int) -> String { 528 | let date = newDate(year, month, day) 529 | let gregorian = Calendar(identifier: .gregorian) 530 | let comps = gregorian.dateComponents([.weekday], from: date) 531 | let weekDay = comps.weekday! 532 | 533 | // 这个时候要数出cWeekDay是第几个 534 | var weekDayCount = 0 535 | for _ in 1 ... day { 536 | let curDate = newDate(year, month, day) 537 | let weekComp = gregorian.dateComponents([.weekday], from: curDate) 538 | if weekComp.weekday == weekDay { 539 | weekDayCount += 1 540 | } 541 | } 542 | 543 | let key = String(format: "%02d%d%d", month, weekDayCount, weekDay) 544 | let festival = weekFestival[key] 545 | if festival != nil { 546 | return i18n(festival) 547 | } 548 | return "" 549 | } 550 | 551 | /// 判断农历年闰月数 552 | /// - Parameter year: 农历 553 | /// - Returns: 闰月数 (月份从1开始) 554 | private static func getLunarLeapYear(_ year: Int) -> Int { 555 | let yearData = lunarInfo[year - minYear] 556 | return yearData[0] 557 | } 558 | 559 | private static func toString(_ num: Int?) -> [Any?] { 560 | var arr: [Any?] = [] 561 | var tempNum = num 562 | while tempNum != 0 { 563 | arr.append(String(tempNum! & 1)) 564 | tempNum = tempNum! >> 1 565 | } 566 | return arr.reversed() 567 | } 568 | 569 | /// 获取农历年份一年的每月的天数及一年的总天数 570 | /// - Parameter year: 农历 571 | /// - Returns: 总天数 572 | private static func getLunarYearDays(_ year: Int) -> [String: Any] { 573 | let yearData = lunarInfo[year - minYear] 574 | let leapMonth = yearData[0] // 闰月 575 | let monthData = yearData[3] 576 | var monthDataArr = toString(monthData) 577 | 578 | // 还原数据至16位,少于16位的在前面插入0(二进制存储时前面的0被忽略) 579 | for _ in 0..<(16 - monthDataArr.count) { 580 | monthDataArr.insert("0", at: 0) 581 | } 582 | 583 | let len = (leapMonth != 0) ? 13 : 12 // 该年有几个月 584 | var yearDays = 0 585 | var monthDays: [Int] = [] 586 | 587 | for i in 0.. [Int] { 609 | let lunarYearDays = getLunarYearDays(year) 610 | let end = between > 0 ? between : (lunarYearDays["yearDays"] as! Int) - abs(between) 611 | let monthDays = lunarYearDays["monthDays"] as! [Int] 612 | var tempDays = 0 613 | var month = 0 614 | for i in 0.. end { 618 | month = i 619 | tempDays = tempDays - monthDaysI 620 | break 621 | } 622 | } 623 | 624 | return [year, month, end - tempDays + 1] 625 | } 626 | 627 | /// 两个公历日期之间的天数 628 | /// - Parameters: 629 | /// - year1: 年1 630 | /// - month1: 月1 631 | /// - day1: 日1 632 | /// - year2: 年2 633 | /// - month2: 月2 634 | /// - day2: 日2 635 | /// - Returns: 间隔天数 636 | private static func getDaysBetweenSolar(_ year1: Int, _ month1: Int, _ day1: Int, _ year2: Int, _ month2: Int, _ day2: Int) -> Int { 637 | var calendar = Calendar(identifier: .gregorian) 638 | calendar.timeZone = timeZone 639 | var comp = DateComponents() 640 | comp.year = year1; comp.month = month1 + 1; comp.day = day1 641 | let date1 = calendar.date(from: comp)! 642 | comp.year = year2; comp.month = month2 + 1; comp.day = day2 643 | let date2 = calendar.date(from: comp)! 644 | return Int((date2.timeIntervalSince1970 - date1.timeIntervalSince1970) / 86400) 645 | } 646 | 647 | /// 根据距离正月初一的天数计算农历日期 648 | /// - Parameters: 649 | /// - year: 公历年 650 | /// - month: 月 651 | /// - day: 日 652 | /// - Returns: 农历日期 653 | private static func getLunarByBetween(_ year: Int, _ month: Int, _ day: Int) -> [Int] { 654 | let yearData = lunarInfo[year - minYear] 655 | let zenMonth = yearData[1] 656 | let zenDay = yearData[2] 657 | let between = getDaysBetweenSolar(year, zenMonth - 1, zenDay, year, month, day) 658 | if between == 0 { // 正月初一 659 | return [year, 0, 1] 660 | } else { 661 | let lunarYear = between > 0 ? year : year - 1 662 | return getLunarDateByBetween(lunarYear, between) 663 | } 664 | } 665 | 666 | /// 根据 NSDate 获得天 667 | /// - Parameter date: date 668 | /// - Returns: 天 669 | private static func getDay(_ date: Date) -> Int { 670 | let gregorian = Calendar(identifier: .gregorian) 671 | let components = gregorian.dateComponents([.weekday], from: date) 672 | return (components.weekday! - 1) 673 | } 674 | 675 | /// 获取公历年一年的二十四节气 676 | /// - Parameter year: 年 677 | /// - Returns: 节气名 678 | private static func getYearTerm(_ year: Int) -> [String: String] { 679 | var res: [String: String] = [:] 680 | let keys = solarTerms[year] 681 | let values = lunarCalendarData["solarTerm"]! 682 | if let keys = keys { 683 | for (index, value) in keys.enumerated() { 684 | res[value] = i18n(values[index]) 685 | } 686 | } 687 | return res 688 | } 689 | 690 | /// 获得生肖 691 | /// - Parameter year: 年 692 | /// - Returns: 生肖 693 | private static func getYearZodiac(_ year: Int) -> String { 694 | let num = year - 1890 + 25 // 参考干支纪年的计算,生肖对应地支 695 | return i18n(lunarCalendarData["zodiac"]?[num % 12]) 696 | } 697 | 698 | /// 计算天干地支 699 | /// - Parameter num: 60进制中的位置(把60个天干地支,当成一个60进制的数) 700 | /// - Returns: 天干地支 701 | private static func cyclical(_ num: Double) -> String { 702 | let tiangan = i18n(lunarCalendarData["heavenlyStems"]![Int(num.truncatingRemainder(dividingBy: 10))]) 703 | let dizhi = i18n(lunarCalendarData["earthlyBranches"]![Int(num.truncatingRemainder(dividingBy: 12))]) 704 | return String(format: "%@%@", tiangan, dizhi) 705 | } 706 | 707 | /// 获取干支纪年 708 | /// - Parameters: 709 | /// - year: 干支所在年 710 | /// - offset: 偏移量,默认为0,便于查询一个年跨两个干支纪年(以立春为分界线) 711 | /// - Returns: 干支纪年 712 | private static func getLunarYearName(_ year: Int, _ offset: Int) -> String { 713 | // 1890年1月小寒(小寒一般是1月5或6日)以前为己丑年,在60进制中排25 714 | let temp = year + offset - 1865 /* -1890+25 */ 715 | return cyclical(Double(temp)) 716 | } 717 | 718 | /// 判断公历年是否是闰年 719 | /// - Parameter year: 公历年 720 | /// - Returns: 是否是闰年 721 | public static func isLeapYear(_ year: Int) -> Bool { 722 | return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) 723 | } 724 | 725 | /// 获取公历月份的天数 726 | /// - Parameters: 727 | /// - year: 公历年 728 | /// - month: 公历月 729 | /// - Returns: 该月天数 730 | private static func getSolarMonthDays(_ year: Int, _ month: Int) -> Int { 731 | if month == 1 { // 二月 闰月处理 732 | return isLeapYear(year) ? 29 : 28 733 | } else { // 普通月份查表 734 | return solarDaysOfMonth[month] 735 | } 736 | } 737 | 738 | /// 统一日期输入参数(输入月份从1开始,内部月份统一从0开始) 739 | /// - Parameters: 740 | /// - year: 年 741 | /// - month: 月 742 | /// - day: 日 743 | /// - Returns: 格式化后的日期 744 | private static func formatDate(_ year: Int, _ month: Int, _ day: Int) -> [String: Any] { 745 | let now = Date() 746 | var gregorian = Calendar(identifier: .gregorian) 747 | gregorian.timeZone = timeZone 748 | let components = gregorian.dateComponents([.year, .month, .day], from: now) 749 | let _year = year 750 | let _month = month - 1 751 | let _day = day > 0 ? day : components.day! 752 | 753 | if (year < minYear) || (year > maxYear) { 754 | return ["error": 100, "msg": errorCode[100]!] 755 | } 756 | 757 | return [ 758 | "year": _year, 759 | "month": _month, 760 | "day": _day 761 | ] 762 | } 763 | 764 | /// 判断是否处于农历新年 765 | /// - Parameters: 766 | /// - year: 阳历年 767 | /// - month: 阳历月 768 | /// - day: 阳历日 769 | /// - Returns: 是否处于农历新年 770 | private static func isNewLunarYear(_ year: Int, _ month: Int, _ day: Int) -> Bool { 771 | let springFestivalDate = springFestival[year - minYear] 772 | let springFestivalMonth = springFestivalDate[0] 773 | let springFestivalDay = springFestivalDate[1] 774 | 775 | if month > springFestivalMonth { 776 | return true 777 | } else if month == springFestivalMonth { 778 | return (day >= springFestivalDay) 779 | } else { 780 | return false 781 | } 782 | } 783 | 784 | /// 公历转换成农历 785 | /// - Parameters: 786 | /// - _year: 公历年 787 | /// - _month: 公历月 788 | /// - _day: 公历日 789 | /// - Returns: 农历年月日 790 | public static func solarToLunar(_ _year: Int, _ _month: Int, _ _day: Int) -> [String: Any] { 791 | let inputDate = formatDate(_year, _month, _day) 792 | 793 | if inputDate["error"] != nil { 794 | return inputDate 795 | } 796 | 797 | let year = inputDate["year"]! as! Int 798 | let month = inputDate["month"]! as! Int 799 | let day = inputDate["day"]! as! Int 800 | memoryCache.current = year 801 | 802 | // 二十四节气 803 | var termList: [String: Any] 804 | let termListCache = memoryCache.get(key: "termList") 805 | if termListCache != nil { 806 | termList = termListCache as! [String: Any] 807 | } else { 808 | termList = getYearTerm(year) 809 | memoryCache.setKey("termList", Value: termList) 810 | } 811 | 812 | // 干支所在年份 813 | let GanZhiYear = isNewLunarYear(_year, _month, _day) ? (year + 1) : year 814 | 815 | let lunarDate = getLunarByBetween(year, month, day) 816 | let lunarDate0 = Int(lunarDate[0]) 817 | let lunarDate1 = Int(lunarDate[1]) 818 | let lunarDate2 = Int(lunarDate[2]) 819 | 820 | let lunarLeapMonth = getLunarLeapYear(lunarDate0) 821 | var lunarMonthName = "" 822 | 823 | if lunarLeapMonth > 0, lunarLeapMonth == lunarDate1 { 824 | let mStr = i18n(lunarCalendarData["monthCn"]?[lunarDate1 - 1]) 825 | lunarMonthName = String(format: "闰%@月", mStr) 826 | } else if lunarLeapMonth > 0, lunarDate1 > lunarLeapMonth { 827 | let mStr = i18n(lunarCalendarData["monthCn"]?[lunarDate1 - 1]) 828 | lunarMonthName = String(format: "%@月", mStr) 829 | } else { 830 | let mStr = i18n(lunarCalendarData["monthCn"]?[lunarDate1]) 831 | lunarMonthName = String(format: "%@月", mStr) 832 | } 833 | 834 | // 农历节日判断 835 | let lunarFtv: String? 836 | let lunarMonthDays = getLunarYearDays(lunarDate0)["monthDays"]! as! [Int] 837 | 838 | // 除夕 839 | if lunarDate1 == lunarMonthDays.count - 1, lunarDate2 == (lunarMonthDays[lunarMonthDays.count - 1] as Int) { 840 | lunarFtv = lunarFestival["d0100"] 841 | } else if lunarLeapMonth > 0, lunarDate1 >= lunarLeapMonth { 842 | let date = formatDay(lunarDate1 - 1, lunarDate2) 843 | lunarFtv = lunarFestival[date] 844 | } else { 845 | let date = formatDay(lunarDate1, lunarDate2) 846 | lunarFtv = lunarFestival[date] 847 | } 848 | 849 | // 放假安排:0无特殊安排,1工作,2放假 850 | let yearKey = String(format: "y%d", year) 851 | let dayKey = formatDay(month, day) 852 | var workTime = 0 853 | if let hasData = worktime[yearKey]?[dayKey] { 854 | workTime = hasData 855 | } 856 | 857 | return [ 858 | "lunarDay": lunarDate[2], 859 | "lunarMonthName": lunarMonthName, 860 | "lunarDayName": lunarCalendarData["dateCn"]![lunarDate2 - 1], 861 | "solarFestival": i18n(solarFestival[formatDay(month, day)]), 862 | "lunarFestival": i18n(lunarFtv), 863 | "weekFestival": getWeekFestival(year, month + 1, day), 864 | "worktime": workTime, 865 | "GanZhiYear": getLunarYearName(GanZhiYear, 0), 866 | "zodiac": getYearZodiac(GanZhiYear), 867 | "term": termList[formatDay(month, day)] ?? "" 868 | ] 869 | } 870 | 871 | /// 某月公历 872 | /// - Parameters: 873 | /// - year: 公历年 874 | /// - month: 公历月 875 | /// - Returns: 公历 876 | private static func solarCalendar(_ _year: Int, _ _month: Int) -> [String: Any] { 877 | let inputDate = formatDate(_year, _month, -1) 878 | 879 | if inputDate["eror"] != nil { 880 | return inputDate 881 | } 882 | 883 | let year = inputDate["year"]! as! Int 884 | let month = inputDate["month"]! as! Int 885 | 886 | let firstDate = date(year, month, 1) 887 | 888 | var res: [String: Any] = [ 889 | "firstDay": getDay(firstDate!), // 该月1号星期几 890 | "monthDays": getSolarMonthDays(year, month), // 该月天数 891 | "monthData": [] 892 | ] 893 | 894 | res["monthData"] = createMonthData(year, month + 1, res["monthDays"] as! Int, 1) 895 | 896 | var firstDay = res["firstDay"] as! Int 897 | 898 | let identifier = NSLocale.current.identifier.lowercased() 899 | if identifier.hasSuffix("japanese") || identifier.hasSuffix("buddhist") { 900 | // 处理日本日历和佛教日历 901 | firstDay += 1 902 | } 903 | 904 | let moveDays = (firstDay >= weekStart) ? firstDay : (firstDay + 7) 905 | let preFillDays = moveDays - weekStart 906 | 907 | // 前补齐 908 | let preYear = (month - 1 < 0) ? (year - 1) : year 909 | let preMonth = (month - 1 < 0) ? 11 : (month - 1) 910 | let preMonthDays = getSolarMonthDays(preYear, preMonth) 911 | let preMonthData = createMonthData(preYear, preMonth + 1, preFillDays, preMonthDays - preFillDays + 1) 912 | 913 | var tempResMonthData: NSArray = res["monthData"] as! [Any] as NSArray 914 | res["monthData"] = (preMonthData as NSArray).addingObjects(from: tempResMonthData as! [Any]) 915 | // 后补齐 916 | let length = (res["monthData"] as! [Any]).count 917 | let fillLen = 7 * 6 - length // [matrix 7 * 6] 918 | if fillLen != 0 { 919 | let nextYear = (month + 1 > 11) ? (year + 1) : year 920 | let nextMonth = (month + 1 > 11) ? 0 : (month + 1) 921 | let nextMonthData = createMonthData(nextYear, nextMonth + 1, fillLen, 1) 922 | tempResMonthData = (res["monthData"] as! [[String: Int]]) as NSArray 923 | res["monthData"] = tempResMonthData.addingObjects(from: nextMonthData) 924 | } 925 | return res 926 | } 927 | 928 | /// 计算一个日历面板(42 天)的所有信息 929 | /// - Parameters: 930 | /// - year: 公历年 931 | /// - month: 月(1-12) 932 | /// - Returns: 一个日历面板(42 天)的所有信息 [String: Any] 933 | public static func calendar(_ year: Int, _ month: Int) -> [String: Any] { 934 | let inputDate = formatDate(year, month, -1) 935 | 936 | if inputDate["error"] != nil { 937 | return inputDate 938 | } 939 | 940 | let year = inputDate["year"]! as! Int 941 | let month = inputDate["month"]! as! Int 942 | 943 | var calendarData = solarCalendar(year, month + 1) 944 | let monthData = calendarData["monthData"] as! [[String: Int]] 945 | 946 | for i in 0.. Int { 965 | let lunarYearDays = getLunarYearDays(year) 966 | let monthDays = lunarYearDays["monthDays"] as! [Int] 967 | var days = 0 968 | for i in 0.. [String: Any] { 985 | let inputDate = formatDate(_year, _month, _day) 986 | 987 | if inputDate["error"] != nil { 988 | return inputDate 989 | } 990 | 991 | let year = inputDate["year"]! as! Int 992 | let month = inputDate["month"]! as! Int 993 | let day = inputDate["day"]! as! Int 994 | 995 | let between = getDaysBetweenZheng(year, month, day) // 离正月初一的天数 996 | let yearData = lunarInfo[year - minYear] 997 | let zenMonth = yearData[1] 998 | let zenDay = yearData[2] 999 | 1000 | let timeInterval = date(year, zenMonth - 1, zenDay)!.timeIntervalSince1970 + Double(between) * 86400.0 1001 | let offDate = Date(timeIntervalSince1970: timeInterval as TimeInterval) 1002 | let gregorian = Calendar(identifier: Calendar.Identifier.gregorian) 1003 | let components = gregorian.dateComponents([.year, .month, .day], from: offDate) 1004 | 1005 | return [ 1006 | "year": components.year!, 1007 | "month": components.month!, 1008 | "day": components.day! 1009 | ] 1010 | } 1011 | } 1012 | -------------------------------------------------------------------------------- /Tests/LinuxMain.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | 3 | import LunarCoreTests 4 | 5 | var tests = [XCTestCaseEntry]() 6 | tests += LunarCoreTests.allTests() 7 | XCTMain(tests) 8 | -------------------------------------------------------------------------------- /Tests/LunarCoreTests/LunarCoreTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | @testable import LunarCore 3 | 4 | final class LunarCoreTests: XCTestCase { 5 | func testExample() { 6 | // This is an example of a functional test case. 7 | // Use XCTAssert and related functions to verify your tests produce the correct 8 | // results. 9 | XCTAssertEqual("\(LunarCore.calendar(2020, 6))", "") 10 | } 11 | 12 | static var allTests = [ 13 | ("testExample", testExample), 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /Tests/LunarCoreTests/XCTestManifests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | 3 | #if !canImport(ObjectiveC) 4 | public func allTests() -> [XCTestCaseEntry] { 5 | return [ 6 | testCase(LunarCoreTests.allTests), 7 | ] 8 | } 9 | #endif 10 | --------------------------------------------------------------------------------