将UTC时间戳转换为本地设备时间戳

时间:2013-04-02 00:19:59

标签: java android timestamp

出于某种原因,我总是最难以正确显示时间戳,但无论如何这是我的问题。

我从Calendar Provider API中提取事件,而某些事件(例如US Holidays日历事件)都是UTC格式,因此时间戳不是设备上的时间戳(除非设备位于该时区内)当然)。

我有一个1374105600000的时间戳,07/18/2013 00:00:00 UTC,所以7月18日午夜UTC。我想要的是7月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

2 个答案:

答案 0 :(得分:2)

由于Java does not使用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

编辑:使用“America / New_York”代替“EST”考虑日间节能非常重要

答案 1 :(得分: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;
}