与Java中的新日期混淆

时间:2017-01-11 06:02:09

标签: java

我在java jsp页面中使用新日期:

<jsp:useBean id="today" class="java.util.Date" scope="page"></jsp:useBean>

今天使用此功能检索在此日期执行的执行情况&#39;。

我在这里感到困惑,这个新日期是否需要app服务器或客户端(印度的系统时间)日期。

由于app服务器位于USA (GMT)且客户端位于India (IST),因此由于存在这种差异,我们面临的问题是由于时差而未在UI上显示执行值。

那么如何解决这个问题,请分享您的想法

3 个答案:

答案 0 :(得分:3)

当服务器中呈现JSP时,肯定需要服务器时间。如果要使用客户端日期,则可以使用在客户端运行的java脚本

答案 1 :(得分:1)

java.util.Date不包含有关时区的信息。看看如何在页面中显示日期值。

答案 2 :(得分:0)

应接受correct Answer by Anoop LL。 JSP页面确实是在服务器端编译的,它们的Java代码是在服务器端执行的。我将添加更多信息。

Date是UTC

java.util.Date是UTC。其toString方法在生成字符串时会混淆地应用JVM的当前默认时区。这会在Date中创建时区的错觉。

避免遗留日期时间类

你应该避免使用java.time类取代的麻烦的旧类java.util.Date,现在是遗留的。

使用java.time

要以UTC格式捕获当前时刻,请使用Instant类。

Instant instant = Instant.now();

要通过某个地区wall-clock time的镜头观看此时刻,请应用时区ZoneId,以获得ZonedDateTime

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

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

作为一种快捷方式,请直接转至ZonedDateTime方法并调用其now方法并传递所需的时区。

ZonedDateTime zdt = ZonedDateTime.now( z );

永远不要依赖JVM当前的默认时区。它可以随时通过JVM中任何应用程序的任何线程中的任何代码进行任何调用来更改。而是通过传递任何选项时区参数明确指定所需/预期的时区。

您可以进一步调整到其他时区。

ZonedDateDate zdtLosAngeles = instant.atZone( ZoneId.of( "America/Los_Angeles" ) );
ZonedDateDate zdtParis = instant.atZone( ZoneId.of( "Europe/Paris" ) );
ZonedDateDate zdtKolkata = instant.atZone( ZoneId.of( "Asia/Kolkata" ) );
ZonedDateDate zdtAuckland = instant.atZone( ZoneId.of( "Pacific/Auckland" ) );

上面代码中的所有四个ZonedDateTime对象代表了相同的时刻,即时间轴上的相同点。它们每个都有不同的挂钟时间,好像四个人在世界范围的电话会议上同时抬头看着墙上的时钟。

以UTC格式工作

如有疑问,请使用UTC。您的大多数业务逻辑,数据存储和数据交换都应采用UTC格式。不要再想你自己当地的时区了。将UTC视为“同一时间”。所有其他分区时间仅仅是UTC主题的变化。

关于java.time

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

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

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

从哪里获取java.time类?

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