2015-10-17 14 views
22

Tartışma converting string representation of unknown date-format to Date in java dayanarak, App-Engine projemde JavaScript Date işlevini kullanmak istiyorum. Ancak, ScriptEngine App Engine'de çalışmaz. Bu yüzden Rhino'ya dönüştürme konusunda biraz yardıma ihtiyacım var.Java'da Javascript kodunu çalıştırmak için ScriptEngine yerine Rhino kullanma

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

aşağıdaki

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

çalışmadığı anlamına gelir ve zaten null ve "" ile "TestScript" yerini almıştır: İşte dönüştürmek gerekir ScriptEngine kodudur.

+0

Hata izini eklemeyi unuttun mu? – Filip

+1

Hayır. Anladım çünkü ilgisizdi. Sadece kodu doğru yazmayı bilmiyorum. Gereksizliği, denediğim şeye bağlı olarak farklı hatalar veya hatalar almamdan kaynaklanıyor. Ama sonuçta, Rhino'nun bir sonuç üretmesini asla başaramıyorum. Açıkçası Rhino'nun nasıl çalıştığını bilen biri, ScriptEngine versiyonunu Rhino'ya çevirmekte zorlanmayacaktır. – learner

cevap

0

Böyle ilk denemek ve görmek eğer çalışırsa olmalıdır:

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

Ve this göre bir sonraki do gereken, gerekli hiçbir java dize birleştirme (bağlamda şöyle dateInUnknownFormat değişken geçmek) muhtemelen javaScript kapsamında küresel değişkenler olarak java yöntemin erişilebilir değişkenleri dikkate kadar akıllıdır: th tarafından yürütülür komut dosyasında

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

+0

Benzer bir sorun yaşıyorum ve bu yüzden ben senin çözümünü denemeye çalışıyorum ve ben java.lang.NumberFormatException aldım: Giriş dizesi için: "undefined" '. Ve bu, "var date = new Date(). GetTime();" ' –

+0

, bu kodu göndermeden önce sınadınız mı? İşe yaramıyor. – learner

1

e JavaScript motoru, sadece new Date(dateString).getTime() ("var date = new Date(dateString); date.getTime()"; kullanabilirsiniz) kullanarak istediğiniz değeri hesaplamak gerekir. Sonucu bir değişken içinde saklamamalısınız.

  • Eğer Context.toString(obj) kullanmanız gereken bir String değerlendirmenin sonucunu dönüştürmek için:

    Ben de senin yöntemine iki katkılarda. Bu yana, sonuç aslında bir sayıdır, bir double döndüren ve long'a dönüştüren doğrudan Context.toNumber(obj) kullanabiliriz.
  • Context'dan çıkan bir finally bloğunu ekledim.

Çalışma kodu:

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

Örnek:

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

Yan not: bu Rhino 1.7.7 ile test edilmiştir.

İlgili konular