【问题标题】:substract one millisecond to the given Date in JavaJava中给定的日期减去一毫秒
【发布时间】:2019-11-20 06:39:19
【问题描述】:

我有一个日期字段 expiryDate,其值为 Thu Nov 21 00:00:00 IST 2019 但我正在尝试获取 endDate通过从 Thu Nov 20 23:59:59 IST 2019 的时间中删除一毫秒,到前一天的时间 我们有什么方法可以从给定的日期中删除毫秒。

【问题讨论】:

  • Date b = new Date(a.getTime()-1);
  • 你为什么使用Date
  • 可能是因为它在问题中被明确包含为标签。也许OP对此有一些要求。如果没有,请考虑转至java.time

标签: java milliseconds java.util.date


【解决方案1】:

java.time

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

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

Instant instant = myJavaUtilDate.toInstant() ;

然后又回来了。

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

减去一毫秒。

Instant oneMilliEarlier = instant.minusMillis( 1 ) ;

半开

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

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

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

所以一整天从一天的第一刻开始,通常是 00:00:00(但并非总是如此!),一直持续到但不包括下一个 一天。

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 类。


关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

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

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

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

从哪里获得 java.time 类?

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

【讨论】:

    【解决方案2】:

    是的。我刚刚尝试使用上述方法 getTime() 将毫秒返回给定日期。 减去一毫秒给了我一个正确的输出。 新日期(毫秒)给我日期格式。

    感谢@Elliott Frisch

    【讨论】:

    • 你为什么使用Date?几乎没有正当理由使用 Java 的旧的坏的 legacy date api。考虑使用LocalDate 和现代 api 的类似类。
    • @Zabuza 很多使用Date的正当理由,例如使用许多使用Date 的 API/库中的任何一个,包括 Java 运行时库中的许多 API。
    • 是的,这就是我提到的几乎没有。我认为最好在您自己的代码中尽可能长时间地使用非日期,然后在您实际必须将其提供给旧 API 时转换为它。无论如何,我会留下它作为注释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 2012-10-04
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多