出于某种原因,我总是最难以正确显示时间戳,但无论如何这是我的问题。
我从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
答案 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;
}