文字列からNSDateを作成する, NSDateを1日進める (Swiftの場合はDate)

NSDateを文字列から作成する方法と、すでにあるNSDateを1日進めたものを取得する方法。
応用すれば、1日前や1年後など取得できる。
上記みたいな日付の変更は結構やる機会が多かったりする。

SwiftだとNSDateではなく、Dateだったりするので、それぞれの使い方をまとめます。

Objective-C

1
2
3
4
5
6
7
8
9
10
11
12
13
// 任意のNSDateを進める
NSDate *currentDate = [NSDate date];
NSDateComponents *oneDayDateComponents = [[NSDateComponents alloc] init];
[oneDayDateComponents setDay:1];
NSDate *nextDate = [[NSCalendar currentCalendar] dateByAddingComponents:oneDayDateComponents
                                                                 toDate:currentDate
                                                                options:0];
 
// 文字列からNSDateを作成する
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy/MM/dd Z"];
NSString *dateString = @"2017/07/25 +0900";
NSDate *dateFromString = [formatter dateFromString:dateString];

Swift

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 1日後の日付を取得する
let currentDate = Date()
 
// 1日後のDateComponentsを作成する (他にも指定できて、1年後とかもできる詳しくはヘッダーを参照)
let oneDayDateComponents = DateComponents(day: 1)
let nextDate = Calendar.current.date(byAdding: oneDayDateComponents,
                                     to: currentDate)
 
 
// 文字列からDateオブジェクトを作成する
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy/MM/dd Z"
let dateString = "2017/07/25 +0900"
dateFormatter.string(from: Date())
let dateFromString = dateFormatter.date(from: dateString)
print(dateFromString?.timeIntervalSince1970)

日付を扱う場合は、端末のLocale設定も影響するので注意が必要。
よくあるのは、テスト中は西暦でしか確認していなかったからOKだったけど、和暦にするとうまくいかない場合とかよくある。
そういう場合は、端末の設定に依存しないようにすることが必要。

0 件のコメント :

コメントを投稿