Java中给定日期减去一毫秒

Mdh*_*r9e 1 java milliseconds java.util.date

我有一个日期字段expiryDate,其值为Thu Nov 21 00:00:00 IST 2019但我试图通过从Thu Nov 20 23:59:59 IST 的时间中删除一毫秒来获取当天之前的 endDate 时间2019 年, 我们是否有任何方法可以从给定日期中删除毫秒。

Bas*_*que 5

java.time

\n\n

避免使用从 JSR 310 开始遗留下来的糟糕的日期时间类。现在已被现代的java.time类取代。

\n\n

Java 中的日期时间类型表(现代和传统)

\n\n

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

\n\n
Instant instant = myJavaUtilDate.toInstant() ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后又回来了。

\n\n
java.util.Date myJavaUtilDate = Date.from( instant ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

减去一毫秒。

\n\n
Instant oneMilliEarlier = instant.minusMillis( 1 ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

半开式

\n\n

但我建议你不要采取这种方法。不要追踪时间跨度的最后一刻。

\n\n

您尝试追踪一天中的最后一刻是有问题的。你正在失去最后一毫秒的时间。这样做会在第二天凌晨之前留下一个间隙。当切换到更精细的时间切片时,例如某些系统(例如 Postgres 等数据库)使用的微秒,以及其他软件(例如 java.time)使用的纳秒,您会遇到更严重的问题。

\n\n

更好的方法是日期时间处理中常用的半开放方法。时间跨度的开始是包容性的,而结束是排他性的

\n\n

因此,一整天从当天的第一时刻开始,通常是 00:00:00(但并非总是如此!),一直持续到(但不包括)第二天的第一时刻

\n\n
ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;\nZonedDateTime zdt = ZonedDateTime.now( z ) ;\nZonedDateTime start = zdt.toLocalDate().atStartOfDay( z ) ;\nZonedDateTime stop = start.plusDays( 1 ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

提示:要处理此类时间跨度,请添加ThreeTen-Extra库来访问该类Interval

\n\n
\n\n

关于java.time

\n\n

java.time框架内置于 Java 8 及更高版本中这些类取代了麻烦的旧遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat

\n\n

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

\n\n

Joda -Time项目现在处于维护模式,建议迁移到java.time类。

\n\n

您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC 驱动程序。不需要字符串,不需要类。java.sql.*

\n\n

从哪里获取 java.time 类?

\n\n\n\n

ThreeTen -Extra项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如Interval、、、等等。YearWeekYearQuarter

\n