我已经设法从可编写脚本的对象包装器返回Native DateTime,但它涉及包含范围和上下文的包装器。有没有更好的方法,这可能不涉及必须通过这些参考? (这是使用JodaTime库和Sugar JS在Scala中实现的)
测试评估
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]
}
答案 0 :(得分:0)
无法自动将Date
转换为NativeDate
。您必须自己执行转换。
查看类似问题的答案here
Rhino默认情况下不会将Java Number和String对象转换为 相应的原始类型。相反,它将它们包装到一个特殊的脚本中 对象的方式与将任何其他JavaObject公开给脚本的方式相同 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)