问题描述
考虑到当前日期时间,我需要找回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()
,并且实际上由LocalDate
和LocalTime
组成。 / p>
您的错误消息告诉您LocalDate
的内容无法使用给定的模式(-String
)"yyyy-MM-dd HH:mm:ss.SSS"
进行格式化,因为该模式需要几个小时的值({{1} }),分钟(HH
),秒(mm
)和毫秒(ss
是秒的分数 ,其中三个是毫秒)。 / p>
对于解析SSS
或格式化日期时间,使用String
可能是合适的,但是如果您想可靠地增加或减少LocalDateTime
或任何其他时间,您宁愿选择使用考虑时区,偏移量和夏时制的类,例如year
或ZonedDateTime
...
可能不是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
,但建议您使用OffsetDateTime
或ZonedDateTime
,以便可以灵活地使用区域偏移和区域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格式而引发了您的异常
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
String now = dateTimeFormatter.format(LocalDateTime.now());
LocalDateTime localDate = LocalDateTime.parse(now,dateTimeFormatter);