java.util.Date和UTC问题

时间:2011-05-11 16:43:55

标签: java date utc

我知道这一直是一个热门话题......但我找不到合适的答案。

我有以ms为单位的当前UTC时间,我需要将其与机器中的当前时间进行比较(因此它们应匹配)。

long myUTCtime = .....; // This reflects the UTC time
// myDate is in UTC, ok, I agree
Date myDate = new Date();
// When I use getTime() I get the localtime in ms, although not in UTC! but in DST
long milis = myDate.getTime();
// I get here a 60 minute difference
long difference = milis - myUTCtime;

我该怎么做?

提前致谢。

编辑:我不需要日历或任何东西。我没有向用户显示信息,我只想使用UTC时间,而日期应该始终是UTC

6 个答案:

答案 0 :(得分:3)

leonbloy是正确的。您不需要进行任何偏移计算。 Date.getTime()返回自纪元以来的毫秒数,,不考虑您当前的时区。这会让人感到困惑,因为Date.toString()使用您的本地时区返回日期String。

只要您的系统时间正确,您就可以直接比较您的时间长值和UTC时间。

答案 1 :(得分:2)

Date myDate = new Date();
long milis = myDate.getTime();

应该等同于更简单的:

long milis = System.currentTimeMillis();

两者都应该返回

  

差异,衡量标准   当前时间之间的毫秒数   和UTC,1970年1月1日午夜

快速检查我的linux框:

# cat X.java
public class X { public static void main(String[] args) {
                System.out.println( (new java.util.Date()).getTime());
                System.out.println( System.currentTimeMillis());
        } }

# javac X.java ; java X ; perl -e 'print time()*1000'
1305133124654
1305133124654
1305133124000

也许你有一个解释问题......

答案 2 :(得分:0)

可能使用

Calendar.get(Calendar.ZONE_OFFSET) + Calendar.get(Calendar.DST_OFFSET)) / (60 * 1000)

可以这样做,如弃用的方法所述:

http://download.oracle.com/javase/6/docs/api/java/util/Date.html#getTimezoneOffset()

看看它是否适合您。

答案 3 :(得分:0)

我不知道你如何填充myUTCtime,但new Date().getTime()System.currentTimeMillis()返回自1970-01-01 0:00 UTC以来的毫秒数。如果您看到myUTCtime的差异,我会认为myUTCtime不正确。其他可能的选择是例如您的操作系统配置了错误的时区,因此其他方法会给您不正确的值。

答案 4 :(得分:0)

Date保留自1970年以来的毫秒数,不涉及时区:

$ date +%s
1305133104
$ groovy -e "println System.currentTimeMillis() / 1000"
1305133106.155
$ groovy -e "println new Date().time / 1000"
1305133107.495

答案 5 :(得分:0)

util.Date与TimeZones无关,但我不确定。由于我在不同区域的日期有问题。

  1. 我的UTC服务器从存储为时间戳的数据库中获取日期,并返回日期2015-01-19 13:19:17.0。这是正确的,因为它是存储在数据库中的内容。现在我执行此日期的.getTime()/ 1000并获得 421673557
  2. 我从CET日期的其他服务器做同样的事情。和日期是2015-01-19 13:19:17.0(相同的),但.getTime()/ 1000返回 1421669957
  3. 所以这正是UTC和CET时区之间的区别。您可以通过更改当地时区来完成相同的操作。

    所以我认为你们都错了。或者openjdk和oracle sdk都有错误。

    有人可以解释一下吗?