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(如上所述)
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 ) ;