我在往返数据模式中有一个时间日期字符串,如下所示:2012-07-05T11:30:44.1533815Z
. 这来自一些 .NET 服务。
如何将其转换为long
Java 中的 a?
我试过SimpleDateTimeFormat
似乎无法找出正确的格式说明符..
试试这个:
public long getTime(String time) throws ParseException {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z'");
Date date = df.parse(time);
return date.getTime();
}
干杯
您需要使用SimpleDateFormat将其解析为 Date 。
从日期开始,您可以使用 getTime() 获取以毫秒为单位的 unix 纪元,这是一个很长的时间。
这将像这样开始:
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSS'Z'", Locale.ENGLISH);
long myTime = format.parse("2012-07-05T11:30:44.1533815Z").getTime();
但是您必须检查日期的最后一个字符的含义是什么?那是时区定义吗?如果您没有确定它并只是逃避它,您将冒着用错误的时区解释日期的风险。
试试这个:
try {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-M-dd'T'HH:mm:ss.SSSSSSS'Z'");
long time = dateFormat.parse("2012-07-05T11:30:44.1533815Z").getTime();
} catch (ParseException e) {
.....
}
由于这是 iso 格式的日期时间,您可以使用出色的 Joda 日期时间库轻松解析它,如下所示:
DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
DateTime dt = fmt.parseDateTime("2012-07-05T11:30:44.1533815Z");
long dtl = dt.getMillis();
请参阅“输入和输出”一章下的Joda 用户指南和http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html。它将负责以正确的方式解析 ISO8601 格式。
请注意这一点,如果我给出 dateTime UTC "2017-07-13T05:43:24.6966215Z"
,它会返回 ISTThu Jul 13 07:39:30 IST 2017
而不是Thu Jul 13 11:13:25 IST 2017
String rawDate = "2017-07-13T05:43:24.6966215Z";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z'");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("IST"));
Date date = simpleDateFormat.parse(rawDate);
System.out.println(date);
所以在经历了这个答案之后,我才知道这个给定的字符串不是日期格式而不是 ISO 即时格式。
毫秒 (SSS) 只能是三位数字。不仅如此,日期还会滚动 - 例如 10:38:14.1000 变为 10:38:15.000。
将 Instant 转换为 Date 对象
String rawDate = "2017-07-13T05:43:24.6966215Z";
DateTimeFormatter instantFormater = DateTimeFormatter.ISO_INSTANT.withZone(ZoneId.of("Asia/Kolkata"));
Instant instant = Instant.from(instantFormater.parse(rawDate));
System.out.println(Date.from(instant));
它给出了预期的Thu Jul 13 11:13:24 IST 2017
检查这个答案