1。TimeZoneの紹介
タイムゾーンはタイムゾーンオフセットを表し、夏時間を計算することもできます。
日付、カレンダーなどの日付/時間を表すオブジェクトを操作する場合、タイムゾーンはよく使用されます。異なるタイムゾーンの時間は異なるためです。
TimeZoneオブジェクトを作成する2つの一般的な方法について話しましょう。
1.デフォルトのタイムゾーンオブジェクトを取得します
使い方:
TimeZone TZ = TimeZone.getDefault()
2。getTimeZone(String ID)メソッドを使用してTimeZoneオブジェクトを取得します
使い方:
//「gmt+08:00」に対応するタイムゾーンを取得するタイムゾーン中国= timezone.gettimezone( "GMT+:08:00");
GetTimeZone(String ID)でサポートされているすべてのIDパラメーターの値については、次の方法で見つけることができます。
string [] ids = timezone.getAvailableIds(); for(string id:ids)system.out.printf(id+"、");
出力結果:
etc/gmt+12、etc/gmt+11、太平洋/ミッドウェイ、太平洋/niue ...など。たとえば、2番目の印刷値に対応するタイムゾーンを作成します。この方法は次のとおりです。
TimeZone TZ = TimeZone.GetTimeZone( "/gmt+11"); timezoneの関数インターフェイス//コンストラクターTimeZone():
オブジェクトクローン()同期静的文字列[] getAbaibableIds()同期静的ストリング[] getAvailableIds(int offsetmillis)int getDstsavings()同期静的タイムゾーンgetDefault()最終文字列getDisPlayName(locale locale)string getdisplayname(int daylighttime、boolean daylight、int getDisPlayName()final String getDisPlayName(boolean Daylighttime、int Style)String getId()abstract int getOffset(int era、int year、int month、int day、int dayofweek、int time ofdaymillis) Timezone)抽象BOOLEAN INDAYLIGHTTIME(日付)同期静的ボイドセットデフォルト(TIMEZONE TIMEZONE)VOID SETID(STRING ID)Abstract void setRawOffset(int offsetmillis)抽象的ブールesaylighttime()
2。タイムゾーンの例:
以下は、日付のタイムゾーンを使用して実証する例です。
参照コードは次のとおりです(TimeZonetest.java):
java.text.dateformat;インポートjava.util.date;インポートjava.util.timezone;/*** timezoneのテストプログラム*/public class timezonetest {public static void main(string [] args){// test 3メソッドを作成するための3つの方法timezone object showusageoftimezones(// test 3メソッド; // timezone testotherapis()の他のAPIをテストします。 // gettimezone(string id)によってサポートされているすべてのIDを印刷// printalltimezones(); } / *** timezoneオブジェクトを作成するための3つの方法* / public static void showusageoftimezones(){timezone tz; //(01)デフォルトタイムゾーンtz = timezone.getDefault(); printDatein(TZ); //(02)タイムゾーンを「GMT+08:00」TZ = TimeZone.GetTimeZone( "GMT+08:00")に設定します。 printDatein(TZ); //(03)タイムゾーンを "" tz = timezone.gettimezone( "Asia/Chongqing")に設定します。 printDatein(TZ); }/*** tzに対応する日付/時刻を印刷*/private static void printdatein(timezone tz){//日付は2013-09-19 14:22:30日付=新しい日付(113、8、19、14、22、30); //フォーマットのデフォルトdateFormatを取得します日付dateformat df = dateformat.getInstance(); //タイムゾーンをTZ DF.SettimeZone(TZ)に設定します。 //フォーマットされた文字列str = df.format(date)を取得します。 system.out.println(tz.getid()+":"+str); } / ** * time zoneの他のapis * / public static void testotherapis(){//デフォルトのタイムゾーンtimezone tz = timezone.getDefault(); // "id" string id = tz.getid()を取得します。 //「表示名」文字列name = tz.getDisPlayName()を取得します。 //「タイムオフセット」を取得します。 「一次子午線」に対するオフセットはMSです。 int offset = tz.getRawoffset(); //「タイムオフセット」の対応する時間を取得しますint gmt = offset/(3600*1000); System.out.printf( "id =%s、name =%s、offset =%s(ms)、gmt =%s/n"、id、name、offset、gmt); } / ** * gettimezone(string id)でサポートされているすべてのidsを印刷 * / public static void printalltimezones(){string [] ids = timezone.getavailabaleds(); for(string id:ids){// int offset = timezone.gettimezone(avaids [i])。getRawOffset(); //system.out.println(i+ ""+avaids [i]+""+offset/(3600 * 1000)+"/t"); System.out.printf(id+"、"); } system.out.println(); }}
3。タイムゾーンと時間のキャリブレーションについて
JavaとSolarisは、タイムゾーンに関する情報に関して非常に似ています。各タイムゾーンには、タイムゾーンID識別子があります。 J2SE 1.3および1.4では、このIDは文字列であり、J2SEインストーラーのJRE/LIBサブディレクトリにあるこれらのIDのリストです。 J2SE 1.3にはTZMAppingsファイルのみが含まれていますが、J2SE 1.4には、世界の異なる地域にタイムゾーンデータファイルが含まれています。 JRE/LIB/ZIはこれらのファイルを保存します。 J2SE 1.4では、sun.util.calendar.zoneinfoがこれらのファイルからDSTルールを取得します。 Solarisでは、これらのタイムゾーンデータファイルはバイナリ形式で保存され、テキストファイルではないため、それらを見ることはできません。 J2SE 1.4のタイムゾーンデータファイルは、Solarisのデータファイルとは異なります。
java.util.timezoneクラスのgetDefaultメソッドのソースコードは、最終的にsun.util.calendar.zoneinfoクラスのgettimezoneメソッドを呼び出すことを示しています。このメソッドは、必要な時間領域の文字列パラメーターをIDとして返します。このデフォルトのタイムゾーンIDは、user.timezone(system)プロパティから取得されます。 user.timezoneが定義されていない場合、user.countryおよびjava.home(system)プロパティからIDを取得しようとします。タイムゾーンIDが正常に見つからない場合、「フォールバック」GMT値を使用します。言い換えれば、タイムゾーンIDを計算しない場合、GMTをデフォルトのタイムゾーンとして使用します。
システムプロパティは、java.lang.systemクラスのinitpropertiesメソッドで初期化されていることに注意してください。これはローカルな方法です。したがって、ソースコードは利用できません。J2SE配布パッケージのローカルコードベースを掘り下げて、調査してください。ただし、Windowsシステムでは、システム属性はWindowsレジストリから初期化され、Linux/Unixでは環境変数によって初期化されます。 initpropertiesメソッドのJavadoc宣言、特定のプロパティは「定義することが保証されている」必要があります。 java.util.timezoneクラスのGetDefaultメソッドで使用される3つのシステムプロパティのうち、Java.homeのみがJavadocに「保証された」プロパティとしてリストされています。
推奨ソリューション:
それで、Javaがあなたに適切な時間と日付を与えることをどのように確認しますか?最良の方法は、Java仮想マシン(JVM)のデフォルトのタイムゾーンクラスが正しく、地理的範囲(ロケール)に適していることを確認することです。デフォルトのタイムゾーンが正しく適切であることをどのように確認しますか?これは別の新しい問題です。対処されたほとんどの問題と同様に、これには多くの解決策があります。 java.util.timezone.getDefaultメソッドのソースコードによると、最良の方法は、user.timezoneプロパティを正しく設定することです。 Java仮想マシンを起動するとき、-dコマンドラインパラメーターを使用して、java.lang.system.initpropertiesメソッドに設定された値を簡単にオーバーライドできます。例えば:
Java -duser.timezone = asia/shanghai DateTest
このコマンドは、DateTestクラスを開始し、user.timezoneプロパティをアジア/上海に設定します。 java.lang.systemクラスのsetPropertyメソッドを使用して、user.timezoneプロパティを設定することもできます。
System.setProperty( "user.timezone"、 "Asia/Shanghai");
使用可能なタイムゾーンIDがない場合は、java.util.timezoneクラスのsetDefaultメソッドを使用してカスタムタイムゾーンを作成して、デフォルトの時間に設定できます。 zone-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
J2SEでは、ほとんどの日付と時刻関連のクラスには、java.text.dateformatなどの形式クラスを含むタイムゾーン情報が含まれているため、すべてJVMのデフォルトタイムゾーンの影響を受けます。ただし、これらのクラスのインスタンスを作成すると、それらの正しいタイムゾーン情報を確保することができ、JVM全体のデフォルトタイムゾーンを簡単に設定できるようにします。セットアップしたら、これらすべてのクラスが同じデフォルトタイムゾーンを使用するようにすることができます。