2015-10-17 27 views
22

Na podstawie dyskusji converting string representation of unknown date-format to Date in java, chcę użyć funkcji JavaScript Date w moim projekcie App-Engine. Jednak ScriptEngine nie działa w App-Engine. Potrzebuję więc niewielkiej pomocy w konwersji na Rhino. Oto kod ScriptEngine muszę konwertować:Używanie Rhino zamiast ScriptEngine do uruchamiania kodu JavaScript w Javie

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(); 

Poniższa nie pracował

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; 
} 

i już zastąpione "TestScript" z null i "".

+0

Czy zapomniałeś dodać ślad błędu? – Filip

+1

Nie. Wyjąłem to, ponieważ nie miało to znaczenia. Po prostu nie wiem, jak poprawnie napisać kod. Nieistotność wynika z tego, że w zależności od tego, co próbuję, otrzymuję różne błędy lub brak błędów. Ale w końcu nigdy nie zmusiłbym Rhino do osiągnięcia rezultatu. Najwyraźniej ktoś, kto wie, jak działa Rhino, nie będzie miał problemu z tłumaczeniem wersji ScriptEngine na Rhino. – learner

Odpowiedz

0

Należy spróbować najpierw tak i sprawdzić, czy to działa:

private static long parseDateUsingRhino(String dateInUnknownFormat){ 
     Context mozillaJsContext = Context.enter(); 
     Scriptable scope = mozillaJsContext.initStandardObjects(); 
     String script = "var date = new Date().getTime();"; 
     Object result = mozillaJsContext.evaluateString(scope, script, "", 1, null); 
     return Long.valueOf(Context.toString(result)); 
    } 

A według this wszystko co trzeba zrobić to przekazać zmienną dateInUnknownFormat jak tak, nie konkatenacji java ciąg wymagany (w kontekście jest wystarczająco inteligentny, aby prawdopodobnie rozważyć metodę Java zmienne dostępne jako zmienne globalne w zakresie javaScript):

String script = "var date = new Date(dateInUnknownFormat).getTime();";

+0

Mam podobny problem i dlatego staram się zastosować twoje rozwiązanie i otrzymuję 'java.lang.NumberFormatException: dla ciągu wejściowego:" undefined "'. I to z twoim dokładnym blokiem kodu, który ma "var date = new Date(). GetTime();" ' –

+0

czy przetestowałeś ten kod przed opublikowaniem? To nie działa. – learner

1

w skrypcie, który jest wykonywany przez th Silnik JavaScript, wystarczy obliczyć wartość, którą chcesz, używając new Date(dateString).getTime() (możesz również użyć "var date = new Date(dateString); date.getTime()";). Nie powinieneś przechowywać wyniku wewnątrz zmiennej.

Ja również dwa dodatki do swojej metoda:

  • do konwersji wynik oceny do String, należy użyć Context.toString(obj). Ponieważ tutaj wynik jest w rzeczywistości liczbą, możemy użyć bezpośrednio Context.toNumber(obj), która zwraca wartość double i przesyła ją do long.
  • Dodałem blok finally, który wychodzi z Context.

kod robocza:

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(); 
    } 
} 

Próbka:

System.out.println(parseDateUsingRhino("2015-10-25T15:06:42.000Z")); // prints 1445785602000 

marginesie: ten został przetestowany z Rhino 1.7.7.