¿Cuál es la forma estándar de trabajar con fechas y horas en Scala? ¿Debo usar tipos Java o hay alternativas nativas de Scala?

161

¿Cuál es la forma estándar de trabajar con fechas y horas en Scala? ¿Debo usar tipos de Java como java.util.Date o hay alternativas nativas de Scala?

Ivan
fuente

Respuestas:

129

Desde Java SE 8 en adelante, se solicita a los usuarios que migren a java.time (JSR-310). Hay esfuerzos para crear bibliotecas scala que envuelvan java.time para scala, como scala-time . Si la orientación es inferior a SE 8, utilice uno de los siguientes. Vea también por qué JSR-310 no es Joda-Time


Un nuevo contenedor Scala para Joda Time . Este proyecto se bifurcó desde el tiempo de escala ya que parece que el tiempo de escala ya no se mantiene.

import com.github.nscala_time.time.Imports._

DateTime.now // returns org.joda.time.DateTime = 2009-04-27T13:25:42.659-07:00

DateTime.now.hour(2).minute(45).second(10) // returns org.joda.time.DateTime = 2009-04-27T02:45:10.313-07:00

DateTime.now + 2.months // returns org.joda.time.DateTime = 2009-06-27T13:25:59.195-07:00

DateTime.nextMonth < DateTime.now + 2.months // returns Boolean = true

DateTime.now to DateTime.tomorrow  // return org.joda.time.Interval = > 2009-04-27T13:47:14.840/2009-04-28T13:47:14.840

(DateTime.now to DateTime.nextSecond).millis // returns Long = 1000

2.hours + 45.minutes + 10.seconds
// returns com.github.nscala_time.time.DurationBuilder
// (can be used as a Duration or as a Period)

(2.hours + 45.minutes + 10.seconds).millis
// returns Long = 9910000

2.months + 3.days
// returns Period

Joda Time es una buena biblioteca Java, hay una biblioteca Scala wrapper / conversión implícita disponible para Joda Time en tiempo scala creada por Jorge Ortiz . (Tenga en cuenta que las implicaciones tienen un impacto en el rendimiento, pero depende de lo que haga si lo nota. Y si se encuentra con un problema de rendimiento, puede volver a la interfaz de Joda)

Desde el archivo Léame:

USAGE:
  import org.scala_tools.time.Imports._

  DateTime.now
  // returns org.joda.time.DateTime = 2009-04-27T13:25:42.659-07:00

  DateTime.now.hour(2).minute(45).second(10)
  // returns org.joda.time.DateTime = 2009-04-27T02:45:10.313-07:00

  DateTime.now + 2.months
  // returns org.joda.time.DateTime = 2009-06-27T13:25:59.195-07:00

  DateTime.nextMonth < DateTime.now + 2.months
  // returns Boolean = true
  DateTime.now to DateTime.tomorrow
  // return org.joda.time.Interval =
  //   2009-04-27T13:47:14.840/2009-04-28T13:47:14.840

  (DateTime.now to DateTime.nextSecond).millis
  // returns Long = 1000

  2.hours + 45.minutes + 10.seconds
  // returns org.scala_tools.time.DurationBuilder
  // (can be used as a Duration or as a Period)

  (2.hours + 45.minutes + 10.seconds).millis
  // returns Long = 9910000 

  2.months + 3.days
  // returns Period
oluies
fuente
44
Video scalaj: Idiomatic Scala Wrappers para bibliotecas Java days2010.scala-lang.org/node/138/164
oluies
Gracias, no sé sobre este envoltorio.
Vadim Shender
No puedo obtener una salida formateada de esto. Si uso DateTime.formatted ("aaaaMMdd") simplemente obtengo "aaaaMMdd" (letras no reemplazadas con los números correspondientes) como respuesta. Si uso DateTime.formatted (DateTimeFormat.forPattern ("aaaaMMdd")) aparece un error al solicitar un argumento de cadena.
Ivan
1
Como parece que el tiempo de escala ya no se mantiene, ha sido reemplazado por el tiempo de escala (que, en contraste con el tiempo de escala, funciona con la escala 2.10). Se puede encontrar en github.com/nscala-time/nscala-time .
Sebastian Ganslandt
1
No puedo resolver el problema con su Importsy scala.concurrent.duration._. En su lugar, usé JodaTime simple y escribí bicicletas propias sobre él.
kisileno
12

Si está utilizando Java 8, entonces ya no es necesario usarlo nscala. La biblioteca Joda-Time se ha movido a Java 8 bajo el java.timepaquete (JSR-310). Simplemente importe ese paquete a su proyecto Scala.


fuente
1
Eso no es verdad. ¡El código de tiempo de Joda debe migrarse / ajustarse al cambiar a Java-8 => dos API diferentes!
Meno Hochschild
7

No hay una forma estándar de trabajar con fechas en Scala. Las opciones disponibles son:

  1. Use java.time (si está utilizando Java 8) ya que tiene el mejor tiempo JODA incorporado. Sin implicidades.
  2. Use nscala-time.
  3. Biblioteca de fechas Lamma (biblioteca relativamente nueva en la escena)

Evitaría usar java.util.Date debido a los problemas bien documentados que lo rodean.

MK
fuente
5

MOTIVACIÓN:

Las bibliotecas Java Date y Calendar son en gran medida inadecuadas. Son mutables, no aptos para subprocesos y muy inconvenientes de usar.

La biblioteca Joda Time es un gran reemplazo para las clases de fecha y calendario de Java. Son inmutables por defecto, tienen una API mucho más rica y agradable, y se pueden convertir fácilmente a las clases de fecha y calendario de Java cuando sea necesario.

Este proyecto proporciona una capa delgada de conveniencia alrededor de las bibliotecas de Joda Time, haciéndolas más idiomáticas para usar dentro de Scala.

(copiado de https://github.com/jorgeortiz85/scala-time )

Pavel Sklenak
fuente
3

Todos usan JodaTime, estas bibliotecas de ayuda / envoltura de Scala pueden necesitar una nueva compilación con nuevas versiones de Scala. Jodatime es la única biblioteca de tiempo que existe desde hace mucho tiempo, es estable y funciona de manera confiable con todas las versiones de Scala.

irishjava
fuente