日期:2014-05-16  浏览次数:20458 次

Oracle中根据Date型转换成Java对应的long型毫秒数

在Java开发中,很多时候我们为了方便会直接使用long型来保存时间,可以通过System.currentTimeMillis()或者是java.util.Date.getTime()来获取;取值为当前日期时间与1970-01-01相差的毫秒数;

但是在Oracle里面,默认没有直接提供获取当前时间的秒数的相关function,所以要想在SQL里面获得毫秒数,只能自己手动计算下喽,如下:

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') current_date, (sysdate- to_date('1970-01-01','yyyy-mm-dd')) * 86400 current_milli from dual;
CURRENT_DATE??????? CURRENT_MILLI
-------------------?????????????? -------------
2011-03-28 18:42:11???? 1301337731
时区导致的问题: 比如我使用GMT+08 北京时间,所以按照上面的方式从Oracle中计算出来的秒数经Java中转换后的日期会比正常日期大8h;

结合自己系统的时区对SQL语句稍作修改即可:
SQL> select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') current_date,
? 2???????? (sysdate - 8 / 24 - to_date('1970-01-01', 'yyyy-mm-dd')) * 86400000 current_milli
? 3??? from dual;

CURRENT_DATE??????????? ?CURRENT_MILLI
-------------------?????????????? -------------
2011-03-28 18:42:11??? 1301308931
用简单的Java测试代码测试、结果显示完全匹配;Java代码如下:

Date date = new Date(1301337731L);
System.out.println(date);?????????? //2009-08-25 17:33:17??

?

?

?//得到当前日期的秒数
????? Date d=new Date();
????? System.out.println(d.getTime()/1000);?? //d.getTime()得到的是毫秒数? 1301309324
?????
??? //知道毫秒数得到当前日期
????? Date d1=new Date(1301308931*1000l);? //此值为毫秒数
????? System.out.println(sdf.format(d1));??????????? //2011-03-28 18:42:11