2016-04-08 10 views
2

目覚まし時計アプリケーションを作成しようとしていて、アラームが消える時間を設定するのが難しいです。私のアプリでは、アンドロイドの目覚まし時計に似た、アラームを出す日を選択するためのブール値の配列を7つ付けることができます。目覚まし時計のアラーム時間を計算する

私の考えは、今日の月曜日の時計を設定し、水曜日と金曜日にアラームが設定されている場合は、水曜日にアラームがオフになり、金曜日にリセットされます。

カレンダーが1週間返ってくるかどうかは分かりましたが、これで作業が楽になると思います。

答えて

1

Calendar c = Calendar.getInstance(); 
int day = c.get(Calendar.DAY_OF_MONTH); 
int month = c.get(Calendar.MONTH); 

と(月曜日、火曜日...のような)曜日を古い日時クラスを避ける

厄介な古いレガシーd ate-timeクラス。代わりに、java.timeクラスを使用します。

DayOfWeek列挙& EnumMap

DayOfWeekenumは、週、月〜日曜日の7日間ごとにあらかじめ定義7つのオブジェクトを持っています。

EnumSetおよびEnumMapは、enum値のコレクションを処理するために、SetおよびMapという非常に高速で低メモリの実装です。あなたのケースでは、アラームが発射されるべきときにはLocalTimeにマッピングされ、すべてが7日間でEnumMapと定義できます(その日はアラームがない場合はnull)。

EnumMap< DayOfWeek , LocalTime > dowToTimeMap = new EnumMap< DayOfWeek , LocalTime >(DayOfWeek.class); 

dowToTimeMap.put(DayOfWeek.MONDAY , LocalTime.of(6 , 0)); // 6 AM. 
dowToTimeMap.put(DayOfWeek.TUESDAY , LocalTime.of(6 , 0)); 
… 
dowToTimeMap.put(DayOfWeek.SATURDAY , LocalTime.of(8 , 0)); // Sleep in until 8 AM on Saturday. 
dowToTimeMap.put(DayOfWeek.SUNDAY , LocalTime.of(7 , 0)); 

現在の日付を取得するには、タイムゾーン(ZoneId)を指定します。 LocalDateクラスは、時間帯のない時間帯のない日付のみの値を表します。

ZoneId z = ZoneId.of("America/Montreal"); 
LocalDate today = LocalDate.now(z); 

今日の曜日のアラーム時刻を地図で確認してください。

LocalTime alarmTimeToday = dowToTimeMap.get(today.getDayOfWeek()); 

あなたは次のアラームまでの経過時間を決定するのに有用なZonedDateTimeInstant、およびDurationクラスを見つけることができます。

ZoneId z = ZoneId.of("America/Montreal"); 
LocalDate today = LocalDate.now(z); 
LocalDate tomorrow = today.plusDays(1); 
LocalTime alarmTimeTomorrow = dowToTimeMap.get(tomorrow.getDayOfWeek()); 
ZonedDateTime nextAlarmZdt = ZonedDateTime.of(tomorrow , alarmTimeTomorrow , z); 
Instant now = Instant.now(); 
Duration duration = Duration.between(now , nextAlarmZdt.toInstant()); 

時間が逆になっているかどうかを確認してください。これは、次のアラーム時刻がこれまでの時刻か、このコードが実行されるまでに終了する時刻に近いことを意味します。

if(duration.isNegative()) { 
    // Oops, the next alarm was within a second or so of current time, a shorter time than it took to execute this code. 
    … // Handle the problem. 
} 

このコードが深夜の午前中に実行されると、今日と明日も確認できます。

次に、Durationにアラーム設定に必要なすべての秒数またはミリ秒数またはナノ秒数を問い合わせることができます。

java.time

についてjava.timeフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは、このようなjava.util.Date.Calendar、& java.text.SimpleDateFormatなど面倒な古い日付時刻クラスに取って代わります。

Joda-Timeプロジェクトは、今maintenance modeで、java.timeへの移行をアドバイスします。

Oracle Tutorialを参照して、詳細をご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。

java.time機能ThreeTen-BackportでJava 6 & 7に戻って、移植、さらにThreeTenABPAndroidに適合されているの多く(How to use…を参照)。

ThreeTen-Extraプロジェクトは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。あなたはここにいくつかの有用なクラスを見つけることができるようIntervalYearWeekYearQuarter、など多くの。