![](/img/trans.png)
[英]How to compare the datetime of format "EEE MMM dd HH:mm:ss zzz yyyy" and "yyyy-MM-dd hh:mm:sss" in java?
[英]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:無法解析文本“2020-08-13”
在 Java 8+ 中執行此操作的最佳方法是什么?
LocalDate
不包含有關小時、分鍾、秒或以下任何單位的任何信息,而是包含有關年、月和日的信息。 通過調用LocalDate.now()
您將獲得今天的日期(代碼執行的日期)。
如果您也需要時間,請使用LocalDateTime
,它也有一個方法now()
,實際上由LocalDate
和LocalTime
組成。
您的錯誤消息告訴您LocalDate
的內容無法使用給定模式 (- String
) "yyyy-MM-dd HH:mm:ss.SSS"
進行格式化,因為該模式需要小時 ( HH
)、分鍾 ( mm
)、秒 ( ss
) 和毫秒 ( SSS
是秒的分數,其中三個是毫秒)。
對於解析String
或格式化日期時間, LocalDateTime
可能是合適的,但如果您想可靠地增加或減少year
或任何其他時間量,您寧願使用考慮時區、偏移量和夏令時的 class,如ZonedDateTime
或OffsetDateTime
...
可能不是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
是錯誤的 class ,因為它不包含時間信息。 您可以使用LocalDateTime
但我建議您使用OffsetDateTime
或ZonedDateTime
以便您可以靈活地使用區域偏移量和區域 ID。 查看https://docs.oracle.com/javase/tutorial/datetime/iso/overview.html了解日期時間類的概述。
另外,請記住,日期或時間或日期時間 object 是一個 object,它只保存有關日期/時間的信息; 它不包含有關格式的任何信息,因此無論您在打印對象時做什么,您總是會得到 output 他們的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);
}
}
Output:
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
你說你想要一年前的日期+時間,但你只給它一個日期(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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.