【Swift4】時刻と分と曜日でアラームの日時を設定する。

アプリのアラーム関係で時刻の取扱は鬼門だ。
なかなかうまく行った試しがない。
頭の中もこんがらがりまくりだ。

ゆーてても仕方がないので先人たちの知恵とXcodeの保管機能を駆使してやってみた。

参考サイトはこちら。
UILocalNotificationでローカル通知を実装する【Swift】 | うるおいらんど
[iOS 10] User Notifications framework を使用して指定日時に発火するローカル通知を作成する #wwdc | DevelopersIO
[Swift] カレンダーや時刻のデータを扱う DateComponents – JoyPlotドキュメント
【Swift】Dateの王道 【日付】 – Qiita

時、分、曜日を指定すると次の曜日のその時刻が出てくる。
playGroundをつかってやってみた。

import UIKit
//目的の時刻と曜日を設定。
let fireHour = 16 //指定の時刻
let fireMinute = 30 //指定の分
let fireWeekday = 2 //曜日の番号。日曜が1、月曜が2,火曜3、水曜4、木曜5、金曜6、土曜7
//今日の日時を取り出す
let date = Date() //今日の日時
let calendar = Calendar.current
let components = calendar.dateComponents([.year , .month ,.day , .hour, .minute, .weekday], from: date) //今日の年月日時分、曜日を取り出す。
let weekday = components.weekday //今日の曜日を取り出す。
let hour = components.hour //現在の時刻
let minute = components.minute //現在の分

var interval = TimeInterval()
//時刻を分に変換
let time = (hour! * 60) +  minute!
let fireTime = (fireHour * 60) +  fireMinute
//現在の曜日と時刻から目的の時刻までの時間を計算
if (weekday! >= fireWeekday && time >= fireTime){
    interval = Double(60 * 60 * 24 * ((7 + fireWeekday) - weekday!))
} else {
    interval = Double(60 * 60 * 24 * (fireWeekday - weekday!))
}

//通知する日時を設定。
let nextDate = date.addingTimeInterval(interval)
var fireDateComponents = calendar.dateComponents([.year , .month ,.day , .weekday], from: nextDate)
fireDateComponents.hour = fireHour
fireDateComponents.minute = fireMinute
fireDateComponents.second = 0

//date型に変換。
let fireDate =  Calendar.current.date(from: fireDateComponents)!

アラームに設定するのはまたこのあとの話…。
うじゃうじゃ。

コメントを残す

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