Java 从数据库时间转换为本地计算机时间时的时间不正确

Java 从数据库时间转换为本地计算机时间时的时间不正确,java,oracle,date,Java,Oracle,Date,在我的Oracle数据库中,日期存储在中央时间。我的本地机器也在中央时间。我正在尝试编写一个Java代码,以便将DB中央时间转换为任何本地机器时区。例如,如果我将本地机器时间更改为东部时间,则DB中的时间将转换为东部时间 下面是一个Java方法,它使用JavaScript从数据库中获取日期,并从用户浏览器中获取分钟偏移量 private String convertDateToLocal(Date createDate, Long offSetMins) { DateFormat for

在我的Oracle数据库中,日期存储在中央时间。我的本地机器也在中央时间。我正在尝试编写一个Java代码,以便将DB中央时间转换为任何本地机器时区。例如,如果我将本地机器时间更改为东部时间,则DB中的时间将转换为东部时间

下面是一个Java方法,它使用JavaScript从数据库中获取日期,并从用户浏览器中获取分钟偏移量

private String convertDateToLocal(Date createDate, Long offSetMins) {
    DateFormat formatter = new SimpleDateFormat("MM/dd/yyyy hh:mm a", Locale.US);
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(createDate);
    Long dbTimeInMilliSec = createDate.getTime();
    Long dbTimeOffSet = (long) (calendar.getTimeZone().getOffset(dbTimeInMilliSec));
    Long dbTimeToUTC = dbTimeInMilliSec + (dbTimeOffSet * -1);
    Long dbTimeToLocal = dbTimeToUTC - (offSetMins * 60 * 1000);
    Date createDateInLocal = new Date(dbTimeToLocal);
    return formatter.format(createDateInLocal);     
}
var offSetMins= new Date().getTimezoneOffset();
var tz = jstz.determine();
var timeZone = tz.name();
//send this timeZone to server
仅供参考,这是我如何使用JavaScript获得偏移分钟数的方法

private String convertDateToLocal(Date createDate, Long offSetMins) {
    DateFormat formatter = new SimpleDateFormat("MM/dd/yyyy hh:mm a", Locale.US);
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(createDate);
    Long dbTimeInMilliSec = createDate.getTime();
    Long dbTimeOffSet = (long) (calendar.getTimeZone().getOffset(dbTimeInMilliSec));
    Long dbTimeToUTC = dbTimeInMilliSec + (dbTimeOffSet * -1);
    Long dbTimeToLocal = dbTimeToUTC - (offSetMins * 60 * 1000);
    Date createDateInLocal = new Date(dbTimeToLocal);
    return formatter.format(createDateInLocal);     
}
var offSetMins= new Date().getTimezoneOffset();
var tz = jstz.determine();
var timeZone = tz.name();
//send this timeZone to server
但问题是,即使我将本地机器设置为中央时间,在没有夏令时的日子里,我也会看到时间提前1小时

DB日期(
11/26/2014 12:03 PM
)在UI中显示为(
11/26/2014 01:03 PM

夏令时的日期可以


DB日期(
05/20/2015 05:08 PM
)在UI中显示为(
05/20/2015 05:08 PM
)。

尝试使用JAVA的时区类

您需要有两个时区对象,一个用于DB时区,另一个用于机器时区,然后您可以进行转换

希望这有帮助

Kaushik

我在前端和后端Java代码中使用它来解决这个问题

JavaScript

private String convertDateToLocal(Date createDate, Long offSetMins) {
    DateFormat formatter = new SimpleDateFormat("MM/dd/yyyy hh:mm a", Locale.US);
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(createDate);
    Long dbTimeInMilliSec = createDate.getTime();
    Long dbTimeOffSet = (long) (calendar.getTimeZone().getOffset(dbTimeInMilliSec));
    Long dbTimeToUTC = dbTimeInMilliSec + (dbTimeOffSet * -1);
    Long dbTimeToLocal = dbTimeToUTC - (offSetMins * 60 * 1000);
    Date createDateInLocal = new Date(dbTimeToLocal);
    return formatter.format(createDateInLocal);     
}
var offSetMins= new Date().getTimezoneOffset();
var tz = jstz.determine();
var timeZone = tz.name();
//send this timeZone to server
Java代码

private String convertDateToLocal(Date createDate, String timeZone) {
    Long dbDate = createDate.getTime();
    DateTimeFormatter fmt = DateTimeFormat.forPattern("MM/dd/yyyy hh:mm a zz");
    DateTime origDate = new DateTime(dbDate);
    DateTime dtTz = origDate.withZone(DateTimeZone.forID(timeZone));
    return dtTz.toString(fmt);
}

Short answe,不要手动执行此操作。数据库使用的时区是什么?可以先编写一个框架代码吗?TimeZone类似乎使用ID如何使用JavaScript从客户端获取此ID?