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

xzv2uavs  于 2023-01-01  发布在  Java
关注(0)|答案(1)|浏览(162)

我从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”中出现异常。无法解析的日期:“2022年12月29日T19:59:20.783357Z”,位于java.文本.日期格式.解析(:-1)
文件Kt.main(文件kt:13)文件Kt.main(文件kt:-1)
我无法使用Instant.parse(date)
日期“2022-12- 29 T19:59:20.783357Z”是有效的Iso 8601 String,其中783是毫秒,357是微秒

k4aesqcs

k4aesqcs1#

SimpleDateFormat无法处理小数秒到微秒的分辨率,它的限制是毫秒分辨率。如果您尝试按原样解析它,将得到错误的结果,如this answer中所述。
你有两个选择:
1.将秒的分数截断为毫秒分辨率。
1.按照this post中的说明使用ThreeTenABP或Android desugaring support。然后可以使用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. time 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);
    }
}

ONLINE DEMO

相关问题