簡體   English   中英

以 yyyy-MM-dd HH:mm:ss.SSS 格式從當前 dateTime 獲取 1 年前的 dateTime

[英]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”

  • 例如: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組成。

您的錯誤消息告訴您LocalDate的內容無法使用給定模式 (- String ) "yyyy-MM-dd HH:mm:ss.SSS"進行格式化,因為該模式需要小時 ( HH )、分鍾 ( mm )、秒 ( ss ) 和毫秒 ( SSS秒的分數,其中三個是毫秒)。

對於解析String或格式化日期時間, LocalDateTime可能是合適的,但如果您想可靠地增加或減少year或任何其他時間量,您寧願使用考慮時區、偏移量和夏令時的 class,如ZonedDateTimeOffsetDateTime ...

可能不是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但我建議您使用OffsetDateTimeZonedDateTime以便您可以靈活地使用區域偏移量和區域 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 格式

Java文檔

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM