【发布时间】:2018-11-02 05:50:55
【问题描述】:
因此,我开始使用 Java-GregorianCalendar 类进行一些测试,并注意到在以毫秒为单位初始化 Object 时发生了奇怪的行为。困扰我的是,虽然我将毫秒设置为 0,但时间显示为 1 点。
浏览 StackOverflow 之后,我注意到 Java 有时会与夏季和冬季时间混淆。所以我的问题是,如果今年已经完成了时间更改,并且我们再次生活在冬季,那么这种奇怪的行为来自冬季和夏季。
这是我用来测试的代码:
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class TestCalendar {
public static void main(String[] args) {
GregorianCalendar c = new GregorianCalendar();
c.setTimeInMillis(-3600000);
System.out.println(c.getTimeInMillis());
System.out.println(c.get(Calendar.HOUR));
String format = "mm:ss";
if (c.get(Calendar.HOUR_OF_DAY) > 0) format = "HH:mm:ss";
System.out.println(new SimpleDateFormat(format).format(c.getTime()));
}
}
这给了我输出
-3600000
0
0
最好的办法是找到一个独立于减去 -3600000 的解决方案,就好像在其他计算机上这个“错误”不存在我不想有 23:00:00 :)
编辑:
在尝试了更多之后,感谢反馈,我能够通过在初始化日历后添加这一行来解决我的小问题:
c.setTimeZone(TimeZone.getTimeZone("GMT"));
【问题讨论】:
-
它与夏令时和冬令时无关,而与您的时区有关。显然,您生活在一个时区,格林威治标准时间 0:00:00 对应于您所在时区的 1:00:00(如 CET - 中欧时间)
-
我在这里很困惑。 “我将毫秒设置为 0”是什么意思?你这是在哪里做的?您指的是 -3600000 由 -1 小时和零毫秒组成的吗?如果是这样,为什么这会以任何方式影响日历的时间?抛开这些不谈,你到底想做什么?既然看起来你可能正在尝试做日期数学,你看过java.time packge吗?
-
我的意思是如果我这样做 c.setTimeInMillis(0); c.get(Calendar.HOUR) 的输出是 1 实际上我并不想做时间数学,但我想在几秒钟内得到一个正确的格式化时间。所以例如你有 20 秒的时间我想显示 00:20,因为我需要这个用于我编写的游戏。
-
如果您只想使用时间(没有日期,没有时区),最好使用
java.time.LocalTime-java.util.Calendar是为使用日期和时区而构建的。 -
仅供参考,非常麻烦的旧日期时间类,例如
java.util.Date、java.util.Calendar和java.text.SimpleDateFormat现在是 legacy,被 Java 8 中内置的 java.time 类所取代,之后。见Tutorial by Oracle。
标签: java calendar gregorian-calendar