此日期是从我的应用程序发送的,如下所示:
2014-10-29 09:00:17
数据库存储如下:
Wed Oct 29 2014 09:00:17 GMT+0100 (CET)
我从我的服务器上看到的日期是这样的:
2014-10-29T08:00:17.000Z (one our less)
然后我将它转换为这样的日历日期:
public static long getUTCToMillis(String time) {
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.getDefault());
sdf.setTimeZone(TimeZone.getTimeZone("CET"));
try {
cal.setTime(sdf.parse(time));
return cal.getTimeInMillis();
} catch (ParseException e) {
e.printStackTrace();
}
return -1;
}
这始终将小时设置为08:00,但我希望将其转换回09:00,就像保存一样。如果我将时区设为UTC,我会在09:00获得,但是当夏令时再次开始时,它将如何运作?如何才能显示正确的时间?
答案 0 :(得分:1)
查看TimeZone.getOffset(long time)
该方法返回UTC与目标时区之间的时差。
所以你可以这样做:
public static long getUTCToMillis(String time) {
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.getDefault());
TimeZone timezone = TimeZone.getTimeZone("CET");
try {
Date date = sdf.parse(time);
long offSet = timezone.getOffset(date.getTime());
cal.setTime(date);
cal.add(Calendar.MILLISECOND, offset);
return cal.getTimeInMillis();
} catch (ParseException e) {
e.printStackTrace();
}
return -1;
}
作为旁注,我建议您将时间值存储在UTC中,无论您的用户位于何处。 例如,如果您的应用程序同时在两个不同的时区使用,则服务器应存储相同的值。时间转换将在用户的设备上根据他/她所在的时区在本地完成。