将 currentCalendar() Date 转换为 NSCalendarIdentifierChinese
Convert currentCalendar() Date to NSCalendarIdentifierChinese
在过去的 100 年里,我已经编写了获取农历一年中第一天的函数。从循环返回的一些值是正确的。我已经用这个 link http://www.fengshuimiracle.com/154/how-work-out-your-animal-sign-and-chinese-year 验证了农历新年日期
.有没有可以参考的农历,或者我的代码中是否遗漏了一些东西。
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
loopthrough()
}
func returnDateForMonth(month:NSInteger, year:NSInteger, day:NSInteger)->NSDate{
let comp = NSDateComponents()
comp.month = month
comp.year = year
comp.day = day
let chCal = NSCalendar(calendarIdentifier: NSCalendarIdentifierChinese)
return chCal!.dateFromComponents(comp)!
}
func showDate(getDate:NSDate)->String{
let date = getDate
//let calendar = NSCalendar.currentCalendar()
let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierChinese)
let dateComponents = calendar!.components([NSCalendarUnit.Year], fromDate: date)
let firstDay = returnDateForMonth(dateComponents.month, year: dateComponents.year, day: 1)
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "dd-MMM-yy"
let formattedDate = dateFormatter.stringFromDate(firstDay)
//print("First day of this month: \(formattedDate)") // 01-Sep-15
print(formattedDate)
return formattedDate
}
func substractyear(getI:Int)->String{
let getInt = getI * -1
let components: NSDateComponents = NSDateComponents()
components.setValue(getInt, forComponent: NSCalendarUnit.Year);
let date: NSDate = NSDate()
let expirationDate = NSCalendar.currentCalendar().dateByAddingComponents(components, toDate: date, options:NSCalendarOptions(rawValue: 0))
return showDate(expirationDate!)
}
func loopthrough(){
for var i = 1; i < 100; i++ {
//print("\(i)")
substractyear(i)
}
}
输出
2014 年 1 月 31 日
2013 年 2 月 10 日
2012 年 1 月 23 日
2011 年 2 月 3 日
2010 年 2 月 14 日
2009 年 1 月 26 日
08-02-07
2007 年 2 月 18 日
2006 年 1 月 29 日
2005 年 2 月 9 日
2004 年 1 月 22 日
2003 年 2 月 1 日
2002 年 2 月 12 日
2001 年 1 月 24 日
2000 年 2 月 5 日
16-Feb-99
2098 年 1 月 28 日
07-Feb-97
19-Feb-96
95 年 1 月 31 日
94 年 2 月 10 日
93 年 1 月 23 日
2092 年 2 月 4 日
15-Feb-91
90 年 1 月 27 日
06-Feb-89
88 年 2 月 17 日
87 年 1 月 29 日
86 年 2 月 9 日
20-Feb-85
02-Feb-84
43 年 2 月 10 日
22-Jan-42
01-Feb-41
2040 年 2 月 12 日
39 年 1 月 24 日
04-Feb-38
15-Feb-37
36 年 1 月 28 日
08-Feb-35
19-Feb-34
33 年 1 月 31 日
11-Feb-32
31 年 1 月 23 日
03-Feb-30
13-Feb-29
26-1-28
06-Feb-27
17-Feb-26
25 年 1 月 29 日
10-Feb-24
22-1-23
01-Feb-22
12-Feb-21
2020 年 1 月 25 日
2019 年 2 月 5 日
16-2-18
17 年 1 月 28 日
08-Feb-16
19-2-15
2014 年 1 月 31 日
2013 年 2 月 10 日
2012 年 1 月 23 日
2011 年 2 月 3 日
2010 年 2 月 14 日
2009 年 1 月 26 日
08-02-07
2007 年 2 月 18 日
2006 年 1 月 29 日
2005 年 2 月 9 日
2004 年 1 月 22 日
2003 年 2 月 1 日
2002 年 2 月 12 日
2001 年 1 月 24 日
2000 年 2 月 5 日
16-Feb-99
2098 年 1 月 28 日
07-Feb-97
19-Feb-96
95 年 1 月 31 日
94 年 2 月 10 日
93 年 1 月 23 日
2092 年 2 月 4 日
15-Feb-91
90 年 1 月 27 日
06-Feb-89
88 年 2 月 17 日
87 年 1 月 29 日
86 年 2 月 9 日
20-Feb-85
02-Feb-84
43 年 2 月 10 日
22-Jan-42
01-Feb-41
2040 年 2 月 12 日
39 年 1 月 24 日
04-Feb-38
15-Feb-37
36 年 1 月 28 日
我不确定这是否能回答您的问题,但我认为您的代码可以大大简化:
let chineseCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierChinese)!
let formatter: NSDateFormatter = {
let fmt = NSDateFormatter()
fmt.dateStyle = .FullStyle
fmt.timeStyle = .MediumStyle
fmt.dateFormat = "dd-MMM-yy"
return fmt
}()
var comps = chineseCalendar.components([.Year], fromDate: NSDate())
for _ in 0..<100 {
comps.year -= 1
guard let newYear = chineseCalendar.dateFromComponents(comps) else { fatalError("no date for \(comps.year)") }
print(formatter.stringFromDate(newYear))
}
而且,我不确定您的原始来源是否正确。 This page 列出了不同的日期(这似乎更符合 NSCalendar 的输出)。
在过去的 100 年里,我已经编写了获取农历一年中第一天的函数。从循环返回的一些值是正确的。我已经用这个 link http://www.fengshuimiracle.com/154/how-work-out-your-animal-sign-and-chinese-year 验证了农历新年日期 .有没有可以参考的农历,或者我的代码中是否遗漏了一些东西。
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
loopthrough()
}
func returnDateForMonth(month:NSInteger, year:NSInteger, day:NSInteger)->NSDate{
let comp = NSDateComponents()
comp.month = month
comp.year = year
comp.day = day
let chCal = NSCalendar(calendarIdentifier: NSCalendarIdentifierChinese)
return chCal!.dateFromComponents(comp)!
}
func showDate(getDate:NSDate)->String{
let date = getDate
//let calendar = NSCalendar.currentCalendar()
let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierChinese)
let dateComponents = calendar!.components([NSCalendarUnit.Year], fromDate: date)
let firstDay = returnDateForMonth(dateComponents.month, year: dateComponents.year, day: 1)
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "dd-MMM-yy"
let formattedDate = dateFormatter.stringFromDate(firstDay)
//print("First day of this month: \(formattedDate)") // 01-Sep-15
print(formattedDate)
return formattedDate
}
func substractyear(getI:Int)->String{
let getInt = getI * -1
let components: NSDateComponents = NSDateComponents()
components.setValue(getInt, forComponent: NSCalendarUnit.Year);
let date: NSDate = NSDate()
let expirationDate = NSCalendar.currentCalendar().dateByAddingComponents(components, toDate: date, options:NSCalendarOptions(rawValue: 0))
return showDate(expirationDate!)
}
func loopthrough(){
for var i = 1; i < 100; i++ {
//print("\(i)")
substractyear(i)
}
}
输出
2014 年 1 月 31 日 2013 年 2 月 10 日 2012 年 1 月 23 日 2011 年 2 月 3 日 2010 年 2 月 14 日 2009 年 1 月 26 日 08-02-07 2007 年 2 月 18 日 2006 年 1 月 29 日 2005 年 2 月 9 日 2004 年 1 月 22 日 2003 年 2 月 1 日 2002 年 2 月 12 日 2001 年 1 月 24 日 2000 年 2 月 5 日 16-Feb-99 2098 年 1 月 28 日 07-Feb-97 19-Feb-96 95 年 1 月 31 日 94 年 2 月 10 日 93 年 1 月 23 日 2092 年 2 月 4 日 15-Feb-91 90 年 1 月 27 日 06-Feb-89 88 年 2 月 17 日 87 年 1 月 29 日 86 年 2 月 9 日 20-Feb-85 02-Feb-84 43 年 2 月 10 日 22-Jan-42 01-Feb-41 2040 年 2 月 12 日 39 年 1 月 24 日 04-Feb-38 15-Feb-37 36 年 1 月 28 日 08-Feb-35 19-Feb-34 33 年 1 月 31 日 11-Feb-32 31 年 1 月 23 日 03-Feb-30 13-Feb-29 26-1-28 06-Feb-27 17-Feb-26 25 年 1 月 29 日 10-Feb-24 22-1-23 01-Feb-22 12-Feb-21 2020 年 1 月 25 日 2019 年 2 月 5 日 16-2-18 17 年 1 月 28 日 08-Feb-16 19-2-15 2014 年 1 月 31 日 2013 年 2 月 10 日 2012 年 1 月 23 日 2011 年 2 月 3 日 2010 年 2 月 14 日 2009 年 1 月 26 日 08-02-07 2007 年 2 月 18 日 2006 年 1 月 29 日 2005 年 2 月 9 日 2004 年 1 月 22 日 2003 年 2 月 1 日 2002 年 2 月 12 日 2001 年 1 月 24 日 2000 年 2 月 5 日 16-Feb-99 2098 年 1 月 28 日 07-Feb-97 19-Feb-96 95 年 1 月 31 日 94 年 2 月 10 日 93 年 1 月 23 日 2092 年 2 月 4 日 15-Feb-91 90 年 1 月 27 日 06-Feb-89 88 年 2 月 17 日 87 年 1 月 29 日 86 年 2 月 9 日 20-Feb-85 02-Feb-84 43 年 2 月 10 日 22-Jan-42 01-Feb-41 2040 年 2 月 12 日 39 年 1 月 24 日 04-Feb-38 15-Feb-37 36 年 1 月 28 日
我不确定这是否能回答您的问题,但我认为您的代码可以大大简化:
let chineseCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierChinese)!
let formatter: NSDateFormatter = {
let fmt = NSDateFormatter()
fmt.dateStyle = .FullStyle
fmt.timeStyle = .MediumStyle
fmt.dateFormat = "dd-MMM-yy"
return fmt
}()
var comps = chineseCalendar.components([.Year], fromDate: NSDate())
for _ in 0..<100 {
comps.year -= 1
guard let newYear = chineseCalendar.dateFromComponents(comps) else { fatalError("no date for \(comps.year)") }
print(formatter.stringFromDate(newYear))
}
而且,我不确定您的原始来源是否正确。 This page 列出了不同的日期(这似乎更符合 NSCalendar 的输出)。