在我的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
)。
答案 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类。
您需要为数据库时区提供两个时区对象,为计算机时区提供第二个时区对象,然后才能进行转换。
希望这会有所帮助
考希克