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