0

鉴于:

public static void main(String[] args) {

   String dateString = "2018-07-30T13:36:17.820";

    DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter
            .ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");

    LocalDate date = LocalDate.parse(dateString, DATE_TIME_FORMATTER);

    ZonedDateTime zonedDateTime = date.atStartOfDay((ZoneOffset.UTC));

    System.out.println(zonedDateTime);
}

并输出:

2018-07-30T00:00Z

...打印秒的模式是什么?毫无疑问是愚蠢的问题,但让我有点发疯

我需要:

2018-07-30T00:00:00Z
4

4 回答 4

3

我将java.time.LocalDate更改为java.time.LocalDateTime,如果您还想显示秒数,则需要它。

package com.test;

import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class DateFormatter {

    public static void main(String[] args) {

        String dateString = "2018-07-30T13:36:17.820";

        DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter
                .ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");

        LocalDateTime date = LocalDateTime.parse(dateString, DATE_TIME_FORMATTER);

        ZonedDateTime zonedDateTime = date.atZone(ZoneOffset.UTC);


        System.out.println(zonedDateTime);
    }
}

输出是:

2018-07-30T13:36:17.820Z
于 2021-04-26T13:39:04.770 回答
1

tl;博士

你在错误的地方使用了错误的东西。

  1. 您不需要DateTimeFormatter显式解析2018-07-30T13:36:17.820,因为它已经采用ISO 8601格式,这也是LocalDateTime#parse. 此外,这个字符串有日期和时间,而不仅仅是日期;因此,将其解析为LocalDateTime而不是LocalDate. 您总是可以LocalDateLocalDateTime使用LocalDateTime#toLocalDate.
  2. TheZonedDateTime#toString使用LocalDateTime#toStringwhich 反过来LocalTime#toString用于时间部分,如果它们为零,则省略秒和秒的分数。如果您需要零秒和小数秒的字符串,则需要使用DateTimeFormatter.

演示:

import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String args[]) {
        String dateString = "2018-07-30T13:36:17.820";

        LocalDateTime localDateTime = LocalDateTime.parse(dateString);// You do not need a DateTimeFormatter here

        ZonedDateTime zonedDateTime = localDateTime.toLocalDate().atStartOfDay(ZoneOffset.UTC);

        // Print zonedDateTime.toString()
        System.out.println(zonedDateTime);

        // Custom format
        final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
        System.out.println(DATE_TIME_FORMATTER.format(zonedDateTime));
    }
}

输出:

2018-07-30T00:00Z
2018-07-30T00:00:00.000

从Trail: Date Time了解有关现代日期时间 API 的更多信息。

于 2021-04-29T08:50:30.557 回答
1

LocalDate 将保持日期。您需要解析 LocalDateTime 并转换为 ZonedDateTime 并且您将拥有预期的秒数。

    var dateString = "2018-07-30T13:36:17.820";
    var format = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
    var localDate = LocalDateTime.parse(dateString, format);
    var zone = ZoneId.of( "America/Montreal" );
    var zonedDateTime = localDate.atZone(zone);
    System.out.println(zonedDateTime);
于 2021-04-26T13:35:37.427 回答
1

您将必须执行几个步骤:

  • 解析String到 aLocalDateTime因为它包含日期和时间
  • 仅提取日期
  • 通过ZonedDateTime添加一天的开始 ( LocalTime.MIN= 00:00:00) 和 aZoneOffset.UTC

此代码可能会:

public static void main(String[] args) {
    String dateString = "2018-07-30T13:36:17.820";
    // parse a LocalDateTime
    LocalDateTime localDateTime = LocalDateTime.parse(dateString);
    // extract the date part
    LocalDate localDate = localDateTime.toLocalDate();
    // make it a ZonedDateTime by applying a ZoneId
    ZonedDateTime zonedDateTime = ZonedDateTime.of(localDate, LocalTime.MIN, ZoneOffset.UTC);
    // print the result
    System.out.println(zonedDateTime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));
}

输出是

2018-07-30T00:00:00Z

有几种方法可以做到这一点,这只是其中一种,它与大多数其他答案(和评论:-) 略有不同。

于 2021-04-26T13:46:16.787 回答