在 Java 8 上使用 Nashorn 将 Javascript Date 对象返回给 Java 时,如下所示:

ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("nashorn");
Object js = engine.eval("new Date();");
通过以下尝试,我得到了异常(exception):
  • Date javaDate = (Date)js; jdk.nashorn.api.scripting.ScriptObjectMirror cannot be cast to java.util.Date
  • Date javaDate = js.to(Date.class); Cannot cast jdk.nashorn.internal.objects.NativeDate to java.util.Date
  • 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 吗?
    附注如果我执行 js.toString() 那么它会给我“[Date 2012-01-01T19:00:00.000Z]”。我想我可以正则表达式解析那个......但是为什么-哦-为什么......

    最佳答案

    jdk.nashorn.api.scripting.ScriptObjectMirror 上转换返回的 JavaScript 对象,然后您将能够以“类似 map ”的方式访问其属性。

    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 类” - 您可能会发现定义“覆盖”接口(interface)以更方便的方式访问 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);
    

    关于java - Nashorn NativeDate 转换为 java.util.Date,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25385911/

    10-10 13:43