2016-09-12 3 views
1

Gemäß the Talend docs ist es möglich, die Differenz zwischen zwei Daten mit TalendDate.dateDiffFloor bis Sekunden und Millisekunden zu berechnen.Wie kann ich den Unterschied zwischen zwei Date-Instanzen in Minuten ermitteln?

Die Dokumentation sagt jedoch nicht, wie (oder welcher Formatparameter angegeben werden soll).

Ich muss diesen Wert in Sekunden erhalten, da es in eine tInfiniteLoop Komponente einspeisen wird.

Ich habe mit "mmmm" und "mm" ohne Glück versucht. In diesem Fall bekomme ich den Fehler:

Exception in component tMap_3 
java.lang.RuntimeException: Can't support the dateType: mm ,please try "yyyy" or "MM" 
    at routines.TalendDate.diffDateFloor(TalendDate.java:661) 
    at timeouttester.job_2_0_1.job_2.tInfiniteLoop_2Process(job_2.java:1156) 
    at timeouttester.job_2_0_1.job_2.runJobInTOS(job_2.java:1616) 
    at timeouttester.job_2_0_1.job_2.main(job_2.java:1464) 

Welches Argument muss ich angeben, um Minuten zu erhalten? Und wenn nicht machbar, gibt es vielleicht einen Workaround in "Vanille" Java, wenn es nicht über Talend möglich ist?

Ich bin derzeit mit der folgenden Anweisung in einer tMap Komponente:

TalendDate.diffDateFloor(TalendDate.parseDateInUTC("EEE, d MMM yyyy HH:mm:ss", Var.expires), TalendDate.getCurrentDate(), "mmmm") 
+0

Bitte poste deinen Code, damit wir helfen können. – lsiva

+0

Da es ein Talend-Job ist, gibt es nicht viel Code ... Ich werde in dem, was ich bisher gemacht habe, bearbeiten. – exhuma

+1

Sie können die zwei Daten mit der Java 8-API analysieren und es gibt eine Methode, mit der Sie ein Intervall in Minuten angeben können. –

Antwort

2

Ich habe keine Ahnung über Talend aber wie Sie gesagt haben vanilla ist auch möglich, für Sie: Sie können die Klasse Duration verwenden, die die duration darstellt zwischen zwei Objekten vom Typ Temporal. Eine solche temporale Klasse wäre zum Beispiel Instant, was eine Momentaufnahme auf der Zeitlinie ist. Instant hat große Unterstützung in der API. Sie können einen von Date#toInstant oder von Calendar#toInstant und mehr abrufen.

dieses kleine Beispiel Siehe:

Date dateBefore = new GregorianCalendar(2014, Calendar.FEBRUARY, 11).getTime(); 

Instant before = dateBefore.toInstant(); 
Instant now = Instant.now(); 

Duration duration = Duration.between(before, now); 
System.out.println("Days: " + duration.toDays()); 

jedoch Wenn ich die Klasse nicht alles täuscht Instant sich bis in Millisekunden nur präzise ist. Wenn das nicht genug ist, können Sie eine andere Klasse verwenden, die Temporal implementiert oder Ihre eigene erstellen.

Für Ihre Anwendung, sind Sie wahrscheinlich interessiert:

Duration#toMinutes() 
Duration#toMillis() 

Beachten Sie, dass der Rückgabewert (long) dieser Methoden nach unten abgerundet sind (floor). Also, wenn die real Menge an Minuten, in denen so etwas wie 1.453, toMinutes()1 und toMillis() zurückgibt 1453 zurückgibt.

+0

Hmm ... in Talend habe ich (standardmäßig) nur eine Aussage. Ich könnte jedoch in der Lage sein, eine benutzerdefinierte Java-Komponente einzugeben. wenn es keine One-Statement-Lösung gibt. – exhuma

+0

Musste eine benutzerdefinierte Java-Komponente verwenden. Aber das funktioniert. Für die Nachwelt: Fügen Sie eine "tJavaFlex" -Komponente hinzu und verwenden Sie den obigen Code, um die Zeit zu berechnen, die unterschiedlich sein kann und dann in den Fluss injiziert werden kann. – exhuma

Verwandte Themen