日付/時刻を UTC 数値形式 (変更されたユリウス日番号) で格納する多くのテーブルを含むデータベースがあります。
これはうまく機能しますが、もちろん、日付をユーザーに表示する必要がある場合は、日付/時刻を UTC 数値形式からローカライズされた文字列形式に変換する必要があります。JDK カレンダー API は歴史的に正確な夏時間とタイム ゾーン オフセットを提供するため、私はこれだけのためにグレゴリオ暦を使用してきました。タイムスタンプを UTC から現地時間にマップするためだけに使用します。
この変換を実行する必要があるテーブルが非常に多くあり、Calendar オブジェクトの作成にはコストがかかるため、ロケールのタイム ゾーンが変更された場合にのみ、新しい GregorianCalendar オブジェクトを作成しています。現在のカレンダーを JulianDay クラスの静的メンバー フィールドに保持しています (これは、UTC をローカル マッピングに提供するために使用する関数を提供するクラスです)。JulianDay のフィールドは次のとおりです。
public final class JulianDay {
private static final int YEAR = 0;
private static final int MONTH = 1;
private static final int DAY = 2;
private static final int HOURS = 3;
private static final int MINUTES = 4;
private static final int SECONDS = 5;
private static final int MILLIS = 6;
public static final double POSIX_EPOCH_MJD = 40587.0;
private static final String TIME_ZONE_UTC = "UTC";
private static final GregorianCalendar CAL_UTC =
new GregorianCalendar(TimeZone.getTimeZone(TIME_ZONE_UTC));
private static GregorianCalendar c_selCal = null;
public static void setCurrentCalendar(String tzid)
{ JulianDay.c_selCal = JulianDay.findCalendarForTimeZone(tzid); }
public static GregorianCalendar getCurrentCalendar()
{ return JulianDay.c_selCal; }
:
:
}
上記はシングルスレッドのクライアント側 GUI アプリケーションですが、この API の大部分を使用するサーバー側 Web アプリケーションをすぐに開発する必要があります。JDK Calendar API への投資を維持し、何らかの方法でアプリケーション スレッドを安全に保つ方法を見つける必要があります。Joda 時間はオプションですが、可能であれば、その依存関係を追加したくありません (Java API を使用するのは、タイム ゾーン データベースへのイージーモード アクセスだけです)。
Calendar は明らかにスレッドに敵対的であるため、ここからどうすればよいか正確にはわかりません。
私の考えでは、JulianDay クラスは GregorianCalendar のすべてのインスタンスを (タイム ゾーン ID 文字列から) 構築するため、コードをリファクタリングしてgetCurrentCalendar()
、カレンダーの参照を発行するメソッドを削除できると考えています。
GregorianCalendar
へのすべてのアクセスを内に限定できればJulianDay
、たとえそれが危険なほど変更可能なクラスであっても、私のアプリケーションはスレッドセーフであると安全に仮定できますか? クラス内であっても、へのアクセスをGregorianCalendar
ロック オブジェクトと同期する必要があります。よろしいですか?JulianDay