64

Java アプリケーションで EST 時間を出力する必要があります。以下を使用してタイムゾーンをESTに設定しました。

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("EST"));

しかし、このタイムゾーンで夏時間が経過すると、私のコードは正しい時刻を出力しません (1 時間少なく出力します)。

夏時間が観察されているかどうかに関係なく、常に正しい時刻を読み取るようにコードを機能させるにはどうすればよいですか?

PS: タイムゾーンを EDT に設定してみましたが、問題は解決しません。

4

8 に答える 8

115

これが最初の問題です。

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("EST"));

TZDB ゾーン ID を優先して、3 文字の略語は徹底的に避ける必要があります。EST は東部標準時です。標準時は DST を遵守しません。これは完全なタイム ゾーン名ではありません。タイムゾーンの一部に使用される名前です。(残念ながら、この「ハーフ タイム ゾーン」の概念に適した用語を見つけられませんでした。)

完全なタイムゾーン名が必要です。たとえば、America/New_Yorkは東部時間帯です。

TimeZone zone = TimeZone.getTimeZone("America/New_York");
DateFormat format = DateFormat.getDateTimeInstance();
format.setTimeZone(zone);

System.out.println(format.format(new Date()));
于 2012-05-11T05:50:41.000 に答える
4

タイムゾーンに「EST」と入力する代わりに、「EST5EDT」と入力することもできます。ご指摘のとおり、「EDT」だけでは機能しません。これにより、夏時間の問題が考慮されます。コード行は次のようになります。

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("EST5EDT"));
于 2016-09-07T13:58:13.943 に答える
0
public static float calculateTimeZone(String deviceTimeZone) {
    float ONE_HOUR_MILLIS = 60 * 60 * 1000;

    // Current timezone and date
    TimeZone timeZone = TimeZone.getTimeZone(deviceTimeZone);
    Date nowDate = new Date();
    float offsetFromUtc = timeZone.getOffset(nowDate.getTime()) / ONE_HOUR_MILLIS;

    // Daylight Saving time
    if (timeZone.useDaylightTime()) {
        // DST is used
        // I'm saving this is preferences for later use

        // save the offset value to use it later
        float dstOffset = timeZone.getDSTSavings() / ONE_HOUR_MILLIS;
        // DstOffsetValue = dstOffset
        // I'm saving this is preferences for later use
        // save that now we are in DST mode
        if (timeZone.inDaylightTime(nowDate)) {
            Log.e(Utility.class.getName(), "in Daylight Time");
            return -(ONE_HOUR_MILLIS * dstOffset);
        } else {
            Log.e(Utility.class.getName(), "not in Daylight Time");
            return 0;
        }
    } else
        return 0;
}
于 2018-07-26T09:45:42.543 に答える
-1

Java では、DateFormatter はデフォルトで DST を使用します。夏時間 (DST) を回避するには、手動でトリックを行う必要があります。
最初に DST オフセットを取得する必要があります。一部の場所では 30 分間
ですが、ほとんどの場合、DST は 1 時間
です。Timezone オブジェクトを使用して、DST に該当するかどうかを日付で確認し、DST のオフセットを手動で追加する必要があります。例:

 TimeZone tz = TimeZone.getTimeZone("EST");
 boolean isDST = tz.inDaylightTime(yourDateObj);
 if(isDST){
 int sec= tz.getDSTSavings()/1000;// for no. of seconds
 Calendar cal= Calendar.getInstance();
 cal.setTime(yourDateObj);
 cal.add(Calendar.Seconds,sec);
 System.out.println(cal.getTime());// your Date with DST neglected
  }
于 2016-01-04T17:40:01.413 に答える