3

私の Web アプリケーションでは、すべてのエンドユーザーの日付情報を UTC 形式でデータベースに保存し、それを表示する前に、UTC 日付を選択したタイムゾーンに変換するだけです。

このメソッドを使用して、(保存中に) ローカルタイムを UTC タイムに変換しています。

public static Date getUTCDateFromStringAndTimezone(String inputDate, TimeZone timezone){
    Date date
    date = new Date(inputDate)

    print("input local date ---> " + date);

    //Returns the number of milliseconds since January 1, 1970, 00:00:00 GMT
    long msFromEpochGmt = date.getTime()

    //gives you the current offset in ms from GMT at the current date
    int offsetFromUTC = timezone.getOffset(msFromEpochGmt)*(-1) //this (-1) forces addition or subtraction whatever is reqd to make UTC
    print("offsetFromUTC ---> " + offsetFromUTC)

    //create a new calendar in GMT timezone, set to this date and add the offset
    Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"))
    gmtCal.setTime(date)
    gmtCal.add(Calendar.MILLISECOND, offsetFromUTC)

    return gmtCal.getTime()
}

そして、UTC日付をローカルに変換するためのこの方法(表示中):

public static String getLocalDateFromUTCDateAndTimezone(Date utcDate, TimeZone timezone, DateFormat formatter) {
    printf ("input utc date ---> " + utcDate)

    //Returns the number of milliseconds since January 1, 1970, 00:00:00 GMT
    long msFromEpochGmt = utcDate.getTime()

    //gives you the current offset in ms from GMT at the current date
    int offsetFromUTC = timezone.getOffset(msFromEpochGmt) 
    print("offsetFromUTC ---> " + offsetFromUTC)

    //create a new calendar in GMT timezone, set to this date and add the offset
    Calendar localCal = Calendar.getInstance(timezone)
    localCal.setTime(utcDate)
    localCal.add(Calendar.MILLISECOND, offsetFromUTC)

    return formatter.format(localCal.getTime())
}

私の質問は、エンド ユーザーが DST ゾーン内にいる場合、ローカル クロック時間に完全に対応する方法を改善するにはどうすればよいかということです。

4

1 に答える 1

4

GMT+10 などのカスタム タイム ゾーン ID を使用すると、DST をサポートしない TimeZone が取得されます。たとえば、TimeZone.getTimeZone("GMT+10").useDaylightTime()false が返されます。ただし、「America/Chicago」などのサポートされている ID を使用すると、DST をサポートする TimeZone が取得されます。サポートされている ID の完全なリストは、 によって返されTimeZone.getAvailableIDs()ます。内部的に、Java はタイム ゾーン情報を jre/lib/zi に保存します。

于 2012-12-19T09:17:38.177 に答える