Edited at

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

More than 1 year has passed since last update.


はじめに

日付を扱うクラスを、すぐ忘れるのでまとめました。

同じようなことができるクラスやメソッドがたくさんあります。

クラス名
説明
サポート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


まとめ

開発をしていて結構日付を扱うことが多いのではないでしょうか。

有志の方がたくさんまとめて頂いておりますが、自分なりにもまとめてみました。

また、利用シーンがでてきた場合に、追記していきたいと思います。

こういったケースでも使うよというものがあれば、ご教授頂けますと幸いです。