无法将 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 的最终格式化结果。
我有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 的最终格式化结果。