日期d = Calendar.getTime()返回错误的时间?

时间:2011-10-05 12:54:56

标签: java date calendar

        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);

输出是: 2011年10月5日星期三20:45:00 BST 2011

任何人都可以帮我解释原因吗?

3 个答案:

答案 0 :(得分:9)

Calendar.HOUR用于设置12小时制设置的小时数。

换句话说,您执行Calendar设置为20:45。这是8:45 PM

使用Calendar.HOUR_OF_DAY设置24小时制值。

答案 1 :(得分:9)

当然 - 您正在设置Calendar.HOUR,代表半天的1-12“小时”。您应该使用HOUR_OF_DAY,这是一整天的0-23值:

calendar.set(Calendar.HOUR_OF_DAY, 8);

或者,使用Joda Time这是一个更好的日期/时间API:)

顺便说一句,不要通过引用引用静态成员...当你调用someOtherThread.sleep(...)并且你当前的线程睡觉时会导致痛苦......

答案 2 :(得分:3)

java.time

java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到 modern Date-Time API*

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

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);
    }
}

ONLINE DEMO

Instant 表示 UTC 中时间线上的一个瞬时点。输出中的 Z 是零时区偏移的 timezone designator。它代表祖鲁语并指定 Etc/UTC 时区(时区偏移为 +00:00 小时)。

出于任何原因,如果您需要将 Instant 的这个对象转换为 java.util.Date 的对象,您可以这样做:

Date date = Date.from(instant);

注意:很可能,您希望秒的分数也为零。如果是,只需在现有代码中添加 .withNano(0),如下所示:

OffsetDateTime.now(ZoneOffset.UTC)
    .withHour(8)
    .withMinute(45)
    .withSecond(0)
    .withNano(0)
    .toInstant();

Trail: Date Time 了解有关现代 Date-Time API 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project