3

私は2つのことが必要です:

  1. 現在の時刻を UTC に変換します (日付を UTC 形式で保存できるようにします) -->結果 = java.util.Date.

  2. 読み込まれた日付 (UTC 形式) を任意の TimeZone に変換します -->結果 = java.util.Date またはミリ秒

両方の点で、日光を念頭に置いてください。

1)stackoverflowで次のことを見つけました:

Calendar c = Calendar.getInstance();
System.out.println("current: "+c.getTime());

TimeZone z = c.getTimeZone();
int offset = z.getRawOffset();
if(z.inDaylightTime(new Date())){
    offset = offset + z.getDSTSavings();
}
int offsetHrs = offset / 1000 / 60 / 60;
int offsetMins = offset / 1000 / 60 % 60;

System.out.println("offset: " + offsetHrs);
System.out.println("offset: " + offsetMins);

c.add(Calendar.HOUR_OF_DAY, (-offsetHrs));
c.add(Calendar.MINUTE, (-offsetMins));

System.out.println("GMT Time: "+c.getTime());

--> 結果は UTC に等しい?

2)

public static long getTimeMillisFromTimeZone(long utcTimeMillis,
        String timeZoneId) {
    System.out.println("input millis: " + utcTimeMillis);
    Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
    calendar.setTimeInMillis(utcTimeMillis);
    TimeZone fromTimeZone = calendar.getTimeZone();
    TimeZone toTimeZone = TimeZone.getTimeZone(timeZoneId);

    calendar.setTimeZone(fromTimeZone);
    calendar.add(Calendar.MILLISECOND, fromTimeZone.getRawOffset() * -1);
    if (fromTimeZone.inDaylightTime(calendar.getTime())) {
        calendar.add(Calendar.MILLISECOND, calendar.getTimeZone()
                .getDSTSavings() * -1);
    }

    calendar.add(Calendar.MILLISECOND, toTimeZone.getRawOffset());
    if (toTimeZone.inDaylightTime(calendar.getTime())) {
        calendar.add(Calendar.MILLISECOND, toTimeZone.getDSTSavings());
    }

    System.out.println(calendar.getTime());

    System.out.println("output millis: " + calendar.getTime().getTime());
    return calendar.getTime().getTime();
}

--> 問題が発生しました --> 1 時間無駄になりました!

私の例では、TimeZone "Europe/Vienna" (夏時間を使用) からの Date を utc としてデータベースに格納しました。ヨーロッパ/ウィーン --> 10:00 UTC --> 09:00

この UTC (09:00) を「Europe/Vienna」に変換すると、次のようになります。 09:00 = 1 時間を失いました..

4

2 に答える 2

2

Jodaのような既存の DateTime API をそのまま使用することを考えましたか?

アップデート

  1. すでに回答済み: Joda Time - タイムゾーンによって異なる

  2. 同じだろう私はちょうど使用すると思いますwithZone

于 2012-11-29T10:07:01.737 に答える
0

タイムゾーン間の日付を変換するには、次のコードを試してください (私はJoda Timeを使用しています)。

public static Date convertDate(Date sourceDate, DateTimeZone sourceTimeZone, DateTimeZone resultTimeZone) {
    LocalDateTime localDateTime = new LocalDateTime(date.getTime());
    DateTime sourceDateTime = localDateTime.toDateTime(sourceTimeZone);
    DateTime resultDateTime = sourceDateTime.withZone(resultTimeZone);
    return resultDateTime.toLocalDateTime().toDateTime().toDate();
}

UTCへの変換は次のように簡略化できます。

public static Date toUtcDate(Date sourceDate, DateTimeZone sourceTimeZone) {
    return convertDate(sourceDate, sourceTimeZone, DateTimeZone.UTC);
}

この呼び出しで 1 時間が追加されます。

convertDate(new Date(), DateTimeZone.UTC, DateTimeZone.forID("Europe/Vienna"));
于 2012-11-29T11:18:35.460 に答える