iOS開(kāi)發(fā)中,經(jīng)常會(huì)遇到各種各樣的時(shí)間問(wèn)題傻寂,8小時(shí)時(shí)差息尺,時(shí)間戳,求時(shí)間間隔疾掰,農(nóng)歷等等搂誉。解決辦法網(wǎng)上比比皆是,但大多零零散散静檬,很多資料并沒(méi)有說(shuō)明其中問(wèn)題炭懊。這里集中總結(jié)一下,以便于以后查閱和供大家參考巴柿。有我自己的理解凛虽,錯(cuò)漏之處請(qǐng)大家吐槽死遭。
NSDate的8小時(shí)問(wèn)題
NSDate轉(zhuǎn)字符串時(shí)間
初始化一個(gè)NSDate時(shí)間[NSDate date]广恢,獲取的是零時(shí)區(qū)的時(shí)間(格林尼治的時(shí)間: 年-月-日 時(shí):分:秒: +時(shí)區(qū)),而北京時(shí)間是東八區(qū)時(shí)間呀潭,因?yàn)闀r(shí)區(qū)不同钉迷,所以打印的時(shí)間相差了8小時(shí)。此刻表示的時(shí)間是一樣的钠署。
7NSDate?*date?=?[NSDate?date];
NSLog(@"date時(shí)間?=?%@",?date);
NSDateFormatter?*formatter?=?[[NSDateFormatter?alloc]?init];
[formatter?setDateFormat:@"yyyy-MM-dd?HH:mm:ss?Z"];
NSString?*dateStr?=?[formatter?stringFromDate:date];
NSLog(@"字符串時(shí)間?=?%@",?dateStr);
打印結(jié)果:
22016-12-07?10:44:24.470?timeTest[32743:2995134]?date時(shí)間?=?2016-12-07?02:44:24?+0000
2016-12-07?10:44:24.471?timeTest[32743:2995134]?字符串時(shí)間?=?2016-12-07?10:44:24?+0800
打印結(jié)果前面的時(shí)間是北京時(shí)間:2016-12-07 10:44:24.470糠聪。而date打印出來(lái)的時(shí)間顯示少了8小時(shí),因?yàn)樗硎镜氖橇銜r(shí)區(qū)(+0000)時(shí)間02:44:24谐鼎。此刻對(duì)應(yīng)東八區(qū)的北京時(shí)間就是10:44:24舰蟆。只是時(shí)區(qū)不同,表示的時(shí)間點(diǎn)是一樣的狸棍。好比1公斤和2斤身害,重量是一樣的。[NSDate date]獲取的時(shí)間單位是零時(shí)區(qū)(+0000)草戈,我們所要的北京時(shí)間的單位是東八區(qū)(+0800)塌鸯。
系統(tǒng)會(huì)默認(rèn)[NSDate date]獲取的時(shí)間為零時(shí)區(qū)時(shí)間,而經(jīng)過(guò)NSDateFormatter轉(zhuǎn)化為字符串時(shí)間就是當(dāng)前所在時(shí)區(qū)的準(zhǔn)確時(shí)間唐片,并沒(méi)有8小時(shí)誤差丙猬。
轉(zhuǎn)字符串時(shí)間的時(shí)區(qū)設(shè)定
上文中NSDate時(shí)間轉(zhuǎn)為字符串時(shí)間并沒(méi)有設(shè)置NSDateFormatter的timeZone涨颜。不設(shè)置會(huì)默認(rèn)使用當(dāng)前所在的時(shí)區(qū),與設(shè)置系統(tǒng)時(shí)區(qū)formatter.timeZone = [NSTimeZone systemTimeZone]的效果是一樣的茧球。
也可以設(shè)置時(shí)區(qū)庭瑰,獲取指定時(shí)區(qū)的字符串時(shí)間
6NSDate?*date?=?[NSDate?date];
NSDateFormatter?*formatter?=?[[NSDateFormatter?alloc]?init];
[formatter?setDateFormat:@"yyyy-MM-dd?HH:mm:ss"];
formatter.timeZone?=?[NSTimeZone?timeZoneWithName:@"Asia/Shanghai"];//東八區(qū)時(shí)間
NSString?*dateStr?=?[formatter?stringFromDate:date];
NSLog(@"字符串時(shí)間?=?%@",?dateStr);
這時(shí)獲取的時(shí)間就是東八區(qū)時(shí)間,哪怕手機(jī)拿到零時(shí)區(qū)的格林尼治抢埋,獲取的也是東八區(qū)的時(shí)間见擦,因?yàn)檫@里指定時(shí)區(qū)了。也有如下時(shí)區(qū)指定:
1
2formatter.timeZone?=?[NSTimeZone?timeZoneWithName:@"Asia/Tokyo"];//東九區(qū)時(shí)間
formatter.timeZone?=?[NSTimeZone?timeZoneWithName:@"GMT"];//零區(qū)時(shí)間
通過(guò)下面方法可得到系統(tǒng)支持的時(shí)區(qū)對(duì)應(yīng)的字符串常量:
4NSArray?*zones?=?[NSTimeZone?knownTimeZoneNames];
for(NSString?*zoneinzones)?{
NSLog(@"時(shí)區(qū)名?=?%@",?zone);
}
時(shí)區(qū)對(duì)照表
字符串時(shí)間轉(zhuǎn)NSDate
字符串時(shí)間轉(zhuǎn)為NSDate時(shí)間也會(huì)有時(shí)區(qū)問(wèn)題羹令。也會(huì)遇到有所謂的8小時(shí)誤差鲤屡,其實(shí)就是時(shí)區(qū)不同。比如下面的例子:
4NSDateFormatter?*formatter?=?[[NSDateFormatter?alloc]?init];
[formatter?setDateFormat:@"yyyy-MM-dd?HH:mm:ss?Z"];
NSDate?*newDate?=?[formatter?dateFromString:@"2016-12-07?14:06:24?+0800"];
NSLog(@"newDate?=?%@",?newDate);
打印結(jié)果:
2016-12-07?14:12:17.468?timeTest[34279:3155380]?newDate?=?2016-12-07?06:06:24?+0000
NSDateFormatter的指定格式是:@"yyyy-MM-dd HH:mm:ss Z"福侈。這里面的Z指的是時(shí)區(qū)酒来。要轉(zhuǎn)化的字符串時(shí)間格式必須和這個(gè)格式匹配,上面給定的字符串時(shí)間是:@"2016-12-07 14:06:24 +0800"肪凛,是一個(gè)東八區(qū)時(shí)間堰汉,轉(zhuǎn)化為NSDate后是零區(qū)時(shí)間2016-12-07 06:06:24 +0000,字面顯示上少了8小時(shí)伟墙,其實(shí)時(shí)間一樣翘鸭。
其實(shí)如果上面給定的字符串時(shí)間為@"2016-12-07 14:06:24 +0000",轉(zhuǎn)化出來(lái)的NSDate時(shí)間會(huì)完全一樣戳葵,因?yàn)樽址畷r(shí)間為零時(shí)區(qū)時(shí)間就乓,不存在時(shí)區(qū)誤差。大家可以試一下拱烁。
當(dāng)不指定字符串時(shí)間的時(shí)區(qū)時(shí)生蚁,即沒(méi)有后面的+0800,同時(shí)要把NSDateFormatter時(shí)間格式里的Z去掉戏自,保證格式匹配邦投。系統(tǒng)會(huì)認(rèn)為字符串時(shí)間是系統(tǒng)所在時(shí)區(qū)的時(shí)間,轉(zhuǎn)化為NSDate時(shí)間是零時(shí)區(qū)時(shí)間擅笔。
同樣志衣,也可以使用formatter.timeZone = [NSTimeZone timeZoneWithName:@"GMT"];這種方式指定字符串時(shí)間的時(shí)區(qū),和用Z對(duì)應(yīng)+0000是一樣的猛们。
NSDate轉(zhuǎn)當(dāng)前時(shí)區(qū)的NSDate時(shí)間
因?yàn)閇NSDate date]得出的時(shí)間是零時(shí)區(qū)時(shí)間念脯,當(dāng)我們要獲取當(dāng)前所在時(shí)區(qū)的NSDate時(shí)間時(shí),通常會(huì)用以下方法:
5NSDate?*date?=?[NSDate?date];
NSTimeZone?*zone?=?[NSTimeZone?systemTimeZone];
NSInteger?interval?=?[zone?secondsFromGMTForDate:date];
NSDate?*localDate?=?[date??dateByAddingTimeInterval:interval];
NSLog(@"localDate?=?%@",localDate);
打印結(jié)果:
2016-12-07?14:49:03.777?timeTest[34519:3183548]?localDate?=?2016-12-07?14:49:03?+0000
上面代碼中zone是當(dāng)前時(shí)區(qū)阅懦,interval是當(dāng)前時(shí)區(qū)和零時(shí)區(qū)時(shí)間的差值和二,最后結(jié)果localDate是零時(shí)區(qū)時(shí)間date加上這個(gè)差值interval,得到當(dāng)前時(shí)區(qū)的NSDate時(shí)間耳胎。更有甚者惯吕,在開(kāi)發(fā)中直接加8*60*60或28800這樣的值,因?yàn)橄嗖?小時(shí)嘛。這樣在東八區(qū)沒(méi)問(wèn)題,在其他時(shí)區(qū)時(shí)間就錯(cuò)了。
其實(shí)這種做法是不科學(xué)的,因?yàn)榈玫降淖罱K時(shí)間還是零時(shí)區(qū)時(shí)間,時(shí)間后面明顯是+0000恕汇,在使用中一般不顯示時(shí)區(qū),所以認(rèn)為當(dāng)做當(dāng)前時(shí)區(qū)的時(shí)間使用也未嘗不可榆骚。此為大坑!
坑1:這時(shí)如果轉(zhuǎn)為字符串時(shí)間,又會(huì)增加8小時(shí)。因?yàn)樽鰰r(shí)間轉(zhuǎn)換的時(shí)候陆蟆,系統(tǒng)會(huì)認(rèn)為這個(gè)NSDate是零時(shí)區(qū)溪猿,得到的字符串時(shí)間是東八區(qū)的。
解決辦法是:將錯(cuò)就錯(cuò),字符串時(shí)間也設(shè)置為零時(shí)區(qū)的字符串時(shí)間性宏。從深坑跌入更深的坑书斜!
10NSDate?*date?=?[NSDate?date];
NSTimeZone?*zone?=?[NSTimeZone?systemTimeZone];
NSInteger?interval?=?[zone?secondsFromGMTForDate:date];
NSDate?*localDate?=?[date?dateByAddingTimeInterval:interval];
NSDateFormatter?*formatter?=?[[NSDateFormatter?alloc]?init];
[formatter?setDateFormat:@"yyyy-MM-dd?HH:mm:ss"];
formatter.timeZone?=?[NSTimeZone?timeZoneWithName:@"UTC"];
NSString?*dateStr?=?[formatter?stringFromDate:localDate];
NSLog(@"字符串時(shí)間?=?%@",?dateStr);
這里的@"UTC"是指世界標(biāo)準(zhǔn)時(shí)間,也是現(xiàn)在用的時(shí)間標(biāo)準(zhǔn)酵使,東八區(qū)比這個(gè)時(shí)間也是快8小時(shí)荐吉,這里填@"GMT"也是可以的。
坑2:在與后臺(tái)交互時(shí)口渔,有時(shí)需要+0000時(shí)區(qū)样屠,這時(shí)只能手動(dòng)拼接字符串更改這個(gè)時(shí)區(qū)字段,改為正確的時(shí)區(qū)。
所以痪欲,在開(kāi)發(fā)中盡量不要這么做悦穿,當(dāng)時(shí)間要求顯示、存儲(chǔ)或與后臺(tái)交互的時(shí)候勤揩,使用字符串時(shí)間咧党!不要使用轉(zhuǎn)化的NSDate。
時(shí)間換算陨亡,時(shí)間戳的概念
當(dāng)前時(shí)間轉(zhuǎn)時(shí)間戳
時(shí)間戳是指1970年1月1日0時(shí)0分0秒到當(dāng)前時(shí)間的秒數(shù)傍衡。注意:這里的當(dāng)前時(shí)間是指零時(shí)區(qū)的NSDate時(shí)間。
2NSDate?*date?=?[NSDate?date];
NSTimeInterval?timeIn?=?[date?timeIntervalSince1970];
NSLog(@"時(shí)間戳?=?%.0f",?timeIn);
打印結(jié)果:
2016-12-07 15:41:04.000 timeTest[34994:3232390] 時(shí)間戳 = 1481096464
時(shí)間戳轉(zhuǎn)當(dāng)前時(shí)間
7NSDate?*date?=?[NSDate?date];
NSTimeInterval?timeIn?=?[date?timeIntervalSince1970];
NSDate?*newDate?=?[NSDate?dateWithTimeIntervalSince1970:timeIn];
NSDateFormatter?*dateFormatter?=?[[NSDateFormatter?alloc]?init];
[dateFormatter?setDateFormat:@"yyyy-MM-dd?HH:mm:ss?Z"];
NSString?*newTime?=?[dateFormatter?stringFromDate:newDate];
NSLog(@"初始化時(shí)間?=?%@负蠕,時(shí)間戳=%.0f蛙埂,時(shí)間戳轉(zhuǎn)為NSDate時(shí)間?=?%@,轉(zhuǎn)為字符串時(shí)間?=?%@",?date,?timeIn,?newDate,?newTime);
打印結(jié)果:
2016-12-07?16:11:56.146?timeTest[35186:3253589]?初始化時(shí)間?=?2016-12-07?08:11:56?+0000遮糖,時(shí)間戳=1481098316绣的,時(shí)間戳轉(zhuǎn)為NSDate時(shí)間?=?2016-12-07?08:11:56?+0000,轉(zhuǎn)為字符串時(shí)間?=?2016-12-07?16:11:56?+0800
注意時(shí)間戳使用的NSDate時(shí)間是當(dāng)前零時(shí)區(qū)的時(shí)間欲账!當(dāng)前零時(shí)區(qū)時(shí)間屡江!當(dāng)前零時(shí)區(qū)時(shí)間!重要的事情說(shuō)三遍赛不!不要進(jìn)行NSDate轉(zhuǎn)當(dāng)前時(shí)區(qū)的NSDate時(shí)間惩嘉,再轉(zhuǎn)時(shí)間戳。下面是驗(yàn)證:
17NSDate?*date?=?[NSDate?date];
NSLog(@"系統(tǒng)零時(shí)區(qū)NSDate時(shí)間?=?%@",?date);
NSTimeInterval?timeIn?=?[date?timeIntervalSince1970];
NSLog(@"系統(tǒng)零時(shí)區(qū)NSDate時(shí)間轉(zhuǎn)化為時(shí)間戳?=?%.0f",?timeIn);
NSTimeZone?*zone?=?[NSTimeZone?systemTimeZone];
NSInteger?interval?=?[zone?secondsFromGMTForDate:date];
NSDate?*localDate?=?[date??dateByAddingTimeInterval:interval];
NSLog(@"轉(zhuǎn)化為本地NSDate時(shí)間?=?%@",?localDate);
NSTimeInterval?timeIn2?=?[localDate?timeIntervalSince1970];
NSLog(@"本地NSDate時(shí)間轉(zhuǎn)化為時(shí)間戳?=?%.0f",?timeIn2);
NSDate?*detaildate?=?[NSDate?dateWithTimeIntervalSince1970:timeIn];
NSDate?*detaildate2?=?[NSDate?dateWithTimeIntervalSince1970:timeIn2];
NSDateFormatter?*dateFormatter?=?[[NSDateFormatter?alloc]?init];
[dateFormatter?setDateFormat:@"yyyy-MM-dd?HH:mm:ss?Z"];
NSString?*newTime?=?[dateFormatter?stringFromDate:detaildate];
NSString?*newTime2?=?[dateFormatter?stringFromDate:detaildate2];
NSLog(@"最終轉(zhuǎn)為字符串時(shí)間1?=?%@踢故,?時(shí)間2?=?%@",?newTime,?newTime2);
打印結(jié)果:
52016-12-07?16:13:57.834?timeTest[35211:3255842]?系統(tǒng)零時(shí)區(qū)NSDate時(shí)間?=?2016-12-07?08:13:57?+0000
2016-12-07?16:13:57.834?timeTest[35211:3255842]?系統(tǒng)零時(shí)區(qū)NSDate時(shí)間轉(zhuǎn)化為時(shí)間戳?=?1481098438
2016-12-07?16:13:57.835?timeTest[35211:3255842]?轉(zhuǎn)化為本地NSDate時(shí)間?=?2016-12-07?16:13:57?+0000
2016-12-07?16:13:57.835?timeTest[35211:3255842]?本地NSDate時(shí)間轉(zhuǎn)化為時(shí)間戳?=?1481127238
2016-12-07?16:13:57.836?timeTest[35211:3255842]?最終轉(zhuǎn)為字符串時(shí)間1?=?2016-12-07?16:13:57?+0800文黎,?時(shí)間2?=?2016-12-08?00:13:57?+0800
問(wèn)題解釋詳見(jiàn)上文的NSDate轉(zhuǎn)當(dāng)前時(shí)區(qū)的NSDate時(shí)間。
時(shí)間操作與比較
時(shí)間初始化和比較方法
幾個(gè)時(shí)間初始化方法:
14//初始化當(dāng)前時(shí)間殿较,返回零時(shí)區(qū)時(shí)間
NSDate?*date?=?[NSDate?date];
//以當(dāng)前時(shí)間為準(zhǔn)耸峭,正數(shù)超前指定秒數(shù),負(fù)數(shù)延后指定秒數(shù)
NSDate?*laterDate?=?[NSDate?dateWithTimeIntervalSinceNow:60];
//以2001-01-01?00:00:00?+0000為基準(zhǔn)淋纲,正數(shù)超前指定秒數(shù)劳闹,負(fù)數(shù)延后指定秒數(shù)
NSDate?*newDate?=?[NSDate?dateWithTimeIntervalSinceReferenceDate:60];
//以1970-01-01?00:00:00?+0000為基準(zhǔn),正數(shù)超前指定秒數(shù)帚戳,負(fù)數(shù)延后指定秒數(shù)
NSDate?*newDate1?=?[NSDate?dateWithTimeIntervalSince1970:60];
//實(shí)例方法玷或,以指定時(shí)間為基準(zhǔn),正數(shù)超前指定秒數(shù)片任,負(fù)數(shù)延后指定秒數(shù)
NSDate?*newDate2?=?[date?dateByAddingTimeInterval:60];
//很久以后的某一天
NSDate?*newDate3?=?[NSDate?distantFuture];
//很久以前的某一天
NSDate?*newDate4?=?[NSDate?distantPast];
幾個(gè)時(shí)間比較方法:
8//比較兩個(gè)時(shí)間是否相等
-?(BOOL)isEqualToDate:(NSDate?*)otherDate;
//兩個(gè)時(shí)間比較,返回較早時(shí)間
-?(NSDate?*)earlierDate:(NSDate?*)anotherDate;
//兩個(gè)時(shí)間比較蔬胯,返回較晚時(shí)間
-?(NSDate?*)laterDate:(NSDate?*)anotherDate;
//兩個(gè)時(shí)間比較盅粪,返回枚舉類型
-?(NSComparisonResult)compare:(NSDate?*)other;
幾個(gè)計(jì)算時(shí)間間隔的方法:
10//返回實(shí)例時(shí)間與refDate時(shí)間間隔秒數(shù)
-?(NSTimeInterval)timeIntervalSinceDate:(NSDate?*)refDate;
//返回實(shí)例時(shí)間與當(dāng)前時(shí)間間隔秒數(shù)
-?(NSTimeInterval)timeIntervalSinceNow;
//返回實(shí)例時(shí)間的時(shí)間戳
-?(NSTimeInterval)timeIntervalSince1970;
//返回實(shí)例時(shí)間和2001-01-01?00:00:00?+0000的間隔秒數(shù)
-?(NSTimeInterval)timeIntervalSinceReferenceDate;
//返回當(dāng)前時(shí)間和2001-01-01?00:00:00?+0000的間隔秒數(shù)
+?(NSTimeInterval)timeIntervalSinceReferenceDate;
獲取年月日時(shí)分秒周時(shí)區(qū)
OC里的時(shí)間坑太多窒悔,根本沒(méi)辦法像其他語(yǔ)言那樣直接time.year就能獲取年份筷屡。要想獲取NSDate的年月日需要使用日歷對(duì)象NSCalendar端辱。
5NSDate?*date?=?[NSDate?date];
NSCalendar?*cal?=?[NSCalendar?currentCalendar];
NSDateComponents?*dateComps?=?[cal?components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond|NSCalendarUnitWeekday|NSCalendarUnitWeekOfMonth|NSCalendarUnitWeekOfYear|NSCalendarUnitTimeZone?fromDate:date];
NSLog(@"時(shí)間?=?%@",?date);
NSLog(@"年=%ld,月=%ld,日=%ld,時(shí)=%ld,分=%ld,秒=%ld,周=%ld,本月第%ld周,本年第%ld周,時(shí)區(qū)=%@",?dateComps.year,?dateComps.month,?dateComps.day,?dateComps.hour,?dateComps.minute,?dateComps.second,?dateComps.weekday,?dateComps.weekOfMonth,?dateComps.weekOfYear,?dateComps.timeZone.name);
打印結(jié)果:
1
22016-12-07?17:20:41.639?timeTest[35734:3311752]?時(shí)間?=?2016-12-07?09:20:41?+0000
2016-12-07?17:20:41.640?timeTest[35734:3311752]?年=2016,月=12,日=7,時(shí)=17,分=20,秒=41,周=4,本月第2周,本年第50周,時(shí)區(qū)=Asia/Shanghai
NSDateComponents創(chuàng)建方法中添加的枚舉NSCalendarUnit,是后面要獲取的年月日時(shí)分秒必須對(duì)應(yīng)添加的筐带。比如要獲取年dateComps.year,就需要添加枚舉NSCalendarUnitYear。
可以看到窿冯,[NSDate date]時(shí)間可以使用NSCalendar直接獲取當(dāng)前時(shí)區(qū)的時(shí)分秒,打印的時(shí)和時(shí)區(qū)即可看出确徙。這是[NSCalendar currentCalendar]日歷對(duì)象初始化的原因醒串,也可以用[[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]指定Identifier的方式初始化陽(yáng)歷日歷”苫剩可以試試指定Identifier為NSCalendarIdentifierChinese芜赌,打印的是中國(guó)農(nóng)歷。
dateComps.weekOfMonth是今天屬于本月的第幾周伴逸。
dateComps.weekOfYear是今天屬于本年的第幾周缠沈。
dateComps.weekday是星期,這個(gè)和日常使用有些不同错蝴。上述程序打印的是周=4洲愤,但2016-12-07是周三。這里weekday的對(duì)應(yīng)關(guān)系是:周日-1顷锰,周一-2柬赐,周二-3,周三-4馍惹,周四-5躺率,周五-6,周六-7万矾。畢竟國(guó)外慣例周日是每周的第一天悼吱。
農(nóng)歷
獲取農(nóng)歷的工具方法,可根據(jù)需求添加農(nóng)歷節(jié)日和二十四節(jié)氣
28+?(NSString?*)LunarForSolarYear:(int)wCurYear?Month:(int)wCurMonth?Day:(int)wCurDay
{
//農(nóng)歷日期名
NSArray?*cDayName?=??[NSArray?arrayWithObjects:@"*",@"初一",@"初二",@"初三",@"初四",@"初五",@"初六",@"初七",@"初八",@"初九",@"初十",@"十一",@"十二",@"十三",@"十四",@"十五",@"十六",@"十七",@"十八",@"十九",@"二十",@"廿一",@"廿二",@"廿三",@"廿四",@"廿五",@"廿六",@"廿七",@"廿八",@"廿九",@"三十",nil];
//農(nóng)歷月份名
NSArray?*cMonName?=??[NSArray?arrayWithObjects:@"*",@"正月",@"二月",@"三月",@"四月",@"五月",@"六月",@"七月",@"八月",@"九月",@"十月",@"冬月",@"臘月",nil];
//公歷每月前面的天數(shù)
const?int?wMonthAdd[12]?=?{0,31,59,90,120,151,181,212,243,273,304,334};
//農(nóng)歷數(shù)據(jù)
const?int?wNongliData[100]?=?{2635,333387,1701,1748,267701,694,2391,133423,1175,396438
,3402,3749,331177,1453,694,201326,2350,465197,3221,3402
,400202,2901,1386,267611,605,2349,137515,2709,464533,1738
,2901,330421,1242,2651,199255,1323,529706,3733,1706,398762
,2741,1206,267438,2647,1318,204070,3477,461653,1386,2413
,330077,1197,2637,268877,3365,531109,2900,2922,398042,2395
,1179,267415,2635,661067,1701,1748,398772,2742,2391,330031
,1175,1611,200010,3749,527717,1452,2742,332397,2350,3222
,268949,3402,3493,133973,1386,464219,605,2349,334123,2709
,2890,267946,2773,592565,1210,2651,395863,1323,2707,265877};
static?int?nTheDate,nIsEnd,m,k,n,i,nBit;
//計(jì)算到初始時(shí)間1921年2月8日的天數(shù):1921-2-8(正月初一)
nTheDate?=?(wCurYear?-?1921)?*?365?+?(wCurYear?-?1921)?/?4?+?wCurDay?+?wMonthAdd[wCurMonth?-?1]?-?38;
if((!(wCurYear?%?4))?&&?(wCurMonth?>?2))
nTheDate?=?nTheDate?+?1;
//計(jì)算農(nóng)歷天干良狈、地支后添、月、日
nIsEnd?=?0;
m?=?0;
while(nIsEnd?!=?1)?{
if(wNongliData[m]?<?4095)
k?=?11;
else
k?=?12;
n?=?k;
while(n>=0)?{
//獲取wNongliData(m)的第n個(gè)二進(jìn)制位的值