Java EE 中的时区



我想在Java EE项目中将一些时间值(java.sql.Time)从后端传递到前端。出于某种历史原因,我通过调用方法 getTime() 将 Time 类型解析为 long 类型,这意味着我使用长类型在前端和后端之间进行通信。问题来了:

当我在前端获得长类型时间时,我必须使用 js 方法将长类型改回 Time:new Date(long),但从此方法获取的值将与客户端的时区不同,这意味着不同时区的不同客户端将看到不同的结果。这绝对不是我想要的。所有客户端都应看到相同的结果,等于后端的结果。

解决此问题的两种方法:

  1. 将前端和后端的时区更改为UTC时间,但是java.sql.Time与时区无关,如果我想更改java.sql.Time的时区,我必须更改JVM时区。这不是一个好方法。还有其他方法可以更改时区吗?

  2. 将后端的时区传递到前端。但是在前端更改 UTC 以外的时区很难(可能需要一些 js 库)。

谁能告诉我解决问题的最佳方法?

另一种方法是:

  1. 将后端日期的时区更改为 UTC。使用 http://www.joda.org/joda-time/- Joda API 进行相同的操作。这是最好的。 这里给出了一个最好的例子。

  2. 将日期传递到前端。

  3. 在前端将日期转换为 UTC 格式并显示给最终用户。

tl;dr

通过。

Duration                           // Represent a span-of-time unattached to the timeline.
.between(
    LocalTime.MIN ,                // 00:00:00.0
    LocalTime.of( 15 , 0 )         // 3 PM, with no date, and no time zone or offset-from-UTC.
) 
.toMilliseconds()                  // Get a count of elapsed milliseconds.

并将毫秒计数解析为没有日期、区域或偏移量的时间。

LocalTime lt = LocalTime.MIN.plus ( Duration.ofMilliseconds( milliseconds ) ) ;

java.time

您正在使用糟糕的日期时间类,这些类几年前被JSR 310中定义的现代java.time类所取代。

我想传递一些时间值(java.sql.Time)

该类型已被 java.time.LocalTime 类取代。

LocalTime lt = LocalTime.of( 15 , 0 ) ;  // 3 PM. 

我通过调用方法 getTime() 将 Time 类型解析为 long 类型,这意味着我使用长类型在前端和后端之间进行通信。

这不太理想。最好使用标准 ISO 8601 格式通过文本传达日期时间值。

java.time 类在解析/生成字符串时默认使用标准 ISO 8601 格式。

String output = lt.toString() ;

。和。。。

LocalTime lt = LocalTime.parse( "15:00" ) ;

但是,如果我们必须继续这种毫秒数的黑客攻击,我们可以。

表示从一天中最早的时间开始的时间跨度。对于 LocalTime 类中表示的通用 24 小时日,这将是 00:00:00。顺便说一下,在同一日期的某些时区中,一天可能会从一天中的另一个时间开始,例如 01:00:00,但这在这里无关紧要。

Duration d = Duration.between( LocalTime.MIN , lt ) ;
long milliseconds = d.toMillis() ;

并将毫秒数解析回DurationLocalTime

Duration d = Duration.ofMillis( milliseconds ) ;
LocalTime lt = LocalTime.MIN.plus( d ) ;

将前端和后端的时区更改为 UTC 时间

没必要。LocalTime类和Duration类都没有时区的概念,也没有 UTC 偏移量的概念。因此,区域/偏移量不是问题。

我可以就你关于遗留课程的问题提出很多观点。但真的没有理由打扰。这些课程确实是血腥的可怕,应该干脆放弃。

相关内容

  • 没有找到相关文章

最新更新