我正在尝试获取当天的最后时间。
例如:
今天的最后一次是 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
我错过了什么吗?我做错了什么吗?
请帮我解决这个问题。
提前谢谢。
您不能将 Hour 与 23 一起使用
公共静态最终 int HOUR
获取和设置的字段编号,指示上午或下午的时间。 HOUR 用于 12 小时制 (0 - 11)。中午和午夜用 0 表示,而不是 12。例如,晚上 10:04:15.250 的 HOUR 为 10。
设置
cal.set(Calendar.HOUR_OF_DAY, 23);
您可以尝试为您的日历实例设置明确的时区,即:
final Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC");
这个答案也可以帮助: java.util.Calendar 的默认时区是多少?
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
的其他日期时间类。
这取决于您认为今天结束的时间 - “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 的更多信息。