无法将iso8601转换为当前日期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;
}
}

用于转换为日期的类

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

现在我尝试使用这个类和方法将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的解释就是你的解释。如有疑问,请联系供应商的文件/规格。

然后,您需要将解析后的Date-实例格式化为另一种格式。但这里你又用了"h"。为什么?指定一个没有上午/下午标记的12小时时钟是没有意义的,因为结果是矛盾的。01:00可以是在晚上,也可以是在下午早些时候,如果是12小时的话。

我已经告诉过你,一个错误的符号(这里是"h")会把12小时翻译成零时。如果你在你的默认时区中格式化这样一个小时(你的格式化辅助方法没有设置任何明确的时区),那么就会添加一个偏移量。我认为你的系统时区使用一个小时偏移量,这解释了你得到小时1的最终格式化结果。

最新更新