iOS中的時(shí)間和日期問(wèn)題

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)制位的值

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末薪丁,一起剝皮案震驚了整個(gè)濱河市遇西,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌严嗜,老刑警劉巖粱檀,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異漫玄,居然都是意外死亡茄蚯,警方通過(guò)查閱死者的電腦和手機(jī)压彭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)渗常,“玉大人壮不,你說(shuō)我怎么就攤上這事≈宓猓” “怎么了询一?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)癌椿。 經(jīng)常有香客問(wèn)我健蕊,道長(zhǎng),這世上最難降的妖魔是什么如失? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任绊诲,我火速辦了婚禮,結(jié)果婚禮上褪贵,老公的妹妹穿的比我還像新娘掂之。我一直安慰自己,他們只是感情好脆丁,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布世舰。 她就那樣靜靜地躺著,像睡著了一般槽卫。 火紅的嫁衣襯著肌膚如雪跟压。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天歼培,我揣著相機(jī)與錄音震蒋,去河邊找鬼。 笑死躲庄,一個(gè)胖子當(dāng)著我的面吹牛查剖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播噪窘,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼笋庄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了倔监?” 一聲冷哼從身側(cè)響起直砂,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浩习,沒(méi)想到半個(gè)月后静暂,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谱秽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年籍嘹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闪盔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弯院。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辱士,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出听绳,到底是詐尸還是另有隱情颂碘,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布椅挣,位于F島的核電站头岔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鼠证。R本人自食惡果不足惜峡竣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望量九。 院中可真熱鬧适掰,春花似錦、人聲如沸荠列。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肌似。三九已至费就,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間川队,已是汗流浹背力细。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留固额,地道東北人眠蚂。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像对雪,于是被迫代替她去往敵國(guó)和親河狐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容