以 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”
- 例如: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: 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 格式
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()
,实际上由 LocalDate
和 LocalTime
组成.
您的错误消息告诉您 LocalDate
的内容无法使用给定模式 (-String
) "yyyy-MM-dd HH:mm:ss.SSS"
格式化,因为该模式需要小时值 (HH
)、分钟(mm
)、秒(ss
)和毫秒(SSS
是秒的分数,其中三个使为毫秒)。
对于解析 String
或格式化日期时间,LocalDateTime
可能是合适的,但如果您想可靠地添加或减去 year
或任何其他时间量,您我宁愿使用 class 来考虑时区、偏移量和夏令时,例如 ZonedDateTime
或 OffsetDateTime
...
LocalDate
不符合您的要求 class,因为它不包含时间信息。您可以使用 LocalDateTime
,但我建议您使用 OffsetDateTime
或 ZonedDateTime
,这样您就可以灵活地使用区域偏移量和区域 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
考虑到当前日期时间,我需要获得 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: 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 格式
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()
,实际上由 LocalDate
和 LocalTime
组成.
您的错误消息告诉您 LocalDate
的内容无法使用给定模式 (-String
) "yyyy-MM-dd HH:mm:ss.SSS"
格式化,因为该模式需要小时值 (HH
)、分钟(mm
)、秒(ss
)和毫秒(SSS
是秒的分数,其中三个使为毫秒)。
对于解析 String
或格式化日期时间,LocalDateTime
可能是合适的,但如果您想可靠地添加或减去 year
或任何其他时间量,您我宁愿使用 class 来考虑时区、偏移量和夏令时,例如 ZonedDateTime
或 OffsetDateTime
...
LocalDate
不符合您的要求 class,因为它不包含时间信息。您可以使用 LocalDateTime
,但我建议您使用 OffsetDateTime
或 ZonedDateTime
,这样您就可以灵活地使用区域偏移量和区域 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