java - Nashorn NativeDate 转换为 java.util.Date

标签 java javascript date nashorn

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

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

通过以下尝试我得到了异常(exception):

  1. 日期 javaDate = (Date)js;

    jdk.nashorn.api.scripting.ScriptObjectMirror 无法转换为 java.util.Date

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

    无法将 jdk.nashorn.internal.objects.NativeDate 转换为 java.util.Date

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

    无法将 jdk.nashorn.internal.objects.NativeDate 转换为 java.util.Date

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

当 NativeDate 返回到 Java 时,我知道如何实际转换它吗?

附言如果我执行 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 类”——您可能会发现定义“overlay”接口(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/

相关文章:

javascript - Backbone JS : When to use fetch and when to use sync?

bash - 有没有办法删除文件中早于特定日期的所有日志条目? ( bash )

javascript - 在 JavaScript 中将字符串解析为日期

asp.net - 处理 HTML 输入类型 ="date"的浏览器特定支持

java - 仅当 Java 中的字符串值不是 UTF-8 时才对其进行编码

java 将小时添加到系统日期并采用 yyyyMMddHHmmss 格式

java - 考虑重新访问上面的条目或在您的配置中定义类型为 'org.springframework.data.redis.core.RedisTemplate' 的 bean

java - 将 Java 作为 Web 应用程序运行

asp.net - 在网站上放置广告的最佳做法是什么?

javascript - 使用 Firebase 的基本动态页面