Swift - 实现公历、农历日期之间的相互转换

2024-02-15 21:38

本文主要是介绍Swift - 实现公历、农历日期之间的相互转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://www.hangge.com/blog/cache/detail_1843.html

有时我们需要根据一个公历(阳历)日期,得到对应的农历(阴历)日期。或者反过来,根据农历日期计算对应的公历日期。下面通过样例演示如何实现这两个日期的转换。

 

一、公历转农历

1,转换函数定义

公历转农历比较简单,直接借助系统提供的 Calendar 即可。为方便使用,这里定义一个日期转换方法。我们将公历日期的年、月、日作为参数传入,便能返回对应的农历日期(字符串形式)。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

//根据公历年、月、日获取对应的农历日期信息

func solarToLunar(year: Int, month: Int, day: Int) -> String {

    //初始化公历日历

    let solarCalendar = Calendar.init(identifier: .gregorian)

    var components = DateComponents()

    components.year = year

    components.month = month

    components.day = day

    components.hour = 12

    components.minute = 0

    components.second = 0

    components.timeZone = TimeZone.init(secondsFromGMT: 60 * 60 * 8)

    let solarDate = solarCalendar.date(from: components)

     

    //初始化农历日历

    let lunarCalendar = Calendar.init(identifier: .chinese)

    //日期格式和输出

    let formatter = DateFormatter()

    formatter.locale = Locale(identifier: "zh_CN")

    formatter.dateStyle = .medium

    formatter.calendar = lunarCalendar

    return formatter.string(from: solarDate!)

}

 

2,使用样例

1

2

print("公历:2017年11月11日")

print("农历:\(solarToLunar(year: 2017, month: 11, day: 11))")

原文:Swift - 实现公历、农历日期之间的相互转换

 

二、农历转公历

1,转换类定义

农历转公历稍微麻烦些,这里我将其封装成一个工具类。需要转换时调用 convert 方法,将农历日期的年、月、日作为参数传入,便能返回对应的公历日期的年、月、日(元组形式)。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

import Foundation

 

class LunarToSolar {

    fileprivate static var lunar_month_days = [

        1887, 0x1694, 0x16aa, 0x4ad5, 0xab6, 0xc4b7, 0x4ae, 0xa56, 0xb52a, 0x1d2a,

        0xd54, 0x75aa, 0x156a, 0x1096d, 0x95c, 0x14ae, 0xaa4d, 0x1a4c, 0x1b2a,

        0x8d55, 0xad4, 0x135a, 0x495d, 0x95c, 0xd49b, 0x149a, 0x1a4a, 0xbaa5, 0x16a8,

        0x1ad4, 0x52da, 0x12b6, 0xe937, 0x92e, 0x1496, 0xb64b, 0xd4a, 0xda8, 0x95b5,

        0x56c, 0x12ae, 0x492f, 0x92e, 0xcc96, 0x1a94, 0x1d4a, 0xada9, 0xb5a, 0x56c,

        0x726e, 0x125c, 0xf92d, 0x192a, 0x1a94, 0xdb4a, 0x16aa, 0xad4, 0x955b,

        0x4ba, 0x125a, 0x592b, 0x152a, 0xf695, 0xd94, 0x16aa, 0xaab5, 0x9b4, 0x14b6,

        0x6a57, 0xa56, 0x1152a, 0x1d2a, 0xd54, 0xd5aa, 0x156a, 0x96c, 0x94ae, 0x14ae,

        0xa4c, 0x7d26, 0x1b2a, 0xeb55, 0xad4, 0x12da, 0xa95d, 0x95a, 0x149a, 0x9a4d,

        0x1a4a, 0x11aa5, 0x16a8, 0x16d4, 0xd2da, 0x12b6, 0x936, 0x9497, 0x1496,

        0x1564b, 0xd4a, 0xda8, 0xd5b4, 0x156c, 0x12ae, 0xa92f, 0x92e, 0xc96, 0x6d4a,

        0x1d4a, 0x10d65, 0xb58, 0x156c, 0xb26d, 0x125c, 0x192c, 0x9a95, 0x1a94,

        0x1b4a, 0x4b55, 0xad4, 0xf55b, 0x4ba, 0x125a, 0xb92b, 0x152a, 0x1694, 0x96aa,

        0x15aa, 0x12ab5, 0x974, 0x14b6, 0xca57, 0xa56, 0x1526, 0x8e95, 0xd54, 0x15aa,

        0x49b5, 0x96c, 0xd4ae, 0x149c, 0x1a4c, 0xbd26, 0x1aa6, 0xb54, 0x6d6a, 0x12da,

        0x1695d,0x95a, 0x149a, 0xda4b, 0x1a4a, 0x1aa4, 0xbb54, 0x16b4, 0xada, 0x495b,

        0x936, 0xf497, 0x1496, 0x154a, 0xb6a5, 0xda4, 0x15b4, 0x6ab6, 0x126e, 0x1092f,

        0x92e, 0xc96, 0xcd4a, 0x1d4a, 0xd64, 0x956c, 0x155c, 0x125c, 0x792e, 0x192c,

        0xfa95, 0x1a94, 0x1b4a, 0xab55, 0xad4, 0x14da, 0x8a5d, 0xa5a, 0x1152b, 0x152a,

        0x1694, 0xd6aa, 0x15aa, 0xab4, 0x94ba, 0x14b6, 0xa56, 0x7527, 0xd26, 0xee53,

        0xd54, 0x15aa, 0xa9b5, 0x96c, 0x14ae, 0x8a4e, 0x1a4c, 0x11d26, 0x1aa4, 0x1b54,

        0xcd6a, 0xada, 0x95c, 0x949d, 0x149a, 0x1a2a, 0x5b25, 0x1aa4, 0xfb52, 0x16b4,

        0xaba, 0xa95b, 0x936, 0x1496, 0x9a4b, 0x154a, 0x136a5, 0xda4, 0x15ac ]

     

    fileprivate static var solar_1_1 = [

        1887, 0xec04c, 0xec23f, 0xec435, 0xec649, 0xec83e, 0xeca51, 0xecc46, 0xece3a,

        0xed04d, 0xed242, 0xed436, 0xed64a, 0xed83f, 0xeda53, 0xedc48, 0xede3d,

        0xee050, 0xee244, 0xee439, 0xee64d, 0xee842, 0xeea36, 0xeec4a, 0xeee3e,

        0xef052, 0xef246, 0xef43a, 0xef64e, 0xef843, 0xefa37, 0xefc4b, 0xefe41,

        0xf0054, 0xf0248, 0xf043c, 0xf0650, 0xf0845, 0xf0a38, 0xf0c4d, 0xf0e42,

        0xf1037, 0xf124a, 0xf143e, 0xf1651, 0xf1846, 0xf1a3a, 0xf1c4e, 0xf1e44,

        0xf2038, 0xf224b, 0xf243f, 0xf2653, 0xf2848, 0xf2a3b, 0xf2c4f, 0xf2e45,

        0xf3039, 0xf324d, 0xf3442, 0xf3636, 0xf384a, 0xf3a3d, 0xf3c51, 0xf3e46,

        0xf403b, 0xf424e, 0xf4443, 0xf4638, 0xf484c, 0xf4a3f, 0xf4c52, 0xf4e48,

        0xf503c, 0xf524f, 0xf5445, 0xf5639, 0xf584d, 0xf5a42, 0xf5c35, 0xf5e49,

        0xf603e, 0xf6251, 0xf6446, 0xf663b, 0xf684f, 0xf6a43, 0xf6c37, 0xf6e4b,

        0xf703f, 0xf7252, 0xf7447, 0xf763c, 0xf7850, 0xf7a45, 0xf7c39, 0xf7e4d,

        0xf8042, 0xf8254, 0xf8449, 0xf863d, 0xf8851, 0xf8a46, 0xf8c3b, 0xf8e4f,

        0xf9044, 0xf9237, 0xf944a, 0xf963f, 0xf9853, 0xf9a47, 0xf9c3c, 0xf9e50,

        0xfa045, 0xfa238, 0xfa44c, 0xfa641, 0xfa836, 0xfaa49, 0xfac3d, 0xfae52,

        0xfb047, 0xfb23a, 0xfb44e, 0xfb643, 0xfb837, 0xfba4a, 0xfbc3f, 0xfbe53,

        0xfc048, 0xfc23c, 0xfc450, 0xfc645, 0xfc839, 0xfca4c, 0xfcc41, 0xfce36,

        0xfd04a, 0xfd23d, 0xfd451, 0xfd646, 0xfd83a, 0xfda4d, 0xfdc43, 0xfde37,

        0xfe04b, 0xfe23f, 0xfe453, 0xfe648, 0xfe83c, 0xfea4f, 0xfec44, 0xfee38,

        0xff04c, 0xff241, 0xff436, 0xff64a, 0xff83e, 0xffa51, 0xffc46, 0xffe3a,

        0x10004e, 0x100242, 0x100437, 0x10064b, 0x100841, 0x100a53, 0x100c48,

        0x100e3c, 0x10104f, 0x101244, 0x101438, 0x10164c, 0x101842, 0x101a35,

        0x101c49, 0x101e3d, 0x102051, 0x102245, 0x10243a, 0x10264e, 0x102843,

        0x102a37, 0x102c4b, 0x102e3f, 0x103053, 0x103247, 0x10343b, 0x10364f,

        0x103845, 0x103a38, 0x103c4c, 0x103e42, 0x104036, 0x104249, 0x10443d,

        0x104651, 0x104846, 0x104a3a, 0x104c4e, 0x104e43, 0x105038, 0x10524a,

        0x10543e, 0x105652, 0x105847, 0x105a3b, 0x105c4f, 0x105e45, 0x106039,

        0x10624c, 0x106441, 0x106635, 0x106849, 0x106a3d, 0x106c51, 0x106e47,

        0x10703c, 0x10724f, 0x107444, 0x107638, 0x10784c, 0x107a3f, 0x107c53,

        0x107e48 ]

     

    fileprivate static func GetBitInt(data:Int, length:Int, shift:Int) -> Int {

        return (data&(((1<<length)-1)<<shift))>>shift

         

    }

     

    fileprivate static func SolarToInt(year:Int, month:Int, day:Int) -> Int {

        let m = (month + 9) % 12

        let y = year - m / 10

         

        return 365 * y + y / 4 - y / 100 + y / 400 + (m * 306 + 5) / 10 + (day - 1)

    }

     

    fileprivate static func SolarFromInt(g:Int) -> (IntIntInt){

        var y = (10000*g+14780)/3652425

        var ddd = g-(365*y+y/4-y/100+y/400)

        if ddd < 0 {

            y=y-1

            ddd = g-(365*y+y/4-y/100+y/400)

        }

        let mi = (100*ddd+52)/3060

        let mm = (mi+2)%12+1

        y = y+(mi+2)/12

        let dd = ddd-(mi*306+5)/10+1

        //return "\(y) \(mm) \(dd)"

        return (y, mm, dd)

    }

     

    static func convert(year: Int, month: Int, day: Int) -> (IntIntInt){

        //闰月范围1950-2050,如需要增加,自行增加

        //也就是说在1950-2050之外的阴历时间计算阳历,你需要自己给闰月。不然闰月计算阳历会出错

        var leapDic = [1952:5, 1955:3, 1957:8, 1960:6, 1963:4, 1966:3, 1968:7,

                       1971:5, 1974:4, 1976:8, 1979:6, 1982:4, 1984:10, 1987:6,

                       1990:5, 1993:3, 1995:8, 1998:5, 2001:4, 2004:2, 2006:7,

                       2009:5, 2012:4, 2014:9, 2017:6, 2020:4, 2023:2, 2025:6,

                       2028:5, 2031:3, 2033:11, 2036:6, 2039:5, 2042:2, 2044:7,

                       2047:5, 2050:3]

        let days = lunar_month_days[year-lunar_month_days[0]]

        let leap = GetBitInt(data: days, length: 4, shift: 13)

        var offset = 0

        var loopend = leap

        //判断是否是闰月

        var isleap = false

        if leapDic.keys.contains(year) {

            if leapDic[year] == month {

                isleap = true

            else {

                isleap = false

                 

            }

        }

        print("该农历日期是否闰月:\(isleap)")

         

        if !isleap {

            if month <= leap || leap == 0 {

                loopend = month-1

            else {

                loopend = month

                 

            }

        }

        for in 0..<loopend {

            offset += GetBitInt(data: days, length: 1, shift: 12-i) == 1 ? 30 : 29

        }

        offset += day

        let solar11 = solar_1_1[year-solar_1_1[0]]

        let y = GetBitInt(data: solar11, length: 12, shift: 9)

        let m = GetBitInt(data: solar11, length: 4, shift: 5)

        let d = GetBitInt(data: solar11, length: 5, shift: 0)

        let g = SolarToInt(year: y, month: m, day: d)+offset-1

        return SolarFromInt(g: g)

    }

}

 

2,使用样例

1

2

3

4

5

6

7

8

//输出待转换的农历日期

print("农历:2017年九月初九")

 

//进行转换

let solar = LunarToSolar.convert(year: 2017, month: 9, day: 9)

 

//输出对应的的公历日期

print("公历:\(solar.0)年\(solar.1)月\(solar.2)日")

原文:Swift - 实现公历、农历日期之间的相互转换


原文出自:www.hangge.com  转载请保留原文链接:http://www.hangge.com/blog/cache/detail_1843.html

这篇关于Swift - 实现公历、农历日期之间的相互转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert