Android日期,回到夏天的时候会错吗?

时间:2014-10-29 08:38:02

标签: java android datetime

此日期是从我的应用程序发送的,如下所示:

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获得,但是当夏令时再次开始时,它将如何运作?如何才能显示正确的时间?

1 个答案:

答案 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中,无论您的用户位于何处。 例如,如果您的应用程序同时在两个不同的时区使用,则服务器应存储相同的值。时间转换将在用户的设备上根据他/她所在的时区在本地完成。