2

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

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

解决这个问题的两种方法:

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

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

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

4

2 回答 2

1

另一种方法可能是:

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

  2. 将日期传递到前端。

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

于 2013-09-12T03:35:52.490 回答
0

tl;博士

经过。

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类型,这意味着我使用long类型在前端和后端之间进行通信。

那不是最理想的。更好地使用标准ISO 8601格式通过文本传达日期时间值。

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

String output = lt.toString() ;

……和……</p>

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

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

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

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

并将毫秒数解析回 aDurationLocalTime.

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

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

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

关于您对遗留课程的问题,我可以提出很多观点。但真的没有理由打扰。这些课程实在是太可怕了,应该直接放弃。

于 2020-02-04T06:23:40.123 回答