zoukankan      html  css  js  c++  java
  • 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;

        --时间格式转格林威治时间
          FUNCTION date_to_gmt_time(p_date IN DATE) RETURN VARCHAR2;

    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;

       

        --时间格式转格林威治时间
        FUNCTION date_to_gmt_time(p_date IN DATE) RETURN VARCHAR2 IS
          l_return_str VARCHAR2(50);
        BEGIN
          IF p_date IS NOT NULL THEN
            SELECT to_char(p_date, 'YYYY-MM-DD') || 'T' ||
                 to_char(p_date, 'HH24:MI:SS') || '.000+08:00'
            INTO l_return_str
            FROM dual;
          ELSE
          l_return_str := NULL;
          END IF;

          RETURN l_return_str;

        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

  • 相关阅读:
    MySQLSource-Flume
    Flume
    Hive| ETL清洗& 查询练习
    Hive-04 压缩| 存储
    Hive-03 查询
    Hive-02 DDL| DML
    shell基本用法
    Hive-01 配置| 架构原理
    HDFS-HA高可用 | Yarn-HA
    react-路由和Ant design
  • 原文地址:https://www.cnblogs.com/huanghongbo/p/6030455.html
Copyright © 2011-2022 走看看