以 yyyy-MM-dd HH:mm:ss.SSS 格式从当前日期时间获取 1 年前的日期时间

Get 1 year back dateTime from current dateTime in yyyy-MM-dd HH:mm:ss.SSS format

考虑到当前日期时间,我需要获得 1 年前的日期时间。格式需要为“yyyy-MM-dd HH:mm:ss.SSS”

我试过跟随。但是出现错误。

LocalDate now = LocalDate.now();
LocalDate localDate = LocalDate.parse(now.toString(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")).minusYears(1);

返回以下异常:

DateTimeParseException: Text '2020-08-13' could not be parsed

在 Java 8+ 中执行此操作的最佳方法是什么?

你说你想要 1 年前的日期+时间,但你只给它一个日期 (LocalDate)。如果你只想要日期,你需要做的就是:

    LocalDate now = LocalDate.now();
    LocalDate then = now.minusYears(1);

如果您还需要时间戳,则:

    LocalDateTime now = LocalDateTime.now();
    LocalDateTime then = now.minusYears(1);

其他对象依此类推。

可能不是 best 的方式,但这样就可以了

LocalDateTime date = LocalDateTime.now().minusYears(1);

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

System.out.println(date.format(formatter));

如前所述,您应该使用 LocalDateTime 而不是 LocalDate。

您的异常被抛出,因为您输入的字符串是 ISO_DATE_TIME 格式

Java Doc

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
String now = dateTimeFormatter.format(LocalDateTime.now());
LocalDateTime localDate = LocalDateTime.parse(now, dateTimeFormatter);

一个LocalDate不保存任何关于小时、分钟、秒或任何以下单位的信息,而是保存关于年、月和日的信息。通过调用 LocalDate.now(),您将获得 今天 (代码执行日期)的日期。

如果你也需要时间,使用 LocalDateTime,它也有一个方法 now(),实际上由 LocalDateLocalTime 组成.

您的错误消息告诉您 LocalDate 的内容无法使用给定模式 (-String) "yyyy-MM-dd HH:mm:ss.SSS" 格式化,因为该模式需要小时值 (HH)、分钟(mm)、秒(ss)和毫秒(SSS秒的分数,其中三个使为毫秒)。

对于解析 String 或格式化日期时间,LocalDateTime 可能是合适的,但如果您想可靠地添加或减去 year 或任何其他时间量,您我宁愿使用 class 来考虑时区、偏移量和夏令时,例如 ZonedDateTimeOffsetDateTime...

LocalDate 不符合您的要求 class,因为它不包含时间信息。您可以使用 LocalDateTime,但我建议您使用 OffsetDateTimeZonedDateTime,这样您就可以灵活地使用区域偏移量和区域 ID。检查 https://docs.oracle.com/javase/tutorial/datetime/iso/overview.html 以获得 date-time class 的概述。

此外,请记住日期或时间或 date-time 对象是仅包含有关 date/time 的信息的对象;它不包含任何关于格式化的信息,因此无论您在打印它们的对象时做什么,您总是会得到它们的 toString() 方法 return 的输出。为了格式化这些 classes 或者换句话说,为了获得表示这些对象的自定义格式的字符串,您需要格式化 API (例如现代的 DateTimeFormatter 或旧的 SimpleDateFormat) 任你支配。

示例代码:

import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        // Get the current date & time at UTC
        OffsetDateTime odtNow = OffsetDateTime.now(ZoneOffset.UTC);
        System.out.println("Now at UTC: " + odtNow);

        // Get the date & time one year ago from now at UTC
        OffsetDateTime odtOneYearAgo = odtNow.minusYears(1);
        System.out.println("One year ago at UTC: " + odtNow);

        // Define a formatter for the output in the desired pattern
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");

        // Format the date & time using your defined formatter
        String formattedDateTimeOneYearAgo = formatter.format(odtOneYearAgo);
        System.out.println("Date Time in the pattern, yyyy-MM-dd HH:mm:ss.SSS: " + formattedDateTimeOneYearAgo);
    }
}

输出:

Now at UTC: 2020-08-13T08:50:36.277895Z
One year ago at UTC: 2020-08-13T08:50:36.277895Z
Date Time in the pattern, yyyy-MM-dd HH:mm:ss.SSS: 2019-08-13 08:50:36.277