javaee中的时区

javaee中的时区,java,timezone,Java,Timezone,我想在JavaEE项目中从后端向前端传递一些时间值(java.sql.Time)。出于某些历史原因,我通过调用方法getTime()将时间类型解析为long类型,这意味着我使用long类型在前端和后端之间进行通信。问题来了: 当我在前端得到long-type-time时,我必须使用js方法将long-type改回time:new-Date(long),但是从这个方法得到的值将与客户端的时区不同,这意味着不同时区的不同客户端将看到不同的结果。这绝对不是我想要的。所有客户端都应该看到相同的结果,等于

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

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

解决此问题的两种方法:

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

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


  • 有谁能告诉我解决这个问题的最佳方法吗

    另一种方法是:

  • 将后端日期的时区更改为UTC。使用-jodaapi进行同样的操作。这是最好的。 给出了一个最好的例子

  • 把日期传给前端

  • 在前端将日期转换为UTC格式,并将其显示给最终用户

  • tl;博士 通过

    以及将毫秒计数解析为一天中没有日期、区域或偏移量的时间

    LocalTime lt = LocalTime.MIN.plus ( Duration.ofMilliseconds( milliseconds ) ) ;
    
    java.time 您正在使用可怕的日期时间类,这些类在几年前被JSR310中定义的现代java.time类所取代

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

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

    LocalTime lt = LocalTime.of( 15 , 0 ) ;  // 3 PM. 
    
    我通过调用getTime()方法将时间类型解析为long类型,这意味着我使用long类型在前端和后端之间进行通信

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

    在解析/生成字符串时,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 d = Duration.ofMillis( milliseconds ) ;
    LocalTime lt = LocalTime.MIN.plus( d ) ;
    
    将前端和后端的时区更改为UTC时间

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


    关于遗留类的问题,我可以提出很多观点。但真的没有理由麻烦。这些课程真是糟糕透了,应该干脆放弃。

    可能与FYI重复:项目现在正在进行中。它的创建者继续领导定义内置于Java8+中的类。看。@Basil同意,问题和答案已经7年了!您已经添加了最近的答案,太好了!!我的评论不是批评,而是给读者的注释。因此,我使用了“仅供参考”和“现在”这两个词。我很高兴你的回答在过去帮助过人们。
    Duration d = Duration.ofMillis( milliseconds ) ;
    LocalTime lt = LocalTime.MIN.plus( d ) ;