Java中时间的奇怪行为

时间:2013-07-18 10:31:56

标签: java date time

我有一个非常奇怪的问题。我写了以下代码:

public static final long ONE_DAY_IN_MS = 86400000L;

public static long getTimeOfTheDayInMs() {
    return System.currentTimeMillis() % ONE_DAY_IN_MS;
}

这应该返回午夜以来的毫秒,对吗? 嗯,是的,不,因为它返回自午夜少于一小时以来的时间。 这是为什么?为什么这段代码:

System.out.println(new Date(System.currentTimeMillis()));
System.out.println(new Date(getTimeOfTheDayInMs()));

返回这个??

18-jul-2013 12.34.03
1-jan-1970 11.34.03

我还发现这个问题似乎是从1992年3月30日开始的。

还有其他人和我一样的问题吗?有人能解释我为什么吗?

提前致谢,

PS:我的Windows PC和Android平板电脑都出现了这个问题。

3 个答案:

答案 0 :(得分:3)

您的getTimeOfTheDayInMs() 会返回午夜以来的毫秒数。时代是1970年,currentTimeMillis()是相对于此的。使用Calendar http://developer.android.com/reference/java/util/Calendar.html获取第二个等字段。

答案 1 :(得分:1)

当我运行你的代码时,我得到了

Thu Jul 18 12:33:53 CEST 2013
Thu Jan 01 11:33:53 CET 1970

即。不同的是夏季时间的变化(CEST是欧洲中部的夏季时间; CET是中欧(冬季)时间,即GMT + 1)。

答案 2 :(得分:0)

由于时区变化,夏令时政策的变化等原因可能会发生这种情况。 我强烈建议您不要在生产代码中使用Date类。使用日历甚至更好的Joda Time。

  DateMidnight midnight = new DateMidnight();
  DateTime now = new DateTime();
  Duration duration = new Duration(midnight, now);
  int seconds = duration.toStandardSeconds().getSeconds();