1

何らかの理由で、タイムスタンプを正しく表示するのに常に苦労していますが、とにかくここに問題があります。

からイベントを取得しており、カレンダー イベントCalendar Provider APIなどの一部のイベントUS Holidaysは UTC であるため、タイムスタンプはデバイス上にあるべきものではありません (もちろん、デバイスがそのタイムゾーンにある場合を除きます)。

これのタイムスタンプは1374105600000707/18/2013 00:00:00 UTC月 18 日の午前 0 時 (UTC) です。私が欲しいのは、7 月 18 日の午前 0 時のローカル デバイス時間のタイムスタンプです。

これが私がすることです

Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();
cal.setTimeInMillis(time);

long offset = tz.getRawOffset(); //gives me -18000000 5hr difference since I am in EST which I think is actually wrong because it should be a 4hr difference now with DST

これをUTCタイムスタンプに追加すると

long local = time+offset;

それは私に間違った時間を与えますjuly 17th at 3:00PM

時間を差し引くと

long local = time-offset;

私はまだ間違った時間を取得していますが、タイムゾーンの違いjuly 18th at 1:00AMがある人にとってはうまくいかないため、減算する必要さえないと思います.+

何が間違っているのですか? 正しい時刻を取得するために正しいオフセットを取得できないのはなぜですか?

私もこれを参考に使っていましたリンク

4

2 に答える 2

2

Javaはオブジェクトを使用して情報をdoes notATTACH するため、変換を行うのは少し奇妙です。「UTC」(GMT)から「EST」(ニューヨークのタイムゾーンである可能性があります)に時間を変換しようとしている以下のリストを確認してください。TimezoneDate

import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class TimeZoneTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Calendar gmtTime = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
        Calendar estTime = Calendar.getInstance(TimeZone.getTimeZone("America/New_York"));
        
        System.out.println(getInputDate() + " (Actually GMT)");
        estTime.setTime(getInputDate());
        
        gmtTime.clear();
        gmtTime.set(estTime.get(Calendar.YEAR), estTime.get(Calendar.MONTH), 
                estTime.get(Calendar.DAY_OF_MONTH), estTime.get(Calendar.HOUR_OF_DAY), estTime.get(Calendar.MINUTE));
        gmtTime.set(Calendar.SECOND, estTime.get(Calendar.SECOND));
        Date estDate = gmtTime.getTime();
        System.out.println(estDate + "(Actually EST)");
    }
    
    private static Date getInputDate() {
        Calendar instance = Calendar.getInstance();
        instance.clear();
        instance.set(2014, 3, 2, 9, 0, 0);
        Date input = instance.getTime();
        return input;
    }

}

そして、出力は

Wed Apr 02 09:00:00 IST 2014 (Actually GMT)
Wed Apr 02 05:00:00 IST 2014(Actually EST)

これは実際に正しいです

編集: サマータイムを考慮するには、「EST」ではなく「America/New_York」を使用することが重要です

于 2013-04-02T01:12:31.580 に答える
0

うーん..以下のコードはあなたのシナリオを逆にしますが、多分あなたはそれを利用できますか??

private  Date cvtToGmt( Date date )
{
   TimeZone tz = TimeZone.getDefault();
   Date ret = new Date( date.getTime() - tz.getRawOffset() );

   // if we are now in DST, back off by the delta.  Note that we are checking the GMT date, this is the KEY.
   if ( tz.inDaylightTime( ret ))
   {
      Date dstDate = new Date( ret.getTime() - tz.getDSTSavings() );

      // check to make sure we have not crossed back into standard time
      // this happens when we are on the cusp of DST (7pm the day before the change for PDT)
      if ( tz.inDaylightTime( dstDate ))
      {
         ret = dstDate;
      }
   }

   return ret;
}
于 2013-04-02T00:48:31.347 に答える