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
任何人都可以帮我解释原因吗?
答案 0 :(得分:9)
答案 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.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);
}
}
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 desugaring 和 How to use ThreeTenABP in Android Project。