Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.util.Date和UTC问题_Java_Date_Utc - Fatal编程技术网

java.util.Date和UTC问题

java.util.Date和UTC问题,java,date,utc,Java,Date,Utc,我知道这一直是个热门话题。。。但我找不到合适的答案 我有以毫秒为单位的当前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时间,我需要将其与我机器中的当前时间进行比较,以便它们匹配

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,可能使用

Calendar.get(Calendar.ZONE_OFFSET) + Calendar.get(Calendar.DST_OFFSET)) / (60 * 1000)
将执行以下操作,如此弃用方法中所述:

看看它是否适合你

可能使用

Calendar.get(Calendar.ZONE_OFFSET) + Calendar.get(Calendar.DST_OFFSET)) / (60 * 1000)
Date myDate = new Date();
long milis = myDate.getTime();
将执行以下操作,如此弃用方法中所述:

看看它是否适合你

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
也许你有一个解释问题

应等同于更简单的:

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

也许您有一个解释问题…

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

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

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


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

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

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

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

$ date +%s
1305133104
$ groovy -e "println System.currentTimeMillis() / 1000"
1305133106.155
$ groovy -e "println new Date().time / 1000"
1305133107.495
Date保存自1970年以来的毫秒数,不涉及时区:

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

Date与时区无关,但我不确定。因为我在不同的区域有约会的问题

UTC上的我的服务器从存储为时间戳的数据库中获取日期,并返回日期2015-01-19 13:19:17.0。这是正确的,因为它存储在数据库中。现在我对这个日期做一个.getTime/1000,得到421673557。 我在其他服务器上用CET日期做同样的事情。日期是2015-01-19 13:19:17.0,但相同。getTime/1000返回1421669957。 这就是UTC和CET时区之间的差异。您也可以通过更改本地时区来实现这一点

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


有人能解释一下吗?

util.Date与时区无关,但我不确定。因为我在不同的区域有约会的问题

UTC上的我的服务器从存储为时间戳的数据库中获取日期,并返回日期2015-01-19 13:19:17.0。这是正确的,因为它存储在数据库中。现在我对这个日期做一个.getTime/1000,得到421673557。 我在其他服务器上用CET日期做同样的事情。日期是2015-01-19 13:19:17.0,但相同。getTime/1000返回1421669957。 这就是UTC和CET时区之间的差异。您也可以通过更改本地时区来实现这一点

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


有人能解释一下吗?

谢谢,但我为什么要用日历呢?日期在UTC中不应该已经生效吗?是的,但您需要偏移量和。。。好Java Date API并不像它应该的那样对用户友好,也许您会想看看Joda time以获得更好的API:谢谢,但是为什么我需要使用日历呢?日期在UTC中不应该已经生效吗?是的,但您需要偏移量和。。。好Java Date API并不像它应该的那样对用户友好,也许您会想看看Joda time以获得更好的API:那么它是如何实现的呢?System.out.printlngetime:+milis;
输出:getTime:1305133066940这对应于伦敦的DST时间18:00,当时应该是17:00 UTCmmm,不。您的结果实际上与我的1分钟差异相同。这是utc。口译问题听起来更有可能,我将检查它可能是什么。谢谢你的帮助那我怎么知道的?System.out.printlngetime:+milis;输出:getTime:1305133066940这对应于伦敦的DST时间18:00,当时应该是17:00 UTCmmm,不。您的结果实际上与我的1分钟差异相同。这是utc。口译问题听起来更有可能,我将检查它可能是什么。感谢您在这方面的帮助更多:getTime中使用的normalize方法使用时区来获取值。。。时区tz=TimeZone.getDefaultRef;如果tz!=cdate.getZone{cdate.setZonetz;CalendarSystem cal=getCalendarSystemcdate;cal.getCalendarDatefastTime,cdate;}返回cdate;更多信息:getTime中使用的normalize方法使用时区来获取值。。。时区tz=TimeZone.getDefaultRef;如果tz!=cdate.getZone{cdate.setZonetz;CalendarSystem cal=getCalendarSystemcdate;cal.getCalendarDatefastTime,cdate;}返回cdate;