簡體   English   中英

Nashorn NativeDate轉換為java.util.Date

[英]Nashorn NativeDate conversion to java.util.Date

在Java 8上使用Nashorn將Javascript Date對象返回到Java時,如下所示:

ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("nashorn");
Object js = engine.eval("new Date();");

通過以下嘗試,我獲得了例外:

  1. Date javaDate = (Date)js;

    jdk.nashorn.api.scripting.ScriptObjectMirror cannot be cast to java.util.Date

  2. Date javaDate = js.to(Date.class);

    Cannot cast jdk.nashorn.internal.objects.NativeDate to java.util.Date

  3. Date javaDate = (Date)ScriptUtils.convert(js.to(NativeDate.class), Date.class);

    Cannot cast jdk.nashorn.internal.objects.NativeDate to java.util.Date

回到Rhino我只是使用了context.jsToJava(nativeDateObj, Date.class);

有什么想法,當它返回Java時,我如何實際構建這個NativeDate?

PS如果我執行js.toString(),那么它會給我“[Date 2012-01-01T19:00:00.000Z]”。 我想我可以正則表達解析...但為什么 - 哦 - 為什么......

jdk.nashorn.api.scripting.ScriptObjectMirrorjdk.nashorn.api.scripting.ScriptObjectMirror返回的JavaScript對象,然后您將能夠以“類似地圖”的方式訪問其屬性。

ScriptObjectMirror jsDate = (ScriptObjectMirror) engine.eval("new Date();")
long timestampLocalTime = (long) (double) jsDate.callMember("getTime"); 
// yes, js date returns timestamp in local time so you need to adjust it... ;)
int timezoneOffsetMinutes = (int) (double) jsDate.callMember("getTimezoneOffset");
// java.util.Date construcctor utilizes UTC timestamp
Date jDate = new Date(timestampLocalTime + timezoneOffsetMinutes * 60 * 1000);

另見: http//cr.openjdk.java.net/~sundar/jdk.nashorn.api/8u20/javadoc/jdk/nashorn/api/scripting/ScriptObjectMirror.html

但是,如果您要在Java端經常使用某些“JavaScript類” - 您可能會發現定義“overlay”接口以更方便的方式訪問javascript對象的方法很有用。 請參閱以下示例:

public interface JsDateWrapper {
    long getTime();
    int getTimezoneOffset();
    // ...
}

Object jso = engine.eval("new Date();");
JsDateWrap jsDate = ((Invocable) engine).getInterface(jso, JsDateWrapper.class);
Date jDate = new Date(jsDate.getTime() + jsDate.getTimezoneOffset() * 60 * 1000);

同樣的問題,解決了:

ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("nashorn");
Object js = engine.eval("new java.util.Date();");

我在我的項目中這樣做:

retValue = new Date(value.to(Long.class));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM