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

时间:2015-05-20 23:01:12

标签: java oracle date

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

这是一种Java方法,它使用JavaScript从用户浏览器中获取DB和偏移分钟的日期

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);     
}

仅供参考,这是我使用JavaScript

获取偏移分钟的方式
var offSetMins= new Date().getTimezoneOffset();

但问题是,即使我将本地机器安装到中部时间,我也会提前1小时看到没有夏令时的日子。

数据库日期(11/26/2014 12:03 PM)在用户界面中显示为(11/26/2014 01:03 PM)。

夏令时的日期没问题。

数据库日期(05/20/2015 05:08 PM)在用户界面中显示为(05/20/2015 05:08 PM)。

2 个答案:

答案 0 :(得分:1)

我在前端使用了jsTimezoneDetect,在后端Java代码中使用了Joda-Time来解决这个问题。

的JavaScript

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);
}

答案 1 :(得分:-1)

尝试使用JAVA的Timezone类。

您需要为数据库时区提供两个时区对象,为计算机时区提供第二个时区对象,然后才能进行转换。

希望这会有所帮助

考希克