EKEvent
の startDate : NSDate
などをいじっていると、GMTなのでスケジュールの時間に応じて色々やろうとすると都合が悪い。
調べるとローカル時間を元に処理をしたい倍は NSDate
ではなく NSCalendar
を使うそう。
let cal = NSCalendar.currentCalendar()
let components = cal.components(
[.Year, .Month, .Day, .Hour, .Minute], // 処理に必要なものを指定する
fromDate: startDate)
print("day=\(components.day) hour=\(components.hour)")
上記のやり方なら NSDate
を元にローカル時間に変換して返してくれる。
注意点
注意点としては components
の各要素 (hour
やday
など)に対して加減算を行った場合、もう一度作り直さないと -5時とか -2日とか存在しない時間になってしまう。
let cal = NSCalendar.currentCalendar()
let components = cal.components(
[.Day, .Hour], // 処理に必要なものを指定する
fromDate: NSDate())
print("day=\(components.day) hour=\(components.hour) ") // "day=8 hour=5 \n"
components.hour = components.hour - 10
components.day = components.day - 10
print("day=\(components.day) hour=\(components.hour) ") // "day=-2 hour=-5 \n"
面倒だが作り直せば正常な表示になる。
let newComponents = cal.components( [.Day, .Hour],
fromDate: cal.dateFromComponents(components)!)
print("day=\(newComponents.day) hour=\(newComponents.hour) ") //"day=28 hour=19 \n"