【Swift】日時の扱い方。文字列と日時を相互変換する。時間差を算出する。(Swift 2.1、XCode 7.2)
現在日時を取得する
日時を扱うときはOjbective-Cで同じみのNSDateクラスとNSDateFormatterクラスを利用する。
以下のコードのようにNSDateクラスとNSDateFormatterクラスのインスタンスを生成し、ロケールとフォーマットのスタイルを設定する。スタイルを指定しなかった場合は出力されない。
NSDateFormatterクラスのメソッドを介してNSDateをStringに変換する。逆に、StringをNSDateに変換することもできる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// // 現在日時を表示する。 // import UIKit var testDate = NSDate() var testFormatter = NSDateFormatter() //ロケールを設定する。 testFormatter.locale = NSLocale(localeIdentifier:"ja_JP") //フォーマットのスタイルを設定する。 testFormatter.dateStyle = .MediumStyle testFormatter.timeStyle = .MediumStyle print(testFormatter.stringFromDate(testDate)) //実行結果 //2016/04/26 20:34:38 |
スタイルごとの表示例を下表に記載する。
プロパティ | 設定値 | 表示例 | |
---|---|---|---|
1 | .dateStyle | .ShortStyle | 2016/04/21 |
2 | .dateStyle | .MediumStyle | 2016/04/21 |
3 | .dateStyle | .LongStyle | 2016年4月21日 |
4 | .dateStyle | .FullStyle | 2016年4月21日木曜日 |
5 | .timeStyle | .ShortStyle | 20:49 |
6 | .timeStyle | .MediumStyle | 20:50:47 |
7 | .timeStyle | .LongStyle | 20:51:29 GMT-8 |
8 | .timeStyle | .FullStyle | 20時52分03秒 アラスカ夏時間 |
フォーマットを指定して日時を取得する。
日時のフォーマットを自分で決めたい場合がある。そんなときは、以下のコードのようにdateFormatプロパティにフォーマット文字列を設定する。変換時にフォーマット文字列のyyyyやMMなどが日時に置換される。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// // 現在日時を表示する。 // import UIKit var testDate = NSDate() var testFormatter = NSDateFormatter() //ロケールを設定する。 testFormatter.locale = NSLocale(localeIdentifier:"ja_JP") //フォーマットを設定する。 testFormatter.dateFormat = "yyyy年MM月dd日(E) a h:mm:ss.SSS" print(testFormatter.stringFromDate(testDate)) //実行結果 //2016年04月21日(木) 午後 8:58:15.118 |
下表は、フォーマットの置換文字列の一覧。
置換対象 | 内容 | 表示例 | |
---|---|---|---|
1 | yy | 西暦の下2桁 | yy年⇒16年 |
2 | yyyy | 西暦 | yyyy年⇒2016年 |
3 | M | 月 | M月⇒7月 |
4 | MM | 月(ゼロ埋め) | MM月⇒07月 |
5 | MMM | 月(言語表記) | MMM⇒7月(言語設定が英語ならJuly) |
6 | d | 日 | d日⇒3日 |
7 | dd | 日(ゼロ埋め) | ddddd日⇒00003日 |
8 | h | 時(12時間表記) | h時⇒9時 |
9 | hh | 時(12時間表記、ゼロ埋め) | hhhhh時⇒00009時 |
10 | H | 時(24時間表記) | H時⇒21時 |
11 | HH | 時(24時間表記、ゼロ埋め) | HHHHH時⇒00021時 |
12 | m | 分 | m分⇒3分 |
13 | mm | 分(ゼロ埋め) | mmmmm分⇒00003分 |
14 | s | 秒 | s秒⇒5秒 |
15 | ss | 秒(ゼロ埋め) | sssss秒⇒00008秒 |
16 | SSS | ミリ秒 | SSSミリ秒⇒756ミリ秒 |
17 | D | 年明けからの日数 | D日⇒122日 |
18 | DD | 年明けからの日数(ゼロ埋め) | DDDDD日⇒00122日 |
19 | w | 年明けからの週 | w週⇒3週 |
20 | ww | 年明けからの週(ゼロ埋め) | wwwww週⇒00003週 |
21 | E | 曜日(短縮形) | E⇒金(英語ならFri) |
22 | EEEE | 曜日 | EEEE⇒金曜日(英語ならFriday) |
23 | EEEEE | 曜日(一文字) | EEEEE⇒金(英語ならF) |
24 | a | 午前or午後 | a⇒午前(英語ならAM) |
文字列をNSDateに変換する
文字列をNSDateに変換する場合は以下のコードのようにする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// // 文字列をNSDateに変換する。 // import UIKit var testFormatter = NSDateFormatter() //ロケールを設定する。 testFormatter.locale = NSLocale(localeIdentifier:"ja_JP") //フォーマットを設定する。 testFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss" //文字列をNSDateに変換する。 let testDate = testFormatter.dateFromString("2016/04/21 21:00:00") print(testFormatter.stringFromDate(testDate!)) //実行結果 //2016/04/21 21:00:00 |
日時に時間を加算する
NSDateに時間を加算するには以下のメソッドを用いる。引数には加算する秒を入力する。1時間後、1週間後などはすべて秒数に換算して加算する必要がある。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
// // dateByAddingTimeIntervalメソッド // 日時に時間を加算する。 // import UIKit var testFormatter = NSDateFormatter() //ロケールを設定する。 testFormatter.locale = NSLocale(localeIdentifier:"ja_JP") //フォーマットを設定する。 testFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss" //文字列をNSDateに変換する。 var testDate = testFormatter.dateFromString("2016/04/21 21:00:00") //日時を表示 print(testFormatter.stringFromDate(testDate!)) //3600秒を加算 testDate = testDate!.dateByAddingTimeInterval(3600) //日時を表示 print(testFormatter.stringFromDate(testDate!)) //実行結果 //2016/04/21 21:00:00 //2016/04/21 22:00:00 |
日時の時間差を求める
現在時刻からの時間差や、日時同士の時間差(秒)を求めるには以下のメソッドを用いる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
// // timeIntervalSinceNow、timeIntervalSinceDateメソッド // 日時の時間差(秒)を求める。 // import UIKit var testFormatter = NSDateFormatter() //ロケールを設定する。 testFormatter.locale = NSLocale(localeIdentifier:"ja_JP") //フォーマットを設定する。 testFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss" //日時を作成 let testDate = testFormatter.dateFromString("2016/05/21 21:00:00") //現在時刻からの時間差(秒)を求める。 let zikansa_now = testDate?.timeIntervalSinceNow print(zikansa_now!) //日時を作成 let testDate2 = testFormatter.dateFromString("2016/05/21 21:01:00") //2つの日時の時間差(秒)を求める。 let zikansa = testDate2?.timeIntervalSinceDate(testDate!) print(zikansa!) //実行結果 //2155269.73227799 //60.0 |