2013-04-02 6 views
1

По какой-то причине у меня всегда самое сложное время, чтобы получать временные отметки для правильной отображения, но в любом случае это моя проблема.Преобразование метки времени UTC в метку времени локального устройства

Я тянущие события из Calendar Provider API и некоторые события, такие как US Holidays события календаря в формате UTC, поэтому метка времени не то, что она должна быть на устройстве (если устройство не находится в том часовом поясе, конечно).

У меня есть отметка времени 1374105600000 которая 07/18/2013 00:00:00 UTC так 18 июля в полночь UTC. То, что я хочу, - это отметка времени 18-го июля в полночь местного времени устройства.

Это то, что я делаю

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, но я не думаю, что я должен даже вычитать, потому что это не будет работать для людей в + разница в часовом поясе.

Что я делаю неправильно, почему я не могу получить правильное смещение, чтобы получить правильное время?

Я также использовал это как в качестве эталона слишком Link

ответ

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; 
} 
2

Поскольку Java does not ATTACH Timezone информации с Date объектом, его немного странным, чтобы сделать преобразование. Пожалуйста, проверьте ниже список, где я пытаюсь преобразовать время от «UTC» (GMT) в «EST» (может быть часовой пояс Нью-Йорка)

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) 

который на самом деле correct

EDIT: важно, чтобы использовать «America/New_York» вместо «EST», чтобы рассмотреть дневной свет экономии

Смежные вопросы