Scala Rhino,使用scriptableObject包装器返回本机DateTime

Scala Rhino,使用scriptableObject包装器返回本机DateTime,scala,rhino,Scala,Rhino,我已经设法从可编写脚本的对象包装器返回本机DateTime,但是它涉及到包装器对范围和上下文的引用。有没有更好的方法来做到这一点,也许不需要传递这些参考资料? (这是在Scala中使用JodaTime库和Sugar JS实现的) 测试评估 import org.joda.time.DateTime import org.mozilla.javascript._ object RhinoTest { val sugarScript = { val c= Context.enter

我已经设法从可编写脚本的对象包装器返回本机DateTime,但是它涉及到包装器对范围和上下文的引用。有没有更好的方法来做到这一点,也许不需要传递这些参考资料? (这是在Scala中使用JodaTime库和Sugar JS实现的)

测试评估

import org.joda.time.DateTime
import org.mozilla.javascript._

object RhinoTest {

  val sugarScript = {
    val c= Context.enter
    val scope = c.initStandardObjects()
    c.compileString(FileUtil.readAllText("sugar-1.3.7.min.js"), "sugar", 1, null)
  }

  def main(args:Array[String]): Unit = {
    val cx = Context.enter
    val scope = cx.initStandardObjects()
    sugarScript.exec(c1, scope)

    val testDate = new DateTime(2010,10,10, 0, 0)
    val wrapper = Wrapper(Map("date" -> testDate),cx, scope)
    ScriptableObject.putProperty(scope, "map", wrapper)
    println(c1.evaluateString(scope,"Date.create('Tuesday').isBefore(map.date)", "Source", 1, null))
  }
}
还有包装器类

case class Wrapper(map:Map[String,Any], cx:Context, scope:Scriptable) extends ScriptableObject {

  def getClassName() = "Wrapper"

  override def get(name:String, start:Scriptable):Object =
    (map.getOrElse(name, null) match {
      case d:DateTime => {
        val a = List[AnyRef](d.getMillis.asInstanceOf[java.lang.Long]).toArray
        cx.newObject(scope, "Date", a)
      }
      case a => a
    }).asInstanceOf[AnyRef]
}

无法自动将日期转换为NativeDate。您必须自己执行转换

参见类似问题的答案

Rhino默认情况下不会将Java数字和字符串对象转换为 相应的基元类型。相反,它将它们包装到一个特殊的脚本中 对象,其方式与通过 LiveConnect,它只将原始Java值转换为相应的 脚本值。要覆盖此选项,您需要提供一个自定义 WrapHandler(即将推出的Rhino 1.5R4中的WrapFactory)

JavaScript中的java.util.Date和Date对象完全不同 不仅通过API,而且通过内部表示。特别地, 脚本中的日期可以保存NaN值,而java.util.Date不能。对于 由于这些原因,最好由应用程序决定如何 将一个转化为另一个

要考虑的是在脚本运行之前执行转换,避免任何包装:

Object nativeDate = cx.newObject(scope, "Date", new Object[] {new Date().getTime()})
ScriptableObject.putProperty(scope, "date", nativeDate)