Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将字符串解析为特定格式的日期_Java_Java Time - Fatal编程技术网

Java 将字符串解析为特定格式的日期

Java 将字符串解析为特定格式的日期,java,java-time,Java,Java Time,我有一个字符串,格式如下string stringDate=“2019-04-25T07:03:17.428Z”我需要将其转换为格式为2019-04-25 07:03:17的LocalDateTime对象 我尝试过使用LocalDateTime.parse(stringDate,DateTimeFormatter.of模式(“yyyy-MM-dd HH:MM:ss”)但是我遇到了这个解析异常: Exception in thread "main" java.time.form

我有一个字符串,格式如下
string stringDate=“2019-04-25T07:03:17.428Z”我需要将其转换为格式为2019-04-25 07:03:17的LocalDateTime对象

我尝试过使用
LocalDateTime.parse(stringDate,DateTimeFormatter.of模式(“yyyy-MM-dd HH:MM:ss”)
但是我遇到了这个解析异常:

Exception in thread "main" java.time.format.DateTimeParseException: Text '2019-04-25T07:03:17.428Z' could not be parsed at index 10
    at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2046)
    at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)
    at java.base/java.time.LocalDateTime.parse(LocalDateTime.java:492)
    at com.company.Main.main(Main.java:12)

转换为特定格式的方法是什么?

基本上,您的输入不是LDT。这是一个ZDT——Z是一个区域(ZoneDateTime)。因此,不可能将此字符串直接转换为LDT,这很好,因为这没有意义

将其转换为ZDT。然后将其转换为LDT。这是一个方法调用。

您要求的(但不想要的) 输出为

2019-04-25T07:03:17

它给了你你所说的你想要的,但是正如在另一本书中指出的,它没有意义。它忽略字符串中的偏移量
Z
。偏移量对于将日期和时间解释为时间点至关重要。如果该字符串为
2019-04-25T07:03:17.428+13:00
,则即使该字符串表示早13小时的时间点,您仍会获得相同的输出

truncatedTo()
的调用消除了秒数。如果你能忍受那一秒,那就别打电话了

你想要什么 对于更合理的转换:

    ZoneId zone = ZoneId.of("Europe/Zagreb");
    
    Instant pointInTime = Instant.parse(stringDate);
    LocalDateTime ldt = pointInTime.atZone(zone)
            .toLocalDateTime()
            .truncatedTo(ChronoUnit.SECONDS);

    System.out.format("Date and time in %s: %s%n", zone, ldt);
欧洲/萨格勒布的日期和时间:2019-04-25T09:03:17

现在UTC时间07:03已转换为中欧夏季时间09:03

编辑:如果确实需要UTC中的
LocalDateTime
,例如,对于需要它的数据库列,可以通过以下方式在代码中明确这一事实:

    LocalDateTime ldt = pointInTime.atOffset(ZoneOffset.UTC)
            .toLocalDateTime()
            .truncatedTo(ChronoUnit.SECONDS);

    System.out.format("Date and time in UTC: %s%n", ldt);
UTC的日期和时间:2019-04-25T07:03:17

你的代码出了什么问题? 为了了解失败的原因,让我们看看您收到的异常消息:

无法在索引10处分析文本“2019-04-25T07:03:17.428Z”


索引10是表示时间部分开始的
T
的位置。让我们比较一下您的格式模式字符串:
yyyy-MM-dd HH:MM:ss
。这在时间部分之前有一个空格而不是
T
。这就是例外的原因。如果您需要在模式中指定一个
T
必须存在,我们需要用单引号将其括起来,例如
yyyy-MM-dd'T'HH:MM:ss
您可以首先使用java.time.Instant解析它,然后使用java.time.LocalDateTime方法解析它

String stringDate = "2019-04-25T07:03:17.428Z";
var instant = Instant.parse(stringDate);
var localDateTime = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);

你能提供你得到的例外情况吗?看起来您的解析模式不正确您得到的字符串是UTC格式的(由尾部的
Z
表示)。您需要
LocalDateTime
位于您自己的时区还是用户的时区?@OleV.V。它可以留在家里UTC@MattiaRighetti线程“main”java.time.format.DateTimeParseException中的异常:无法在java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2046)的java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)的索引10处解析文本“2019-04-25T07:03:17.428Z”位于com.company.Main.Main(Main.java:12)的java.base/java.time.LocalDateTime.parse(LocalDateTime.java:492)
String stringDate = "2019-04-25T07:03:17.428Z";
var instant = Instant.parse(stringDate);
var localDateTime = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);