Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.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使用相同的输入参数显示不同的值_Date_Maven_Eclipse Plugin_Eclipse Rcp_Tycho - Fatal编程技术网

java.util.Date使用相同的输入参数显示不同的值

java.util.Date使用相同的输入参数显示不同的值,date,maven,eclipse-plugin,eclipse-rcp,tycho,Date,Maven,Eclipse Plugin,Eclipse Rcp,Tycho,我试着把相同的字符串整理出来 System.out.println(" DATE 29 " + new Date(1330462800000l) + " Date 01 " + new Date(1330549200000l)); 但当我在构建中检查它(在控制台模式下运行)和从eclipse运行应用程序时,我会得到不同的结果 eclipse的输出(似乎是正确的结果): 日期2012年2月29日星期三00:00:00 EET日期2012年3月1日星期四00:00:

我试着把相同的字符串整理出来

System.out.println(" DATE 29 " + new Date(1330462800000l) + " Date 01 "
                + new Date(1330549200000l));
但当我在构建中检查它(在控制台模式下运行)和从eclipse运行应用程序时,我会得到不同的结果

eclipse的输出(似乎是正确的结果):

日期2012年2月29日星期三00:00:00 EET日期2012年3月1日星期四00:00:00 EET 2012年

生成输出(控制台模式)

日期:2012年2月28日星期二23:00:00 EET日期:2012年2月29日星期三23:00:00 EET 2012年

很抱歉问了个愚蠢的问题,但你们对可能的原因有什么想法吗

PS:我使用maven+tycho来构建、打包类型的eclipse存储库

编辑: 在Eclipse中,我查看了时区值:

Calendar calendar=Calendar.getInstance();
System.out.println("!!!time zone before: " +   calendar.getTimeZone());
!!!以下时间之前的时区: sun.util.calendar.ZoneInfo[id=“Europe/Minsk”,偏移量=7200000,DSTSAVAINGS=3600000,useDaylight=true,transitions=121,lastRule=java.util.SimpleTimeZone[id=Europe/Minsk,offset=7200000,dstSaves=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDayOfWeek=1,startDayOfWeek=1,startDayOfWeek=1,startTime=7200000,startTimeMode=1,endMode=2,endMonth=9,endDayOfWeek=1,endTime=7200000,endTimeMode=1]]

然后我用硬编码的zoneId设置时区并进行构建

calendar.setTimeZone(TimeZone.getTimeZone("Europe/Minsk"));
没有任何结果

编辑:我在build和eclipse中使用不同版本和架构的JRE。这可能是原因吗? 编辑:

!!!!!!!system.timezone Europe/Minsk

!!!!!!!system.timezone Europe/Minsk!!!时区后的日历时间: sun.util.calendar.ZoneInfo[id=“Europe/Minsk”,偏移量=7200000,DSTSAVAINGS=3600000,useDaylight=true,transitions=121,lastRule=java.util.SimpleTimeZone[id=Europe/Minsk,offset=7200000,dstSaves=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDayOfWeek=1,startDayOfWeek=1,startDayOfWeek=1,startTime=7200000,startTimeMode=1,endMode=2,endMonth=9,endDayOfWeek=1,endTime=7200000,endTimeMode=1]]

时区正确。但日期仍然错误

添加到测试:

System.out.println(Calendar.getInstance().getTimeZone());

Java时区可以由系统属性user.timezone设置,有关详细信息,请参阅

供时间使用。您可以为所有joda对象重新定义时区:

DateTimeZone.setDefault(DateTimeZone.UTC);
添加到测试:

System.out.println(Calendar.getInstance().getTimeZone());

Java时区可以由系统属性user.timezone设置,有关详细信息,请参阅

供时间使用。您可以为所有joda对象重新定义时区:

DateTimeZone.setDefault(DateTimeZone.UTC);
太长,读不下去了 避免遗留日期时间类 您使用的旧日期时间类很麻烦,现在已经过时,被java.time类取代。许多缺陷包括
date::toString
方法在生成字符串时动态应用JVM的当前默认时区。
date
代表UTC中的一个时刻,但这是一个善意的反时限真的会带来混乱。JVM当前的默认时区随时都可能发生变化,即使在运行时也是如此,因此您可能会看到各种结果

java.time 使用
java.time.Instant
代替
java.util.Date

Instant
该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

学习以UTC为中心思考和工作。将UTC视为一个真实的时间™. 所有其他时区都只是这一主题的变体。在程序员的工作中,忘记您的个人本地时间,停止在区域之间来回转换,因为这会让您感到紧张。在编程和记录时,请关注UTC

ZoneDateTime
要通过另一个时区的镜头查看同一时刻,请应用
ZoneId
以获得
zoneDateTime
对象。我们仍然有相同的时刻,时间轴上的相同点,但有另一个挂钟时间

ZoneId z = ZoneId.of( "Europe/Minsk" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
看这个

instant.toString():2012-02-28T21:00:00Z

zdt.toString():2012-02-29T00:00+03:00[欧洲/明斯克]


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅.和搜索堆栈溢出以获取许多示例和解释。规范为

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android,该项目采用了ThreeTen Backport(如上所述)
该项目使用其他类扩展了java.time。该项目是将来可能添加到java.time的一个试验场。您可以在这里找到一些有用的类,如、、。

tl;dr 避免遗留日期时间类 您使用的旧日期时间类很麻烦,现在已经过时,被java.time类取代。许多缺陷包括
date::toString
方法在生成字符串时动态应用JVM的当前默认时区。
date
代表UTC中的一个时刻,但这是一个善意的反时限真的会带来混乱。JVM当前的默认时区随时都可能发生变化,即使在运行时也是如此,因此您可能会看到各种结果

java.time 使用
java.time.Instant
代替
java.util.Date

Instant
该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

学习以UTC为中心思考和工作。将UTC视为一个真实的时间™. 所有其他时区都只是这一主题的变体。在程序员的工作中,忘记你的个人本地时间,停止在区域之间来回转换,因为这会让你感到紧张。专注于你内心的UTC
Instant instant = Instant.ofEpochMilli( 1_330_462_800_000L ) ;
ZoneId z = ZoneId.of( "Europe/Minsk" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;