Java 中的给定日期减去一毫秒

substract one millisecond to the given Date in Java

我有一个日期字段 expiryDate 的值为 Thu Nov 21 00:00:00 IST 2019 但是我试图通过从 11 月 20 日星期四 23:59:59 IST 2019 我们有什么方法可以从给定的日期中删除毫秒吗?

是的。我只是尝试使用上述方法 getTime() returns 毫秒到给定日期。 减去一毫秒就是给我一个正确的输出。 新日期(毫秒)给我日期格式。

感谢@Elliott Frisch

java.time

避免可怕的日期时间 classes,它们现在是 JSR 310 的遗留问题。现在被现代的 java.time classes.

您可以轻松地来回转换。调用添加到旧 classes 的新转换方法。

Instant instant = myJavaUtilDate.toInstant() ;

又回来了。

java.util.Date myJavaUtilDate = Date.from( instant ) ;

减去一毫秒。

Instant oneMilliEarlier = instant.minusMillis( 1 ) ;

半开

但我建议你不要采用这种方法。不要通过最后一刻来跟踪时间跨度。

您试图追踪当天的最后一刻是有问题的。你正在失去最后一毫秒的时间。这样做会留下空档,直到第二天的第一刻。并且当切换到更精细的时间切片时,例如某些系统(例如 Postgres 等数据库)使用的微秒,以及其他软件(例如 java.time class 是的,你有一个更糟糕的问题。

更好的方法是日期时间处理中常用的半开方法。时间跨度的开始是包含,而结束是不包含

因此,一整天从一天的第一刻开始,通常是 00:00:00(但不总是!),一直到但不包括 [=71] 的第一刻=]下一个天。

ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
ZonedDateTime start = zdt.toLocalDate().atStartOfDay( z ) ;
ZonedDateTime stop = start.plusDays( 1 ) ;

提示:要处理这样的时间跨度,请添加 ThreeTen-Extra 库以访问 Interval class。


关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

您可以直接与数据库交换 java.time 对象。使用 JDBC driver compliant with JDBC 4.2 或更高版本。不需要字符串,不需要 java.sql.* classes.

从哪里获得java.time classes?

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.