はじめに
Swift における日付の取り扱いが、他の言語と比較すると少しわかりにくいと感じるのは筆者だけでしょうか?
今回は、Swift における現在日時の取得方法について見ていきます。
環境
Xcode: 10.2.1
Swift: 5.0.1
目次
現在の日時を取得するには?
現在日時取得のダメな例
Date型を使用することで、現在の日時を取得することができます。
最初にダメな例を示します。
この例では Date型の変数 dt に Date のインスタンスを代入しています。このようにすると、変数 dt には日時情報が代入されますが表示してみると現在日時ではないことがわかります。
// NG例 import UIKit let dt : Date = Date() print(dt)
実行例を以下に示します。
正しく表示されているように見えますが、現在よりも9時間前の時刻で表示されていることがわかります(サンプルコードを実行したのは2019/6/22 23:08頃です)
なぜ9時間前の時刻が表示されたのか?
これは、UTC(協定世界時)が表示されているからです。UTCは世界共通時であり、日本時間から見て9時間前に設定されています。言い換えれば、日本時間はUTC+9時間ということになります。
現在日時の正しい取得例
現在日時を正しく取得したい場合は、DateFormatter を使用します。
DateFormatter を使用すると、表示書式とロケールを指定することができます。
「ロケール」とは、システムにおける言語や国、地域のことです。ロケールを設定することでその地域における時刻を取得することができます。例えば、ロケールを「ja_JP」にすると日本における時刻を取得することができます。ちなみに「ja-JP」は「言語コード-国コード」を表しています。
主な言語コードを以下に示します。
de | ドイツ語 | ja | 日本語 |
ko | 韓国語 | en | 英語 |
es | スペイン語 | ru | ロシア語 |
fr | フランス語 | zh | 中国語 |
主な国コードを以下に示します。
DE | ドイツ | JP | 日本 |
KR | 大韓民国 | US | アメリカ合衆国 |
ES | スペイン | RU | ロシア |
FR | フランス | CN | 中華人民共和国 |
DateFormatterの書式を以下に示します。
class func dateFormat(fromTemplate: String,
options opts: Int,
locale: Locale?) -> String?
第1引数:表示したい日付書式を指定します。書式は後述します。
第2引数:オプションは現在定義されていないので 0 を指定してください。
第3引数:ロケールを文字列で指定します。
以下に現在日時を正しく取得する例を示します。
let dt = Date() let dateFormatter = DateFormatter() // DateFormatter を使用して書式とロケールを指定する dateFormatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "yMMMdHms", options: 0, locale: Locale(identifier: "ja_JP")) print(dateFormatter.string(from: dt))
実行例を以下に示します。
日付の書式について
使用可能な日付の書式を以下表に示します(間違いがある場合はコメント欄から報告いただけると幸いです)。
書式 | 説明 | 表示例 |
y | 西暦の下2桁 | 2019年→2019年 |
yy | 西暦の下2桁 | 2019年→19年 |
yyyy | 西暦4桁 | 2019年→2019年 |
M | 月 | 6月→6月 |
MM | 月(ゼロ埋め) | 6月→06月 |
MMM | 月(言語表記) | 6月→6月(言語コードが日本の場合) 6月→Jun(言語コードが英語の場合) |
d | 日 | 5日→5日 |
dd | 日(ゼロ埋め) | 5日→05日 |
h | 時(12時間表記) | 17時→PM5時 |
hh | 時(ゼロ埋めの12時間表記) | 8時→AM08時 |
H | 時(24時間表記) | 17時→17時 |
HH | 時(ゼロ埋めの24時間表記) | 8時→08時 |
m | 分 | 5分→5 |
mm | 分(ゼロ埋め) | 5分→05 |
s | 秒 | 7秒→7 |
ss | 秒(ゼロ埋め) | 7秒→07 |
SSS | ミリ秒 | 732ミリ秒→732 |
D | 年明けからの日数 | 6月23日→174 |
DD | 年明けからの日数(ゼロ埋め) | 1月3日→3 |
w | 年明けからの週 | 6月23日→26 |
ww | 年明けからの週(ゼロ埋め) | 1月3日→01 |
E | 曜日(短縮系) | 日曜日→Sun |
EEEE | 曜日 | 日曜日→Sunday |
EEEEE | 曜日(先頭1文字) | 日曜日→S |
a | 午前 or 午後 | 午前ならAM, 午後ならPM |
コメント
[…] 前回の記事では、現在日時を表示する方法を紹介しました。少しだけDateFormetterの使用方法について説明しましたが、今回はさらに掘り下げて見ていきます。 […]