2010-11-25 38 views
6

Soy relativamente nuevo en scala y jodatime, pero he quedado bastante impresionado con ambos. Estoy tratando de averiguar si hay una forma más elegante de hacer aritmética de fechas. Aquí hay un método:restando un DateTime de un DateTime en scala


private def calcDuration() : String = { 
    val p = new Period(calcCloseTime.toInstant.getMillis - calcOpenTime.toInstant.getMillis) 
    val s : String = p.getHours.toString + ":" + p.getMinutes.toString + 
     ":" + p.getSeconds.toString 
    return s 
} 

me Convertir todo a una cadena porque me lo ponga en un MongoDB y no estoy seguro de cómo serializar una joda Duración o período. Si alguien sabe que realmente agradecería la respuesta.

De todos modos, los métodos calcCloseTime y calcOpenTime devuelven objetos DateTime. Convertirlos a Instantes es la mejor manera que encontré para obtener la diferencia. ¿Hay una mejor manera?

Otra pregunta secundaria: cuando las horas, los minutos o los segundos son de un solo dígito, la cadena resultante no se llena en cero. ¿Hay una manera directa de hacer que esa cadena se vea como HH: MM: SS?

Gracias, John

Respuesta

8

Period formateo se realiza mediante la clase PeriodFormatter. Puede usar uno predeterminado o construir el suyo usando PeriodFormatterBuilder.Se puede tomar algo más de código que le gustaría establecer este constructor correctamente, pero se puede utilizar, por ejemplo, así:


scala> import org.joda.time._ 
import org.joda.time._ 

scala> import org.joda.time.format._ 
import org.joda.time.format._ 

scala> val d1 = new DateTime(2010,1,1,10,5,1,0) 
d1: org.joda.time.DateTime = 2010-01-01T10:05:01.000+01:00 

scala> val d2 = new DateTime(2010,1,1,13,7,2,0) 
d2: org.joda.time.DateTime = 2010-01-01T13:07:02.000+01:00 

scala> val p = new Period(d1, d2) 
p: org.joda.time.Period = PT3H2M1S 

scala> val hms = new PeriodFormatterBuilder() minimumPrintedDigits(2) printZeroAlways() appendHours() appendSeparator(":") appendMinutes() appendSuffix(":") appendSeconds() toFormatter 
hms: org.joda.time.format.PeriodFormatter = [email protected] 

scala> hms print p 
res0: java.lang.String = 03:02:01 

tal vez debería también tener en cuenta que las transiciones de día no se tienen en cuenta:


scala> val p2 = new Period(new LocalDate(2010,1,1), new LocalDate(2010,1,2)) 
p2: org.joda.time.Period = P1D 

scala> hms print p2               
res1: java.lang.String = 00:00:00 

así que si usted necesita tenerlas también, también debería agregar los campos requeridos (días, semanas, años quizás) al formateador.

+0

Funciona muy bien, pero necesita paréntesis al final de toFormatter: '... appendSeconds() toFormatter()' –

1

Hace this link ayuda?

¿Cómo calculo la diferencia entre dos fechas?

¡Esta pregunta tiene más de una respuesta! Si solo desea el número de días completos entre dos fechas, puede usar la nueva clase Días en la versión 1.4 de Joda-Time.

Days d = Days.daysBetween(startDate, endDate); 
int days = d.getDays(); 

Este método, y otros métodos estáticos en la clase días han sido diseñados para funcionar bien con la instalación de importación estática JDK5.

Sin embargo, si desea calcular el número de días, semanas, meses y años entre las dos fechas, necesita un Período Por defecto, dividirá la diferencia entre las dos fechas en partes, como "1 mes , 2 semanas, 4 días y 7 horas ".

Period p = new Period(startDate, endDate); 

Puede controlar qué campos se extraen utilizando un PeriodType.

Period p = new Period(startDate, endDate, PeriodType.yearMonthDay()); 

Este ejemplo no devolverá ningún campo de semanas o tiempo, por lo que el ejemplo anterior se convierte en "1 mes y 18 días".

+0

He estado allí y fue útil. Gracias ... – jxstanford

7

Es posible que desee echar un vistazo a la envoltura de Jorge Ortiz por Joda-Time, scala-time algo que es un poco más agradable para trabajar en Scala.

A continuación, debería ser capaz de usar algo como

(calcOpenTime to calcCloseTime).millis 
+0

Gracias Jon, revisaré el envoltorio. – jxstanford