Java Date给出了错误的时间

时间:2011-09-03 09:04:58

标签: java date

java Date()类是否有任何问题,它总是给我错误的时间,例如,如果我的系统时间是11,它给我12(它总是给当前系统时间增加一小时)。我怎么能解决这个问题?我希望约会给我与系统时间相同的时间。这与时区有关吗?我试过了:

Calendar startingTime = Calendar.getInstance(TimeZone.getDefault());
System.out.println(startingTime.getTime());

System.out.println(new Date());

由于

3 个答案:

答案 0 :(得分:5)

这可能是由两件事之一引起的:

  • 基础操作系统中的日期不正确(但您可能无意中对其进行了配置,因此您无法分辨)。
  • JVM确定的时区不正确(包括夏令时信息可能已过时)。

也许您可以添加new Date()的输出以及有关您的期望和所在位置的信息?

答案 1 :(得分:1)

只需补充Basil的答案,即可轻松更新TZdata。

首先从以下位置的Oracle下载时区更新程序工具:https://www.oracle.com/java/technologies/javase-tzupdater-downloads.html

然后使用目标JVM运行它。我的计算机中有多个JVM。在我的情况下,命令是:

sudo /Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/bin/java -jar tzupdater.jar -v -l https://www.iana.org/time-zones/repository/tzdata-latest.tar.gz

答案 2 :(得分:0)

TL;博士

ZonedDateTime.now(             // Capture the current moment as seen in the wall-clock time used by the people of a certain region (time zone).
    ZoneId.of( "Asia/Gaza" )   // Specify time zone by proper IANA-defined name, never a 3-4 letter pseudo-zone such as `PST` or `CST`.
)                              // Returns a `ZonedDateTime` object.
.toString()                    // Generate a `String` to represent the value of that `ZonedDateTime`.

详细

Answer by Andersen是正确的。

这是一些有助于调试的现代代码。

以UTC格式验证当前时刻

关于安徒生的第一颗子弹......

查看计算机的时钟是否设置错误或已漂移。询问UTC中的当前时刻,以避免时区的复杂化。

Instant now = Instant.now() ;  // Capture current moment in UTC.

将您的结果与显示UTC时间的实时网站进行比较,例如:

https://time.is/UTC

如果不正确,请将计算机连接到网络本地或互联网上的可靠time server

检查默认时区

关于安徒生的第二个子弹......

检查JVM的当前默认时区。

ZoneId z = ZoneId.systemDefault() ;
String output = z.toString() ;

指定所需的时区

如果未指定时区,则JVM会隐式应用其当前的默认时区。在运行时(!)期间,该默认值可能为change at any moment,因此您的结果可能会有所不同。最好明确指定desired/expected time zone作为参数。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "Asia/Gaza" ) ;  
ZonedDateTime now = ZonedDateTime.now( z ) ;

更新tzdata

正如Andersen所说,您的时区数据源可能是非日期的。世界各地的政治家们已经表现出对重新定义他们的时区所使用的偏移的奇怪偏好。

大多数系统都会从tzdata发布的IANA获取时区数据。此数据以前称为“Olson数据库”。

如果您关注的任何时区已更改,则必须使此数据保持最新状态。您可以在多个地方找到时区数据,包括

我寻找巴勒斯坦时区变化的历史,但维基百科页面Time in the State of Palestine不完整,需要一些工作。

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore