├── .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 |
--------------------------------------------------------------------------------