Qual è il modo standard di lavorare con date e orari in Scala? Dovrei usare i tipi Java o ci sono alternative alla Scala nativa?


161

Qual è il modo standard di lavorare con date e orari in Scala? Dovrei usare tipi Java come java.util.Date o ci sono alternative Scala native?

Risposte:


129

Da Java SE 8 in poi, agli utenti viene chiesto di migrare su java.time (JSR-310). Ci sono sforzi per creare librerie scala che includono java.time per scala come scala-time . Se il targeting è inferiore a SE 8, utilizza uno dei seguenti. Vedi anche Perché JSR-310 non è Joda-Time


Un nuovo involucro Scala per Joda Time . Questo progetto è stato biforcuto dallo scala-tempo poiché sembra che lo scala-tempo non sia più mantenuto.

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 è una buona libreria Java, esiste una libreria wrapper Scala / conversione implicita disponibile per Joda Time nello scala-time creato da Jorge Ortiz . (Nota che gli impliciti hanno un impatto sulle prestazioni, ma dipende da cosa fai se noterai. E se incontri un problema di prestazioni puoi semplicemente tornare all'interfaccia di Joda)

Dal README:

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

4
Video scalaj: Idiomatic Scala Wrappers for Java Libraries days2010.scala-lang.org/node/138/164
oluies

Grazie, non so di questo wrapper.
Vadim Shender,

Non riesco a ottenere un output formattato da questo. Se uso DateTime.formatted ("yyyyMMdd") ricevo semplicemente "yyyyMMdd" (lettere non sostituite con numeri corrispondenti) come risposta. Se uso DateTime.formatted (DateTimeFormat.forPattern ("yyyyMMdd")) - Viene visualizzato un errore che richiede un argomento stringa.
Ivan

1
Poiché sembra che lo scala-tempo non sia più mantenuto, è stato sostituito da nscala-time (che a differenza dello scala-time funziona con la scala 2.10). Può essere trovato su github.com/nscala-time/nscala-time .
Sebastian Ganslandt,

1
Non riesco a capire il problema con loro Importse scala.concurrent.duration._. Ha usato invece JodaTime semplice e ci ha scritto sopra le biciclette.
kisileno,

12

Se si utilizza Java 8, non è più necessario utilizzarlo nscala. La libreria Joda-Time è stata spostata in Java 8 sotto il java.timepacchetto (JSR-310). Importa semplicemente quel pacchetto nel tuo progetto Scala.


1
Quello non è vero. Il Joda-Time-code deve essere migrato / modificato quando si passa a Java-8 => due diverse API!
Meno Hochschild,

7

Non esiste un modo standard di lavorare con le date in Scala. Le opzioni disponibili sono:

  1. Usa java.time (se stai usando Java 8) poiché ha il meglio del tempo JODA integrato. Nessun implicito
  2. Usa nscala-time.
  3. Libreria di date Lamma (libreria relativamente nuova sulla scena)

Eviterei di usare java.util.Date a causa dei problemi ben documentati che lo circondano.


5

MOTIVAZIONE:

Le librerie Java Date e Calendar sono in gran parte inadeguate. Sono mutabili, non thread-safe e molto scomodi da usare.

La libreria Joda Time è un ottimo sostituto delle classi Date e Calendar di Java. Sono immutabili per impostazione predefinita, hanno un'API molto più ricca e più piacevole e, se necessario, possono essere facilmente convertiti nelle classi Date e Calendar di Java.

Questo progetto fornisce un sottile livello di praticità attorno alle librerie Joda Time, rendendole più idiomatiche da usare all'interno di Scala.

(copiato da https://github.com/jorgeortiz85/scala-time )


3

Tutti usano JodaTime, queste librerie helper / wrapper Scala potrebbero aver bisogno di essere ricompilate con le nuove versioni di Scala. Jodatime è l'unica libreria temporale che esiste da molto tempo, è stabile e funziona in modo affidabile con ogni versione di Scala.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.