LoginSignup
104

More than 5 years have passed since last update.

日付関連クラスのまとめ(Swift3)

Last updated at Posted at 2017-04-05

はじめに

日付を扱うクラスを、すぐ忘れるのでまとめました。
同じようなことができるクラスやメソッドがたくさんあります。

クラス名 説明 サポートOS
Date 日付と時間を管理するクラスです。 iOS2.0〜
DateFormatter 日付を適切な書式で表示したいときに利用するクラスです。 iOS2.0〜
Calendar カレンダーの情報を提供するクラスです。 iOS2.0〜
DateComponents 年月日時分秒を個別に管理するクラスです。 iOS2.0〜
DateInterval 2つの日時の間隔を扱いたいときに利用するクラスです。 iOS10.0〜

DateFormatter

①変換

1)文字列 → 日付へ変換

    let dateFormater = DateFormatter()
    dateFormater.locale = Locale(identifier: "ja_JP")
    dateFormater.dateFormat = "yyyy/MM/dd HH:mm:ss"
    let date = dateFormater.date(from: "2016/10/3 12:12:12") 
    print(date.description ?? "nilですよ")    // 2016-10-03 03:12:12 +0000    

【補足】24時間表示オフ対策

端末の設定 > 一般 > 日付と時刻から24時間表示をオフした場合に、dateがnilになります。

対策として、ロケールを指定します。
例) ja_JP、en_US_POSIX

2)日付 → 文字列へ変換

    let dateFormater = DateFormatter()
    dateFormater.locale = Locale(identifier: "ja_JP")
    dateFormater.dateFormat = "yyyy/MM/dd HH:mm:ss"
    let date = dateFormater.string(from: Date())
    print(date)     // 2017/04/04 10:44:31

3) DateStyleによる表示の違い

    let dateFormater = DateFormatter()
    dateFormater.locale = Locale(identifier: "ja_JP")

    //dateStyle : fullの場合
    dateFormater.dateStyle = .full
    print(dateFormater.string(from: Date()))    // 2017年4月4日火曜日

    //dateStyle : longの場合
    dateFormater.dateStyle = .long
    print(dateFormater.string(from: Date()))    // 2017年4月4日

    //dateStyle : midiumの場合
    dateFormater.dateStyle = .medium
    print(dateFormater.string(from: Date()))    // 2017/04/04

    //dateStyle : shortの場合
    dateFormater.dateStyle = .short
    print(dateFormater.string(from: Date()))    // 2017/04/04

4)TimeStyleによる表示の違い

    let dateFormater = DateFormatter()
    dateFormater.locale = Locale(identifier: "ja_JP")


    //timeStyle : fullの場合
    dateFormater.timeStyle = .full
    print(dateFormater.string(from: Date()))    // 2017/04/04 10時44分31秒 日本標準時

    //timeStyle : longの場合
    dateFormater.timeStyle = .long
    print(dateFormater.string(from: Date()))    // 2017/04/04 10:44:31 JST

    //timeStyle : mediumの場合
    dateFormater.timeStyle = .medium
    print(dateFormater.string(from: Date()))    // 2017/04/04 10:44:31

    //timeStyle : shortの場合
    dateFormater.timeStyle = .short
    print(dateFormater.string(from: Date()))    // 2017/04/04 10:44

Calendar

①初期設定

1)タイムゾーンを指定する

    var calendar = Calendar.current
    calendar.timeZone = TimeZone(identifier: "Asia/Tokyo")!

2)ロケールを指定する

    var calendar = Calendar.current
    calendar.locale = Locale(identifier: "ja")

3) 暦を指定する

    var calendar = Calendar(identifier: .gregorian) // グレゴリオ歴
    var calendar = Calendar(identifier: .japanese)  // 和暦

②各種値の取得

1)年を取得する

    var calendar = Calendar.current
    let year = calendar.component(.year, from: date)

2)月を取得する

    var calendar = Calendar.current
    let month = calendar.component(.month, from: date)

3)日を取得する

    var calendar = Calendar.current
    let day = calendar.component(.day, from: date)

4)時間を取得する

    var calendar = Calendar.current
    let hour = calendar.component(.hour, from: date)

5)分を取得する

    var calendar = Calendar.current
    let minute = calendar.component(.minute, from: date)

6)秒を取得する

    var calendar = Calendar.current
    let second = calendar.component(.second, from: date)

7)曜日を取得する

    var calendar = Calendar.current
    let weekday = calendar.component(.weekday, from: date)

8)月の文字列一覧を取得する

    var calendar = Calendar.current
    calendar.locale = Locale(identifier: "ja")
    let monthSymbols = calendar.monthSymbols

    // ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"]

9)曜日の文字列一覧を取得する

    var calendar = Calendar.current
    calendar.locale = Locale(identifier: "ja")
    let weekdaySymbols = calendar.weekdaySymbols

    // ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"]

10)曜日(short)の文字列一覧を取得する

    var calendar = Calendar.current
    calendar.locale = Locale(identifier: "ja")
    let shortWeekdaySymbols = calendar.shortWeekdaySymbols

    // ["日", "月", "火", "水", "木", "金", "土"]

11)月初の日付を取得する

    var components = Calendar
        .current.dateComponents([.year, .month, .day, .hour],
                                    from:date)
    components.day = 1
    components.hour = 9
    let startOfDay =  Calendar.current.date(from: comp)!

12)月末の日付を取得する

    var components = Calendar
        .current.dateComponents([.year, .month, .day, .hour],
                                    from:date)
    components.month = 1
    components.day = -1
    components.hour = 9
    let endOfDay Calendar.current.date(byAdding: comp, to: startOfDay!)

③経過時間

1) 経過時間(秒単位)

    let components = calendar.dateComponents([.second],
                                             from: fromDate,
                                             to: toDate)
    let passTime =  components.second!

2) 経過時間(分単位)

    let components = calendar.dateComponents([.minute],
                                             from: fromDate,
                                             to: toDate)
    let passTime =  components.minute!

3) 経過時間(日単位)

    let components = calendar.dateComponents([.day],
                                             from: fromDate,
                                             to: toDate)
    let passTime =  components.day!

④比較

1) 年月日が一致するか?


    let isSameDate = calendar.isDate(fromDate, inSameDayAs: toDate)

2) 年が一致するか?


    let isSameYear = calendar.compare(fromDate, to: toDate, toGranularity: .year) == .orderedSame

3) 月が一致するか?


    let isSameMonth = calendar.compare(fromDate, to: toDate, toGranularity: .month) == .orderedSame

4) 年月日時分秒が一致するか?

    let isSameDate = fromDate == toDate

DateComponents

①日時の操作

1)日時の指定

    var calendar = Calendar.current
    var compornets = DateComponents()
    compornets.year = 2017
    compornets.month = 10
    compornets.day = 1

    let date = calendar.date(from: compornets)

    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "ja_JP")
    dateFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss"
    print(dateFormatter.string(from: date!)) // 2017/10/01 00:00:00

2)日時の変更

    var calendar = Calendar.current
    var compornets = calendar
        .dateComponents([.year, .month, .day,
                         .hour, .minute, .second,
                         .nanosecond],
                         from: Date())
     compornets.month = 9


    let date = calendar.date(from: compornets)

    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "ja_JP")
    dateFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss"
    print(dateFormatter.string(from: date!)) // 2017/09/04 16:54:19

②各種値の取得

1)年月日を取得する

    var dataCompornets = calendar
        .dateComponents([.year, .month, .day], from: Date())

    print("\(dataCompornets.year!)/\(dataCompornets.month!)/\(dataCompornets.day!)")

2) 和暦を取得する

    let calendar = Calendar(identifier: .japanese)

    var dataCompornets = calendar
        .dateComponents([.year, .month, .day], from: Date())

    print("平成\(dataCompornets.year!)\(dataCompornets.month!)\(dataCompornets.day!)日")

DateInterval

①指定時間後の日付

1)開始時間、終了時間の指定なし

    let dateInterval = DateInterval()
    print(dateInterval.start)   // 2017-04-04 06:39:13 +0000
    print(dateInterval.end)     // 2017-04-04 06:39:13 +0000

2)開始時間と間隔を指定する(60秒後)

        let dateInterval = DateInterval(start: Date(), duration: 60)
        print(dateInterval.start)   // 2017-04-04 06:39:13 +0000
        print(dateInterval.end)     // 2017-04-04 06:40:13 +0000

3)開始時間と終了時間を指定する(1時間後)

        let endDate = Date().addingTimeInterval(3600)
        let dateInterval = DateInterval(start: Date(), end: endDate)

        print(dateInterval.start)   // 2017-04-04 06:39:13 +0000
        print(dateInterval.end)     // 2017-04-04 07:39:13 +0000

まとめ

開発をしていて結構日付を扱うことが多いのではないでしょうか。
有志の方がたくさんまとめて頂いておりますが、自分なりにもまとめてみました。

また、利用シーンがでてきた場合に、追記していきたいと思います。
こういったケースでも使うよというものがあれば、ご教授頂けますと幸いです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
104