如何在Kotlin中以微秒精度解析ISO日期



我从https://stackoverflow.com/a/18217193/6727914

val df1: DateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
val string1 = "2022-12-29T19:59:20.783357Z"
val result1: Date = df1.parse(string1)

但是它不工作:

线程"main"异常java.text.ParseException: Unparseable date:"2022 - 12 - 29 t19:59:20.783357z"at java.text.DateFormat.parse (:-1)
at FileKtmain (File.kt:13)在FileKt。主要(File.kt: 1)

我不能使用Instant.parse(date)

日期"2022-12-29T19:59:20.783357Z"是一个有效的Iso8601String,其中783是毫秒,357是微秒

SimpleDateFormat不能处理微秒级的分辨率,它的极限是毫秒级的分辨率。如果您尝试按原样解析它,您将得到错误的结果,如以下答案所示。

你有两个选择:

  1. 截断秒的分数到毫秒的分辨率。
  2. 如本文所述,使用ThreeTenABP或Android去糖支持。然后,您可以使用Instant#parse将日期时间字符串解析为Instant

注意:你需要在你的模式中使用X而不是Z

:

import java.text.ParseException;
import java.text.SimpleDateFormat;
public class Main {
public static void main(String[] args) throws ParseException {
var df1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
var string1 = "2022-12-29T19:59:20.783357Z";
string1 = string1.replaceAll("(\.\d{3})\d+", "$1");
var result1 = df1.parse(string1);
System.out.println(result1);
}
}

我所在时区的输出,欧洲/伦敦:

Thu Dec 29 19:59:20 GMT 2022

使用java解决方案。时间API

import java.time.Instant;
import java.util.Date;
public class Main {
public static void main(String[] args) {
var instant = Instant.parse("2022-12-29T19:59:20.783357Z");
System.out.println(instant);
// For any reason, if you need java.util.Date
var date = Date.from(instant);
System.out.println(date);
}
}
<<p>在线演示/kbd>

最新更新