这是一个 Swift 软件包,它将实现以下功能:
干支纪年是以六十年为一个周期的循环,历史上用于记录中国和东亚文化圈的时间。最常见的用途是根据你的出生年份确定你的中国生肖。
来源:维基百科的干支纪年
该来源包含 2 个连续的干支纪年周期 - 总共 120 年的生肖数据
在 Xcode 中创建项目后,安装软件包。
在 Xcode 中,
https://github.com/theevo/SexagenaryCycle1924
可执行文件仅用于帮助 GitHub Actions 构建 JSON 文件(自动化万岁!)。
Swift 软件包包含 1 个可执行文件和 1 个库。Swift 开发者只需添加库即可。你无需将可执行文件添加到你的项目中。
要使任何给定的命令生效,请在你的 Swift 文件顶部包含以下导入语句。
import SexagenaryCycle1924
let query = try! ZodiacQuery(birthday: "11-26-1978")
print(query.animal.name) // ".Horse"
let formatter = DateFormatter()
formatter.dateFormat = "MM-dd-yyyy"
formatter.timeZone = TimeZone.current
let date = formatter.date(from: "10-31-1947")
let query = try! ZodiacQuery(date: date)
print(query.animal.name) // ".Ox"
为什么?从你的查询返回的动物包含一个 日期范围数组。可以使用 ZodiacQuery.prettyPrintRange()
方法获取与你的特定查询匹配的范围。
存在两个日期范围是故意的,你可以在下面标记为“JSON 文件”的部分中阅读完整解释。
let query = try! ZodiacQuery(birthday: "02-09-2024")
print(query.prettyPrintRange()) // "Jan 22, 2023 - Feb 9, 2024"
除了你的中国生肖动物之外,还有特定于你的出生年份的其他信息,例如元素、天干和地支。这是结构体
public struct SexagenaryAnimal: Encodable {
public var name: Name
public var element: String
public var heavenlyStem: String
public var earthlyBranch: String
public var dates: [DateRange]
public struct DateRange: Encodable {
public var start: Date
public var end: Date
}
}
它是一个包含 60 种动物/元素组合的数组。
虽然相隔 12/24/36/48 岁的人可能拥有相同的中国生肖动物(例如:蛇),但他们都不同,因为他们的元素不同。他们的天干也将不同。
// Sample of all the Snake entries:
{
"heavenlyStem" : "己",
"dates" : [
{
"start" : "1929-02-10T00:00:00Z",
"end" : "1930-01-29T00:00:00Z"
},
{
"start" : "1989-02-06T00:00:00Z",
"end" : "1990-01-26T00:00:00Z"
}
],
"name" : "Snake",
"element" : "Yin Earth",
"earthlyBranch" : "巳"
},
{
"heavenlyStem" : "辛",
"dates" : [
{
"start" : "1941-01-27T00:00:00Z",
"end" : "1942-02-14T00:00:00Z"
},
{
"start" : "2001-01-24T00:00:00Z",
"end" : "2002-02-11T00:00:00Z"
}
],
"name" : "Snake",
"element" : "Yin Metal",
"earthlyBranch" : "巳"
},
{
"heavenlyStem" : "癸",
"dates" : [
{
"start" : "1953-02-14T00:00:00Z",
"end" : "1954-02-02T00:00:00Z"
},
{
"start" : "2013-02-10T00:00:00Z",
"end" : "2014-01-30T00:00:00Z"
}
],
"name" : "Snake",
"element" : "Yin Water",
"earthlyBranch" : "巳"
},
{
"heavenlyStem" : "乙",
"dates" : [
{
"start" : "1965-02-02T00:00:00Z",
"end" : "1966-01-20T00:00:00Z"
},
{
"start" : "2025-01-29T00:00:00Z",
"end" : "2026-02-16T00:00:00Z"
}
],
"name" : "Snake",
"element" : "Yin Wood",
"earthlyBranch" : "巳"
},
{
"heavenlyStem" : "丁",
"dates" : [
{
"start" : "1977-02-18T00:00:00Z",
"end" : "1978-02-06T00:00:00Z"
},
{
"start" : "2037-02-15T00:00:00Z",
"end" : "2038-02-03T00:00:00Z"
}
],
"name" : "Snake",
"element" : "Yin Fire",
"earthlyBranch" : "巳"
},
出生年份正好相隔 60 年的人将拥有相同的动物和元素。他们也拥有相同的天干。
我没有使用 120 个元素的数组(那样会重复信息),而是决定使 dates
成为一个包含该组合日期范围的数组。在此文件中,你保证可以获得任何给定的动物/元素组合的 2 个日期范围。
就目前的形式而言,维基百科表格对程序员不友好。
如果你看到此表格,则不容易确定你的出生日期是否在以下日期范围内。另请注意,日期范围的数据类型是字符串,而不是日期。
行 | 年份 1924–1983 | 年份 1984–2043 | 关联元素 | 天干 | 地支 | 关联动物 |
---|---|---|---|---|---|---|
1 | 1924 年 2 月 05 日–1925 年 1 月 23 日 | 1984 年 2 月 02 日–1985 年 2 月 19 日 | 阳木 | 甲 | 子 | 鼠 |
2 | 1925 年 1 月 24 日–1926 年 2 月 12 日 | 1985 年 2 月 20 日–1986 年 2 月 08 日 | 阴木 | 乙 | 丑 | 牛 |
3 | 1926 年 2 月 13 日–1927 年 2 月 01 日 | 1986 年 2 月 09 日–1987 年 1 月 28 日 | 阳火 | 丙 | 寅 | 虎 |
此处的任务是传播可用的干支纪年数据,使其对程序员友好,同时保持数据完整性。
HTML 表格从维基百科复制并另存为 TSV 文件。从 TSV 文件中,创建了一个 JSON 文件作为进一步优化的起点。
在充分尊重原始来源材料的前提下,TSV 文件将尽可能保持其原始形式 - 仅在数据值需要更正的极少数情况下进行编辑。
利用源 JSON,此软件包将具有一种方法,可以生成一个新的 JSON 文件,其中包含实际的日期类型(而不是原始文件中的字符串),从而使查找日期的生肖动物更容易。
如果你觉得我没有实现此项目的使命,或者你有其他疑问,请联系我。
Theo Vora: Mastodon
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⣤⣤⣤⣤⣤⣤⣤⣤⣄⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣤⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣶⣤⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣶⣿⣿⣿⣿⣿⠿⠟⠛⠛⠉⠉⠉⠉⠉⠉⠉⠉⠛⠛⠻⠿⢿⣿⣿⣿⣿⣷⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣾⣿⣿⣿⡿⠟⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠛⢿⣿⣿⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⣿⣿⡿⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⢿⣿⣿⣿⣦⡄⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⢀⣴⣿⣿⣿⡿⠋⠀⠀⢀⣶⣷⣶⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣶⣶⡄⠀⠀⠈⠻⣿⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣠⣾⣿⣿⡿⠋⠀⠀⠀⠀⢸⣿⣿⡿⣿⣧⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⣿⢿⣿⣿⡇⠀⠀⠀⠀⠈⢻⣿⣿⣿⣆⠀⠀⠀⠀⠀
⠀⠀⠀⠀⣰⣿⣿⣿⠏⠀⠀⠀⠀⠀⠀⠘⣿⣿⡇⠀⠙⢷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⠋⠁⢰⣿⣿⡇⠀⠀⠀⠀⠀⠀⠙⣿⣿⣿⣧⠀⠀⠀⠀
⠀⠀⠀⣼⣿⣿⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⢿⣿⣷⠀⠀⠀⠳⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠜⠁⠀⠀⣼⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣿⣿⣧⠀⠀⠀
⠀⠀⣰⣿⣿⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣿⣿⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣿⣿⣧⠀⠀
⠀⢠⣿⣿⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⣿⣿⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⣿⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⣿⣿⡆⠀
⠀⣾⣿⣿⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣿⣿⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⣿⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⠀
⢠⣿⣿⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⣿⣿⣷⡀⠀⠀⢀⣀⣠⣤⣤⣄⣀⡀⠀⠀⠀⣼⣿⣿⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⡇
⢸⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⣿⣿⣷⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣼⣿⣿⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣿⣿⡇
⢸⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿
⢸⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⡿
⢸⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⣿⣿⡇
⠀⣿⣿⣿⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⣿⣿⠇
⠀⢻⣿⣿⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⣿⣿⡿⠀
⠀⠈⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⠈⠙⠻⠿⠿⣿⣿⡿⠿⠟⠋⠁⠀⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣿⠃⠀
⠀⠀⠸⣿⣿⣿⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣿⡏⠀⠀
⠀⠀⠀⠹⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣿⠏⠀⠀⠀
⠀⠀⠀⠀⠘⣿⣿⣿⣧⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⣿⣿⣦⡀⠀⠀⠀⠀⠀⣴⣿⣿⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⣿⣿⣿⠏⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠈⢿⣿⣿⣿⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣿⣿⡇⠀⠀⠀⠀⠀⣿⣿⡿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⡿⠃⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠙⢿⣿⣿⣿⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠻⣿⠀⠀⠀⠀⠀⠀⣿⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⣿⠟⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣿⣿⣿⣶⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⠀⠀⠀⠀⠀⠉⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣴⣿⣿⣿⡿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠻⣿⣿⣿⣿⣷⣦⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣤⣶⣿⣿⣿⣿⠿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠻⢿⣿⣿⣿⣿⣿⣷⣶⣦⣤⣤⣤⣤⣤⣤⣤⣤⣤⣶⣶⣿⣿⣿⣿⣿⡿⠟⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠛⠻⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠛⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠉⠉⠉⠉⠉⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
JSON 文件以及 ZodiacRecords.animals
中的所有时间都设置为 GMT+0 00:00。
因此,自然而然地,在执行查询之前以及在向用户显示日期范围时,有必要执行时区转换。
我最初的计划正是这样做。有什么更好的方法来确保最终的准确性呢?
在构建此软件包后,简单的答案是我看不到它的价值,因此我放弃了这项努力。
添加中国时区所能提供的具体增值服务于农历新年除夕出生的<1%
(我的猜测)的人口。
在重新考虑这个想法之前,需要回答以下两件事。
第一:用户必须提供他们的出生时间。我认为大多数用户不在乎。同样,除非考虑到上面的农历新年除夕情景,否则它不会发挥作用。如果你能证明我错了,我们再谈。
第二:如果在中国的农历新年当天,一个人出生在农历新年的除夕,他们会被分配到哪个生肖动物?如果你知道答案,请联系我。