非常方便的Swift公历转为农历

2024-03-13 21:18

本文主要是介绍非常方便的Swift公历转为农历,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

翻到早年在iOS中开发的《梅花易数》代码,时间久了,对其中公历与农历互换的算法又看了半天。特此记下核心代码部分。

Cocoa已有一套公历农历互换的算法,非常简单、实用。在Swift中又进行了特定的简化,更加方便。

日历与日期

let gregorian = Calendar(identifier: .gregorian)
let components = gregorian.dateComponents([.year, .month, .day], from: Date());
print(components.year!, components.month!, components.day!) // 2021 8 20

日历与日期分开,需要年月日时分秒中的哪部分,自己取。

算出今天的农历

let lunar = Calendar(identifier: .chinese)
let convComp = lunar.dateComponents([.year, .month, .day, .hour], from: Date())
print(convComp.year!, convComp.month!, convComp.day!, convComp.hour!)  // 38 7 13 2

使用.chinese来构造Calendar,即可拥有一套完整的农历日历。

打印结果中,38为今年年号“辛丑”在六十甲子纳音表中的序号,后面三数分别代表农历七月十三,02:00。美中不足的是小时没有转换为以十二地支为序的时辰。但这并不难实现。

算出特定日期的农历

let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm"
let date = formatter.date(from: "1984-08-05 07:15")print(date!.description)  // 1984-08-04 23:15:00 +0000,格林尼治标准时间let lunar = Calendar(identifier: .chinese)
let convComp = lunar.dateComponents([.year, .month, .day, .hour], from: date!)
print(convComp.year!, convComp.month!, convComp.day!, convComp.hour!)  // 1 7 9 7

公历1984年8月5日的农历为甲子年七月九日。

JavaScript语言也有相应的实现,可惜C语言尚没有发现。

这篇关于非常方便的Swift公历转为农历的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/806223

相关文章

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

C#设计模式(1)——单例模式(讲解非常清楚)

一、引言 最近在学设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二同时可以给一些初学设计模式的朋友一些参考。首先我介绍的是设计模式中比较简单的一个模式——单例模式(因为这里只牵涉到一个类) 二、单例模式的介绍 说到单例模式,大家第一

单精度浮点数按存储格式转为整数的程序

///#include<cstdio>//-----------------union int_char{unsigned char ch[4];float i;};void out_put(union int_char x)//x86是小端对其模式,即最数据的最低位存储在地址的最低位上。{printf("单精度浮点数值为:%f\n",x.i,x.i);printf("存储位置从左到右

【2024 版】最新 kali linux 入门及常用简单工具介绍(非常详细)

一、介绍 kali Linux Kali Linux 是一个基于 Debian 的 Linux 发行版,主要用于数字取证和渗透测试。它预装了大量的安全审计和渗透测试工具,被广泛应用于网络安全领域。 (一)特点 工具丰富:集成了数百种用于渗透测试、漏洞评估、密码破解等方面的工具。开源免费:任何人都可以免费下载和使用,并且可以根据自己的需求进行定制。安全性高:经过严格的安全测试和更新,确保系

url参数中带有号,需要用先把url做个解析,使其方便在网络上传递

需求:提交异步通知地址给宝付的投标接口,发现投标成功后,异步通知地址没有被调用 排查:通过和宝付技术对接,发现是203,地址重定向错误。深入排查,发现异步通知返回的地址中&号之后的参数宝付没有收到 结论:表单提交的参数中的异步通知地址中的&号没有做urlencode()处理导致传递丢失参数。 地址参数中带有&号,java在做提交的时候,不能正确传递&,导致地址中&之后的内容丢失。故此需要ur

[置顶] 你必须非常努力,才能看起来毫不费力!(愿与君共勉)

有一群人,他们积极自律,每天按计划行事,有条不紊;他们不张扬,把自己当成最卑微的小草,等待着人生开出花朵的那天。他们早晨5点多起来健身,你在睡觉;7点开始享受丰盛的早餐,蛋白质维生素淀粉粗纤维样样俱全,为新的一天起了一个好头,当他们收拾妥当准备开始一整天的工作时,你还在睡觉;          他们用上午的高效时间完成了一个又一个任务,甚至发现的新的商机,发现了有可能给人生带来改观的机遇

myeclipse中的转为Web项目

一直以来都用的是myeclipse,昨天心血来潮,将myeclipse中生成的web项目导入eclipse,发现原来web左上角的小球不见了,变成了J标志,即,javaweb项目标示,变成了Java项目标示,网上找资料发现需要以下操作。 1,首先看是否有红色叹号,如果有红色叹号说明引入jar包路径错误,不匹配。先把所有的jar包匹配正确。 2,到.peject文件修改<natures>.

Swift知识点---RxSwift学习

1. 什么是RxSwift RxSwift是Swift函数响应式编程的一个开源库,由Github的ReactiveX组织开发、维护 RxSwift的目的是:让数据/事件流 和 异步任务能够更方便的序列化处理,能够使用Swift进行响应式编程 RxSwift本质上还是观察者模式,并且是一个响应式的,并且可以序列化的 观察者模式 观察者模式包括:KVO、通知等 爸爸妈妈照看观察宝宝 其中,

大模型的学习路线(非常详细)神仙级教程,手把手教会你

如果读者朋友不想深入学习大模型,则了解提示词的使用原则也可以了。要是既不想深入学习,又要做大模型相关的项目,则对于工程同学来说,学习RAG也能把大模型玩转起来(可参考:[大语言模型RAG落地方案]。下面的步骤写给想系统性学习大模型的朋友们。(后续打算写一个大模型学习系列,详细介绍相关知识点,欢迎关注) 先来一张整体结构图,越是下面部分,越是基础: 可以按以下步骤学习: 1. 理解基础概念

AI产品经理:ai产品经理从零基础到精通,非常详细收藏我这一篇就够了

在互联网的浪潮中,AI人工智能领域无疑是最引人注目的风口。AI产品经理,作为这一领域的新兴岗位,以其高薪、低压力、无年龄限制等优势,吸引了众多互联网从业者的目光。随着GPT等AIGC工具的兴起,AI产品经理的市场需求日益增长。 AI产品经理需不需要懂算法?🤔‍‍‍ AI产品经理不必像算法工程师那样精通算法,但必须能够与算法工程师有效沟通,了解如何管理AI项目,协调项目资源。 成功转行AI产