Java中时区之间的转换

Java中时区之间的转换,java,timezone,Java,Timezone,我正在以MM/dd/yyyy hh:MM a z格式从数据库中读取时间,现在我想以用户本地时区显示此时间。因此,我的问题是: 应该在客户端还是服务器端完成? 是否有用于此目的的内置库? 更新 所以我决定在服务器上进行转换,所以我有如下的方法定义,参数datefromserver和客户端时间的时区偏移量 public String convertToLocalDateTime(Date dateFromDB, Integer offSetMins) { //1. dbDateInUTC = C

我正在以MM/dd/yyyy hh:MM a z格式从数据库中读取时间,现在我想以用户本地时区显示此时间。因此,我的问题是:

应该在客户端还是服务器端完成? 是否有用于此目的的内置库? 更新 所以我决定在服务器上进行转换,所以我有如下的方法定义,参数datefromserver和客户端时间的时区偏移量

public String convertToLocalDateTime(Date dateFromDB, Integer offSetMins) {
  //1. dbDateInUTC = Convert dateFromDB to UTC
  //2. return offSetMins + dbDateInUTC;
}

我不知道如何才能完成第一步。有什么建议吗?

为了确保用户获得其时区,您可以在客户端执行此操作,为此,您可以使用类似或的库

只需获取服务器的日期,然后将其转换为long:

Date d = // date from server
long milliseconds = d.getTime(); 
发送到客户端并获取偏移量:

时区偏移是UTC和本地时间之间的差,以分钟为单位。请注意,这意味着如果本地时区在UTC之后,则偏移量为正,如果在UTC之前,则偏移量为负。例如,如果您的时区是UTC+10澳大利亚东部标准时间,则将返回-600。夏令时防止此值成为常量,即使对于给定的区域设置也是如此

然后,您只需获得正确的日期1分钟=60.000毫秒:

此外,如果您想按照建议告诉服务器客户端的时区,请获取偏移量并将其发送到java以转换日期:

long offsetMillis = offset * 60000;
Date d = new Date(offsetMillis);

在我的实践中,为了避免复杂性和混乱,最好:

对于应用程序内的操作和持久化日期,请使用UTC时区。 使用本地时区向最终用户显示日期/时间。
因此,服务器端的所有日期/时间以UTC表示,客户端的日期/时间以本地TZ表示。

时间是如何存储在数据库中的?作为时区字段的时间?如何在Java代码中将其检索为什么类型?客户端到底是什么意思?这里的客户端是什么?从DB读取日期后,它将自动转换为服务器本地时间。所以它应该准备好在服务器时区中显示。对于用户,您可以在发送日期之前将时间转换为用户时区,但您需要知道用户时区。您可以检查用户请求是否有该信息可用。如果不可用,则发送您的时间和时区,供用户转换。是Java中处理日期和时间的常用库。。。这里有多种选择。同意,。。。更新答案。。。谢谢@jonOP正在询问Java。为什么要谈论Javascript库?因为客户端?加上一个。如果降低UTC的GMT,效果更好。
var dateInMilliseconds = dateFromServer - (offset * 60000);
long offsetMillis = offset * 60000;
Date d = new Date(offsetMillis);