我知道这一直是一个热门话题......但我找不到合适的答案。
我有以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
答案 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无关,但我不确定。由于我在不同区域的日期有问题。
所以这正是UTC和CET时区之间的区别。您可以通过更改当地时区来完成相同的操作。
所以我认为你们都错了。或者openjdk和oracle sdk都有错误。
有人可以解释一下吗?