我有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);
}
我无法理解为什么我无法理解转换日期
答案 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。