日付操作の基本

投稿者: | 2017年3月22日

Swift2まではNSDateNSCalendarオブジェクトを使った処理をしていましたが、Swift3以降NSプリフィクスの付いたものがどんどん減っているため、DateやCalendar構造体を使うようにしました。(NSDate, NSCalendarはSwift3時点でも使えます)

基本的にはNSDate, NSCalendarと同じことができます。なおDateインスタンスに対して年月日単位で送り戻しする処理は前回まとめたのでここでは省略します。

DateインスタンスとCalendarインスタンスを作る

let calendar:Calendar = Calendar(identifier: .gregorian)
var date:Date = Date()

CalendarインスタンスとDateインスタンスを組み合わせることで日付を扱うことができます。

NSCalendarのところでも触れたように、日付は国によって定義やフォーマットが異なります。が、一般的には西暦(グレゴリオ暦)を使うことになるので、Calendarインスタンスは.gregorianで生成しておきます。

Dateインスタンスは生成した瞬間、現在の日時情報が入ります。この日付情報を任意のものに変更する方法は二通りあります。(他にもあるかもしれませんが知りません)

DateFormatterインスタンスを利用して年月日を指定する
let format:DateFormatter = DateFormatter()
format.dateFormat = "yyyyMMdd"
date = format.date(from: "20170201")

DateFormatterインスタンスはdate(from: String)メソッドを使って文字列から日付を生成することができます。ただしこれを使うためには引数として与える文字列がどのようなフォーマットであるかをあらかじめdateFormatプロパティに定義する必要があります。

ここで使えるフォーマット指定はUTS(Unicode Technical Standard)に定義されたものとなります。

Calendarインスタンスを利用して年月日を指定する
let component = DateComponents(year: 2017, month: 2, day: 1)
date = calendar.date(from: component)!

Calendarインスタンスもdate(from: DateComponents)メソッドを使って日付を生成することができます。これは引数にDateComponents型のデータを与える必要がありますので、あらかじめDateComponentsインスタンスを生成する必要があります。また、dateメソッドが返す値はオプショナルなので、アンラップして使用することになります。

これらいずれかの方法によりDateインスタンスに任意の日付情報を入れることができます。当然、時刻情報も入れることができます。

DateFomatterインスタンスを利用して日付を文字列に変換する

format.dateFormat = "EEE MMM d yyyy"
let dateString:String = format.string(from: date)

DateインスタンスはDate型のデータになるので、これをそのまま表示するのは不都合があります。実際にはprint()関数で表示できちゃうけど。ただし生のまま表示するとUTCになってしまうので見た目9時間前の情報になってしまいます。DataFomatterインスタンスはこのようなタイムゾーンについてもいい塩梅で処理をしてくれます。

変換後の文字列フォーマットをdateFormatプロパティに設定したうえで、string(from: Date)メソッドにDate型のデータを渡すと指定フォーマットの文字列を返してくれます。

当初のdatecountなどでは英字略称月名や英字略称曜日名などを配列にして変換処理をしていましたが、この機能を使えばとても楽ちんですね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です