通过日历获取当天的最后时间会给出错误的结果

问题描述 投票:0回答:4

我正在尝试获取当天的最后时间。
例如:
今天的最后一次是 10.07.2015 23:59:59:999

因此我写了以下方法:

private static Date getLastDateOfDay() {
    final Calendar cal = Calendar.getInstance();
    cal.set(Calendar.MILLISECOND, 999);
    cal.set(Calendar.SECOND, 59);
    cal.set(Calendar.MINUTE, 59);
    cal.set(Calendar.HOUR, 23);
    return cal.getTime();
}

这应该获取当前日期,然后设置:
23 点
还有 59 分钟
秒到59
毫秒至 999

所以这应该给我今天的最后一毫秒。 但是当我使用这种方法时:

Date date = getLastDateOfDay();

则日期值为:11.07.2015 23:59:59:999

我错过了什么吗?我做错了什么吗? 请帮我解决这个问题。
提前谢谢。

java date calendar
4个回答
3
投票

您不能将 Hour 与 23 一起使用

查看日历中的 Javadoc

公共静态最终 int HOUR

获取和设置的字段编号,指示上午或下午的时间。 HOUR 用于 12 小时制 (0 - 11)。中午和午夜用 0 表示,而不是 12。例如,晚上 10:04:15.250 的 HOUR 为 10。


1
投票

设置

cal.set(Calendar.HOUR_OF_DAY, 23);

0
投票

您可以尝试为您的日历实例设置明确的时区,即:

final Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC");

这个答案也可以帮助: java.util.Calendar 的默认时区是多少?


0
投票

java.time

2014 年 3 月,Java 8 引入了现代的

java.time
日期时间 API,取代了容易出错的遗留
java.util
日期时间 API。任何新代码都应使用
java.time
API。如果您收到
java.util.Date
的实例,请使用
java.time.Instant
 将其转换为 
Date#toInstant
,并根据您的要求从中派生
java.time
的其他日期时间类。

使用现代日期时间 API 的解决方案

这取决于您认为今天结束的时间 - “x”小时、“x”分钟、“x”秒、“x”毫秒或“x”其他更小的单位。 下面的演示假设今天的结束比明天的开始少一纳秒

您可以使用以下代码开始今天的工作,其中

zoneId
包含执行代码的 JVM 的
ZoneId

LocalDate.now(zoneId)          // today
         .atStartOfDay(zoneId) // at 00:00

然后添加一天以获得明天的开始,并从结果中扣除 1 纳秒。

演示:

public class Main {
    public static void main(String[] args) {
        // ZoneId.systemDefault() gives you the ZoneId set to the JVM executing the code
        // Replace it as per your requirement e.g. ZoneId.of("Europe/Stockholm").
        ZoneId zoneId = ZoneId.systemDefault();
        ZonedDateTime eodToday = LocalDate.now(zoneId) // today
                .atStartOfDay(zoneId) // at 00:00
                .plusDays(1) // tomorrow
                .minus(1, ChronoUnit.NANOS);
        System.out.println(eodToday);
    }
}

在 UTC 时间在 JVM 上执行时的输出:

2024-10-06T23:59:59.999999999Z[GMT]

在线演示

Trail:日期时间了解有关现代日期时间 API 的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.