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);
}
};
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
2015/11/25追記 Java 7 及以前用的 ScriptEngine Rhino會因此碰到 Exception
應該是 Bug,不過 Java 7 已經 EOL 了,所以也沒指望能修復
最後還是建議只在 Java 8 後的版本用上述 code
留言
張貼留言