以yyyy-MM-dd HH:mm:ss.SSS格式从当前dateTime获得1年的dateTime

问题描述

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

  • 例如:2019-08-13 12:00:14.326

我尝试了以下操作。但是出现错误

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

返回以下异常:

DateTimeParseException:无法解析文本“ 2020-08-13”

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

解决方法

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

如果您还需要时间,请使用LocalDateTime,它也具有方法now(),并且实际上由LocalDateLocalTime组成。 / p>

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

对于解析SSS或格式化日期时间,使用String可能是合适的,但是如果您想可靠地增加或减少LocalDateTime或任何其他时间,您宁愿选择使用考虑时区,偏移量和夏时制的类,例如yearZonedDateTime ...

,

可能不是best方式,但这会做到

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

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

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

LocalDate是您所需要的错误的类,因为它不包含时间信息。您可以使用LocalDateTime,但建议您使用OffsetDateTimeZonedDateTime,以便可以灵活地使用区域偏移和区域ID。检查https://docs.oracle.com/javase/tutorial/datetime/iso/overview.html以获得日期时间类的概述。

此外,请记住,日期或时间或日期时间对象是仅保存有关日期/时间信息的对象;它不包含有关格式的任何信息,因此,无论您在打印对象时做什么,都将始终得到其toString()方法返回的结果。为了格式化这些类或换句话说,要获取表示这些对象的自定义格式的字符串,可以使用格式化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
,

您说要从1年以前开始加上日期和时间,但只给它一个日期(LocalDate)。如果您只想要日期,那么您要做的就是:

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

如果还需要时间戳,则:

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

对于其他对象,依此类推。

,

如前所述,您应该使用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);