我想在Java EE项目中将一些时间值(java.sql.Time)从后端传递到前端。出于某种历史原因,我通过调用方法 getTime() 将 Time 类型解析为 long 类型,这意味着我使用长类型在前端和后端之间进行通信。问题来了:
当我在前端获得长类型时间时,我必须使用 js 方法将长类型改回 Time:new Date(long),但从此方法获取的值将与客户端的时区不同,这意味着不同时区的不同客户端将看到不同的结果。这绝对不是我想要的。所有客户端都应看到相同的结果,等于后端的结果。
解决此问题的两种方法:
-
将前端和后端的时区更改为UTC时间,但是java.sql.Time与时区无关,如果我想更改java.sql.Time的时区,我必须更改JVM时区。这不是一个好方法。还有其他方法可以更改时区吗?
-
将后端的时区传递到前端。但是在前端更改 UTC 以外的时区很难(可能需要一些 js 库)。
谁能告诉我解决问题的最佳方法?
另一种方法是:
将后端日期的时区更改为 UTC。使用 http://www.joda.org/joda-time/- Joda API 进行相同的操作。这是最好的。 这里给出了一个最好的例子。
将日期传递到前端。
在前端将日期转换为 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() ;
并将毫秒数解析回Duration
和LocalTime
。
Duration d = Duration.ofMillis( milliseconds ) ;
LocalTime lt = LocalTime.MIN.plus( d ) ;
将前端和后端的时区更改为 UTC 时间
没必要。LocalTime
类和Duration
类都没有时区的概念,也没有 UTC 偏移量的概念。因此,区域/偏移量不是问题。
我可以就你关于遗留课程的问题提出很多观点。但真的没有理由打扰。这些课程确实是血腥的可怕,应该干脆放弃。