java中从1970-1-1到当前时间之间的毫秒数转换为oracle date

java中System.currentTimeMillis()取到的是从1970-01-01 00:00:00.000到当前时间的毫秒数,一个long类型的值。

现在oracle数据库中某表中存取的是该值,需要将其转换为可读的date类型。

current millis 中提供了TimeMillis的转换结果以及一些常用的转换方法。

但是其中关于pl/sql取得的数是精确到千毫秒,而不是精确到毫秒。

整理了一个包来进行currentTimeMillis到date的转换。

注意:System.currentTimeMillis()取得的是当前时区的时间,所以在转换的时候需要注意时区的转换。

select sessiontimezone,dbtimezone,sysdate,current_date from dual;
CREATE OR REPLACE PACKAGE cux_time_utils_pkg IS

    FUNCTION unix_timestamp_to_utc_date(in_unix_timestamp IN NUMBER) RETURN DATE DETERMINISTIC;

    FUNCTION unix_timestamp_to_session_date(in_unix_timestamp IN NUMBER) RETURN DATE DETERMINISTIC;

    FUNCTION date_to_unix_timesecond(in_date IN DATE) RETURN NUMBER DETERMINISTIC;

    FUNCTION date_to_unix_times_millis(in_date IN DATE) RETURN NUMBER DETERMINISTIC;

    FUNCTION java_currenttimemillis RETURN NUMBER;

    FUNCTION current_unix_times_millis RETURN NUMBER DETERMINISTIC;
END; 
CREATE OR REPLACE PACKAGE BODY cux_time_utils_pkg IS

    --return utc0 date
    --返回0时区时间
    FUNCTION unix_timestamp_to_utc_date(in_unix_timestamp IN NUMBER) RETURN DATE DETERMINISTIC IS
        v_date DATE;
    BEGIN
        v_date := to_date(‘1970-01-01‘,
                          ‘yyyy-mm-dd‘) + in_unix_timestamp / 1000 / 60 / 60 / 24;
        RETURN v_date;
    END;

    --return sessiontimezone date
    --返回当前回话时区时间
    --select sessiontimezone,dbtimezone,sysdate,current_date from dual;
    FUNCTION unix_timestamp_to_session_date(in_unix_timestamp IN NUMBER) RETURN DATE DETERMINISTIC IS
        v_date DATE;
    BEGIN
        v_date := to_date(‘1970-01-01‘,
                          ‘yyyy-mm-dd‘) + in_unix_timestamp / 1000 / 60 / 60 / 24 +
                  to_number(substr(tz_offset(sessiontimezone),
                                   1,
                                   3)) / 24;
        RETURN v_date;
    END;

    --返回1970-01-01 00:00:00到in_date之间的秒数
    FUNCTION date_to_unix_timesecond(in_date IN DATE) RETURN NUMBER DETERMINISTIC IS
        v_unix_timestamp NUMBER;
    BEGIN
        v_unix_timestamp := (in_date - to_date(‘1970-01-01‘,
                                               ‘yyyy-mm-dd‘)) * 60 * 60 * 24;
        RETURN v_unix_timestamp;
    END;

    --返回1970-01-01 00:00:00到in_date之间的毫秒数
    --此方法不够精确,因为in_date精度为秒,所以返回值的精度为千毫秒
    --可调整入参结构为timestamp,再进行优化
    FUNCTION date_to_unix_times_millis(in_date IN DATE) RETURN NUMBER DETERMINISTIC IS
        v_unix_timestamp NUMBER;
    BEGIN
        v_unix_timestamp := (in_date - to_date(‘1970-01-01‘,
                                               ‘yyyy-mm-dd‘)) * 1000 * 60 * 60 * 24;
        RETURN v_unix_timestamp;
    END;

    --返回java的当前毫秒数
    FUNCTION java_currenttimemillis RETURN NUMBER AS
        LANGUAGE JAVA NAME ‘java.lang.System.currentTimeMillis() return java.lang.Integer‘;

    --返回当前时间的毫秒数
    FUNCTION current_unix_times_millis RETURN NUMBER DETERMINISTIC IS
        v_unix_timestamp NUMBER;
    BEGIN
        v_unix_timestamp := extract(DAY FROM(systimestamp - to_timestamp(‘1970-01-01‘,
                                                                     ‘YYYY-MM-DD‘))) * 1000 * 60 * 60 * 24 +
                            to_number(to_char(sys_extract_utc(systimestamp),
                                              ‘SSSSSFF3‘));
        RETURN v_unix_timestamp;
    END;

END;

参考:

https://currentmillis.com/

http://stackoverflow.com/questions/2824710/oracle-equaivalent-of-java-system-currenttimemillis

http://stackoverflow.com/questions/4312514/get-date-from-a-long-var-char-milliseconds-value-stored-in-oracle-database

http://developer-should-know.com/post/77394226827/converting-between-milliseconds-and-dates-in

时间: 2024-10-11 16:22:38

java中从1970-1-1到当前时间之间的毫秒数转换为oracle date的相关文章

Oracle中,将毫秒数转换为timestamp类型的两种方法

在许多场景中,开发人员习惯用1970-01-01 00:00:00.000以来的毫秒数来表示具体的时间,这样可以将数据以NUMBER类型存储到数据库中,在某些时候方便比较,同样,有些时候我们需要 把这种毫秒数转换成标准的TIMESTAMP类型,现在总结了两种实现方法: 方法一: SELECT TO_TIMESTAMP('1970-01-01 00:00:00.000','yyyy-MM-dd hh24:mi:ss.ff3')+1397457489296/1000/60/60/24 FROM du

Java中关于Json对象类型和字符串类型之间互相转化的问题

Java中关于Json格式转化Object,Map,Collection类型和String类型之间的转化在我们实际项目中应用的很是普遍和广泛.最近工作的过程中也是经常有,因此,自己封装了一个JsonUtil.java类. 所需要的jar包:slf4j-jdk14-1.5.6.jar,slf4j-api-1.5.6.jar------>此两个jar包是slf4j日志jar包 jackson-annotations-2.1.1.jar,jackson-core-2.1.1.jar,jackson-d

java中的、标识符、运算符以及数据类型之间的转换。

---恢复内容开始--- 数据类型之间的转换: 1:自动转换:就是不用说出要转换成什么类型,由java中的虚拟机自动将小数据类型转换成大数据类型,但大数据中的数据精度有可能被破坏. 2:强制转换:强制转换的格式是在需要转型的数据前加上"( )",然后在括号内加入需要转化的数据类型.有的数据经过转型运算后,精度会丢失,而有的会更加精确. 例子: public class Demo { public static void main(String[] args){ int x; doubl

Java中SSM框架全面知识点,业务时间的精神食粮

------------------异常问题 :出现重复定义了访问路径java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'userController' bean method 406 请求头和响应头不匹配做ajax注册的时候 出现的问题 ClassNotFindException说明缺少jar包 或者名字写错 NoSuchBeanDefinitionException 如果BeanFactory在Sprin

java中如何按一定的格式输出时间, 必须给出例子

题目2: 按一定的格式输出时间 (视频下载) (全部书籍) 本章源码 import java.util.*;import java.text.SimpleDateFormat;public class Test {    public static void main(String[] args) {        Date date = new Date();//获取当前日期        SimpleDateFormat df = new SimpleDateFormat("yyyy-MMM

Java中Calendar类的常用方法(对时间进行计算的类)

例子: /**** * 传入具体日期 ,返回具体日期增加一个月. * @param date 日期(2017-04-13) * @return 2017-05-13 * @throws ParseException */ private String subMonth(String date) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date dt = sdf.

Java中的日期操作

Date : getTime() .setTime() SimpleDateFormate :   Formate(Date). parse(String s) Calendar : getInstance().set() .get().getActualMaximum().add().  gettime().setTime(Date). 字符串.Date.Calendar之间的转换 ---------------------------------------淫荡分隔-------------

Java中的时间和日期(上)

自从JDK 1.0开始,Java就提供了Date来处理时间和日期,作为老古董自然有很多东西是过时的.然后出现了Calendar来解决了很多问题,但是Calendar使用比较复杂,并且有些反人类的地方.直到Java 8的出现,它吸收了Joda-Time库的经验,使得Java处理时间和日期变得比较"人性化"了.本篇就来谈谈Java中的Date.Calendar,以及SimpleDateFormat的使用.下一篇再对比一下Java 8中的日期处理. 古老的Date 查看一下Date类的源码,

Java中的日期和时间

以下内容引用自http://wiki.jikexueyuan.com/project/java/date-time.html: Java在java.util包中提供了Date类,这个类封装了当前的日期和时间. Date类支持两种构造函数.第一个构造函数初始化对象的当前日期和时间. Date() 下面的构造函数接收一个参数等于自1970年1月1日午夜起已经过的毫秒数 Date(long millisec) 一旦有一个可用的日期对象,可以调用以下任何一种支持的方法使用时间: 方法 描述 boolea