私がやろうとしているのは、Android の基本的なアラーム アプリです。UI を介して日付と時刻を設定すると (たとえば、2012-09-26 の 14:37)、タイムゾーンに関係なく、その時刻にアラームが鳴ります。その設定は、日付値とミリ秒単位の日の始まりからのオフセットの 2 つの個別の値としてシリアル化されます。
また、日付/時刻操作に Joda ライブラリを使用するというミスもありました。この API は .NET の DateTime API と非常によく似ているため、私を混乱させましたが、オブジェクトの値が UTC であり、そのプロパティがローカル時間であるという、デフォルトの Java フレームワーク API と同じ二重性の問題に悩まされていました (この概念は私の心を吹き飛ばします) )。また、Android のタイム ゾーンの変更を自動的に取得するのにも問題があるようです。
これは私が持っているものの要約です:
// part of reminder class
public DateTime getNextAlarm()
{
DateTime now = DateTime.now();
DateTime next = date.withMillisOfDay(time);
while (next.compareTo(now) <= 0)
next = next.plusDays(repeat);
return next;
}
// inside worker thread
workerEnabled = true;
while (workerEnabled)
{
try
{
Thread.sleep(10000);
}
catch (InterruptedException e)
{
workerEnabled = false;
return;
}
DateTimeZone tz = DateTimeZone.forTimeZone(TimeZone.getDefault());
if (nextAlarm != null && nextAlarm.withZoneRetainFields(tz).compareTo(new DateTime(tz)) < 0)
{
nextAlarm = reminder.getNextAlarm();
// perform alarm action
}
}
アプリの実行中に(設定が行われた後)タイムゾーンを切り替えようとするまで、すべてがうまくいきます。ここから奇妙なことが始まります。何をしてもうまくいかないということ以外に、何が間違っているのかを正確に説明することさえできません。
私が探しているのは、Joda または標準 API のいずれかで Java/Android でタイムゾーンに依存しない計算を行う方法に関する一般的な方向性だと思います。