跳到主要內容

Java JavaScriptEngine Nashorn 設定 Date Instance 預設時間

Java 的 JavaScriptEngine 的時間會依照 Java 程式所在的環境時間、設定的時區為準
所以執行 JavaScript code 的 new Date(),取得的時間也會跟環境時間相同
我這次的需求是希望 new Date 取得的時間是客戶瀏覽器端的時間,而不是Server本地時間
讓運算結果更貼近客戶用瀏覽器取得的結果

查過了 ScriptEngine 的 Source code,他並沒有公開的方法可以設定 Instance 的時間
底層的 native date 型別的時間其實是使用 Java 的 System.currentTimeMillis();
似乎是沒有插手的空間了?

不過好在 JavaScript 的特色就是彈性大
手動 override 掉 Date function 也可以解決

var timeMilliseconds = 1447739048291;  // millisecond is passed from client side.
var d = new Date(timeMilliseconds),
     _ODATE = Date;

Date = function (a1, a2, a3, a4, a5, a6, a7) {
    if (arguments.length === 0) {
        return d;
    } else if (arguments.length === 1) {
        return new _ODATE(a1);
    } else {
        a3 = a3 || 0;
        a4 = a4 || 0;
        a5 = a5 || 0;
        a6 = a6 || 0;
        a7 = a7 || 0;
        return new _ODATE(a1, a2, a3, a4, a5, a6, a7);
    }
};

不指定時間的 Date constructor 就直接回傳已經建立好的客戶端時間
如果有指定時間就跑原本的 Date constructor
比原先預期還要容易些的解法

2015/11/25追記 Java 7 及以前用的 ScriptEngine Rhino會因此碰到 Exception
應該是 Bug,不過 Java 7 已經 EOL 了,所以也沒指望能修復
最後還是建議只在 Java 8 後的版本用上述 code

留言