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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM