日付の計算で迷惑な仕様と出くわしてハマった件(犯人は YYYY)
有効期限などを計算する際に現在日時の1年後を計算することがよくあると思います。
その際の計算方法としてNSCalendarのdateByAddingComponentsを使用すればよいと思っていましたが、場合によって計算がうまくいかない場合がありました。
NSDateComponents* com = [NSDateComponents new];
[com setYear:2018];
[com setMonth:12];
[com setDay:29];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate* baseDay = [calendar dateFromComponents:com];
NSDateComponents *date= [[NSDateComponents alloc] init];
date.year= 1;
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
[fmt setCalendar:calendar];
[fmt setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"ja_JP"]];
fmt.timeZone = [NSTimeZone systemTimeZone];
fmt.dateFormat = @"YYYY/MM/dd";
NSDate *expireDate = [calendar dateByAddingComponents:date toDate:baseDay options:0];
NSSTring *strExpireDate = [NSString stringWithFormat:@"%@",[fmt stringFromDate:expireDate]];
↑の実装であればstrExpireDateは2019/12/29になってほしいところですが、実際は2020/12/29になります。
犯人は「YYYY」
いろいろ試して特定の年月日でずれることがわかったので、きっと計算の仕方でなにか書き方が間違っているはずと試して、いろいろな方が書いてある方法を試しているうちにふと気づきました。
「YYYY?あれここって大文字だっけ?」
調べてみるとNSDateFormatter.dateFormatにおける「年」において
「YYYY」「yyyy」はそれぞれ定義されており、結論としてはここを修正することでうまくいきました。
NSDateComponents* com = [NSDateComponents new];
[com setYear:2018];
[com setMonth:12];
[com setDay:29];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate* baseDay = [calendar dateFromComponents:com];
NSDateComponents *date= [[NSDateComponents alloc] init];
date.year= 1;
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
[fmt setCalendar:calendar];
[fmt setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"ja_JP"]];
fmt.timeZone = [NSTimeZone systemTimeZone];
fmt.dateFormat = @"yyyy/MM/dd"; //←ここを修正
NSDate *expireDate = [calendar dateByAddingComponents:date toDate:baseDay options:0];
NSSTring *strExpireDate = [NSString stringWithFormat:@"%@",[fmt stringFromDate:expireDate]];
もともとはteratailにも質問しましたが、結局自己解決してしまったので一応元ネタとしてリンクを貼ります。
元記事
https://teratail.com/questions/168328
参考
http://d.hatena.ne.jp/nakamura001/20150102/1420213850
Author And Source
この問題について(日付の計算で迷惑な仕様と出くわしてハマった件(犯人は YYYY)), 我々は、より多くの情報をここで見つけました https://qiita.com/kota-miyasaka/items/4b4fc34e551d6c9705c3著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .