Based on the discussion converting string representation of unknown date-format to Date in java, I want to use the JavaScript Date function in my App-Engine project. However, ScriptEngine does not work on App-Engine. So I need a little help converting to Rhino. Here is the ScriptEngine code I need to convert:
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine engine = scriptEngineManager.getEngineByName("JavaScript");
String script = "var date = new Date('" + dateInUnknownFormat + "'); var timestamp = date.getTime();";
engine.eval(script);
long timestamp = ((Double) engine.get("timestamp")).longValue();
The following has not worked
private static long parseDateUsingRhino(String dateInUnknownFormat){
Context mozillaJsContext = Context.enter();
Scriptable scope = mozillaJsContext.initStandardObjects();
String script = "var date = new Date('" + dateInUnknownFormat + "'); var timestamp = date.getTime();";
Object obj = mozillaJsContext.evaluateString( scope, script, "TestScript", 1, null );
Double timeDouble = Double.parseDouble((String) obj);
long timestamp = timeDouble.longValue();
return timestamp;
}
and I have already replaced "TestScript" with null and "".
解决方案
In the script that is executed by the JavaScript engine, you just need to calculate the value you want using new Date(dateString).getTime() (you could also use "var date = new Date(dateString); date.getTime()";). You should not store the result inside a variable.
I also made two additions to your method:
To convert the result of the evaluation to a String, you should use Context.toString(obj). Since here, the result is actually a number, we can use directly Context.toNumber(obj), which returns a double, and cast it to long.
I added a finally block which exits from the Context.
Working code:
private static long parseDateUsingRhino(String dateInUnknownFormat) {
Context mozillaJsContext = Context.enter();
try {
Scriptable scope = mozillaJsContext.initStandardObjects();
String script = "new Date('" + dateInUnknownFormat + "').getTime()";
Object obj = mozillaJsContext.evaluateString(scope, script, "TestScript", 1, null);
return (long) Context.toNumber(obj);
} finally {
Context.exit();
}
}
Sample:
System.out.println(parseDateUsingRhino("2015-10-25T15:06:42.000Z")); // prints 1445785602000
Side note: this was tested with Rhino 1.7.7.