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

时间:2017-01-11 12:40:21

标签: android date timestamp iso8601

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

// var_export($myIds)
array(
    0 => 5
    1 => 6,
)

我的逻辑转换为当前日期

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;
    }

}

现在我尝试使用此类和方法将ISO8601转换为正常时间

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);
    }
}

输出:

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())));

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

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

输出:

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);
    }

我无法理解为什么我无法理解转换日期

1 个答案:

答案 0 :(得分:2)

首先要注意的是:

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的解释是您的解释。如有疑问,请联系提供商的论文/规格。

然后,您希望将已解析的Date - 实例格式化为另一种格式。但在这里你再次使用“h”。为什么?指定一个没有am / pm-marker的12小时时间没有意义,因为结果是矛盾的。如果意味着12小时制,那么01:00将在夜晚或下午的早晨。

我已经告诉过你,错误的符号(这里是“h”)会将小时12转换为零小时。如果在您的默认时区中格式化这样一个小时(格式化的辅助方法没有设置任何显式时区),则会向其添加偏移量。我认为你的系统时区使用了一个小时的偏移量,这解释了最终的格式化结果,你得到的是小时1。