无法将 iso8601 转换为当前日期 Android

Cant convert iso8601 to current date Android

我有3条消息,消息是按顺序发送的,服务器给我4个ISO8601时间:

2017-01-11T12:34:21.948631
2017-01-11T12:34:22.425915
2017-01-11T12:34:22.954749
2017-01-11T12:34:23.473965

我的逻辑转换为当前日期

public class ISO8601{
    static SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSSSS");

    String isodate;
    long timestamp = 0;

    public ISO8601(String isodate){
        dateformat.setTimeZone(TimeZone.getTimeZone("UTC"));

        this.isodate = isodate;

        try {
            Date date = dateformat.parse(this.isodate);
            timestamp = date.getTime();


        } catch (ParseException e) {
            e.printStackTrace();

        }
    }

    public long getTime(){
        return timestamp;
    }

}

class 转换为日期

public class HelperMethods {
  public static CharSequence getFormatTime(long time) {
        DateFormat sdf = new SimpleDateFormat("hh:mm:ss yyyy-MM-dd");
        Date netDat = new Date(time);
        return sdf.format(netDat);
    }
}

现在我尝试使用这个 class 和将 ISO8601 转换为正常时间的方法

Log.e("1", String.valueOf(HelperMethods.getFormatTime(new ISO8601("2017-01-11T12:34:21.948631").getTime())));
        Log.e("2", String.valueOf(HelperMethods.getFormatTime(new ISO8601("2017-01-11T12:34:22.425915").getTime())));
        Log.e("3", String.valueOf(HelperMethods.getFormatTime(new ISO8601("2017-01-11T12:34:22.954749").getTime())));
        Log.e("4", String.valueOf(HelperMethods.getFormatTime(new ISO8601("2017-01-11T12:34:23.473965").getTime())));

它输出:

01:50:09 2017-01-11
01:41:27 2017-01-11
01:50:16 2017-01-11
01:42:16 2017-01-11

如果我像这样做 * 1000L 时间戳:

public static CharSequence getFormatTime(long time) {
        DateFormat sdf = new SimpleDateFormat("hh:mm:ss yyyy-MM-dd");
        Date netDat = new Date(time * 1000L);
        return sdf.format(time);
    }

输出:

09:00:31 48999-02-14
08:05:15 48999-02-08
10:59:09 48999-02-14
09:42:45 48999-02-09

我不明白为什么我不能正确转换日期

首先要注意的是:

SimpleDateFormat只能处理毫秒,不能处理微秒。因此,如果您愿意丢失 ISO-8601 输入的尾随 3 位数字,那么您可以使用以下模式解析它:

SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");

请注意,此模式使用 "H" 表示 24 小时制,而不是 "h" 表示 12 小时制。输入中的 12 小时将变为零小时。

下一步:您似乎愿意通过在 SimpleDateFormat-实例上设置时区来解释 UTC 中的输入。很明显,输入既没有尾随 "Z"(根据 ISO 必须将其解释为 UTC+00:00),也没有任何其他偏移量信息。这意味着:作为 UTC 的解释是您的解释。如有疑问,请联系供应商的papers/specs。

然后你想将解析的 Date-instance 格式化为另一种格式。但是这里你又用了"h"。为什么?在没有 am/pm-marker 的情况下指定 12 小时制没有意义,因为结果是矛盾的。 01:00 如果是 12 小时制的话,要么在晚上,要么在下午早些时候。

我已经告诉过你,错误的符号(此处 "h")会将 12 小时转换为零小时。如果您在您的默认时区中格式化这样一个小时(您的格式化辅助方法未设置任何明确的时区),那么将向其添加一个偏移量。我认为您的系统时区使用一个小时的偏移量,这解释了您获得小时 1 的最终格式化结果。