Java Date d=Calendar.getTime()返回错误的时间?

Java Date d=Calendar.getTime()返回错误的时间?,java,date,calendar,Java,Date,Calendar,输出为: 2011年10月5日星期三20:45:00英国夏令时 有人能帮我解释一下为什么会这样吗?用于将小时设置为12小时制 换句话说,您可以将日历设置为20:45。现在是晚上8:45 用于设置24小时时钟值。当然-您正在设置的值表示1-12“半天的小时数”。您应该使用全天的0-23值: Calendar calendar = Calendar.getInstance(); calendar.set(calendar.HOUR, 8); calendar.set(calendar.MINUTE,

输出为: 2011年10月5日星期三20:45:00英国夏令时

有人能帮我解释一下为什么会这样吗?

用于将小时设置为12小时制

换句话说,您可以将日历设置为20:45。现在是晚上8:45

用于设置24小时时钟值。

当然-您正在设置的值表示1-12“半天的小时数”。您应该使用全天的0-23值:

Calendar calendar = Calendar.getInstance();
calendar.set(calendar.HOUR, 8);
calendar.set(calendar.MINUTE, 45);
calendar.set(calendar.SECOND, 00);
    
Date d = calendar.getTime();
    
System.out.println(d);
或者,使用更好的日期/时间API:)

顺便说一句,请不要通过引用引用静态成员。。。当你调用
someOtherThread.sleep(…)
而你当前的线程睡眠…

java.time时,这会导致疼痛
java.util
Date-Time API及其格式化API
SimpleDataFormat
已经过时,并且容易出错。建议完全停止使用,并切换到*

使用现代日期时间API
java.time的解决方案:

calendar.set(Calendar.HOUR_OF_DAY, 8);

表示中时间线上的瞬时点。输出中的
Z
是零时区偏移的最佳值。它代表Zulu并指定
Etc/UTC
时区(其时区偏移量为
+00:00
小时)

出于任何原因,如果您需要将此
Instant
对象转换为
java.util.Date
对象,可以按如下操作:

import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;

public class Main {
    public static void main(String[] args) {
        Instant instant = OffsetDateTime.now(ZoneOffset.UTC)
                            .withHour(8)
                            .withMinute(45)
                            .withSecond(0)
                            .toInstant();
        System.out.println(instant);
    }
}
注意:很可能,您希望秒的分数也为零。如果是,只需在现有代码中添加
.withNano(0)
,如下所示:

Date date = Date.from(instant);
了解有关现代日期时间API的更多信息


*无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用哪个backport将大部分Java.time功能移植到Java6&7。如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并确认。

您希望输出结果是什么。
OffsetDateTime.now(ZoneOffset.UTC)
    .withHour(8)
    .withMinute(45)
    .withSecond(0)
    .withNano(0)
    .toInstant();