Quelle est la manière standard de travailler avec des dates et des heures dans Scala? Dois-je utiliser des types Java ou il existe des alternatives Scala natives?

161

Quelle est la manière standard de travailler avec des dates et des heures dans Scala? Dois-je utiliser des types Java tels que java.util.Date ou il existe des alternatives Scala natives?

Ivan
la source

Réponses:

129

À partir de Java SE 8, les utilisateurs sont invités à migrer vers java.time (JSR-310). Il y a des efforts sur la création de bibliothèques scala enveloppant java.time pour scala, comme scala-time . Si le ciblage est inférieur à SE 8, utilisez l'un des éléments suivants. Voir aussi pourquoi JSR-310 n'est pas Joda-Time


Un nouveau wrapper Scala pour Joda Time . Ce projet est issu du scala-time puisqu'il semble que le scala-time ne soit plus maintenu.

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 est une bonne bibliothèque Java, il existe un wrapper Scala / une bibliothèque de conversion implicite disponible pour Joda Time à scala-time créé par Jorge Ortiz . (Notez que les implicits ont un impact sur les performances, mais cela dépend de ce que vous faites si vous le remarquez. Et si vous rencontrez un problème de performance, vous pouvez simplement revenir à l'interface Joda)

Depuis le 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
oluies
la source
4
Vidéo scalaj: Idiomatic Scala Wrappers pour les bibliothèques Java days2010.scala-lang.org/node/138/164
oluies
Merci, je ne connais pas cet emballage.
Vadim Shender
Je ne peux pas obtenir une sortie formatée à partir de cela. Si j'utilise DateTime.formatted ("aaaaMMjj"), j'obtiens simplement "aaaaMMjj" (lettres non remplacées par des nombres correspondants) comme réponse. Si j'utilise DateTime.formatted (DateTimeFormat.forPattern ("aaaaMMjj")) - j'obtiens une erreur demandant un argument de chaîne.
Ivan le
1
Puisqu'il semble que scala-time ne soit plus maintenu, il a été remplacé par nscala-time (qui contrairement à scala-time fonctionne avec scala 2.10). Il peut être trouvé sur github.com/nscala-time/nscala-time .
Sebastian Ganslandt
1
Impossible de comprendre le problème avec leur Importset scala.concurrent.duration._. Utilisé à la place du JodaTime ordinaire et écrit ses propres vélos dessus.
kisileno
12

Si vous utilisez Java 8, il n'est plus nécessaire de l'utiliser nscala. La bibliothèque Joda-Time a été déplacée vers Java 8 sous le java.timepackage (JSR-310). Importez simplement ce package dans votre projet Scala.


la source
1
Ce n'est pas vrai. Joda-Time-code doit être migré / ajusté lors du passage à Java-8 => deux API différentes!
Meno Hochschild
7

Il n'y a pas de méthode standard pour travailler avec des dates dans Scala. Les options disponibles sont:

  1. Utilisez java.time (si vous utilisez Java 8) car il intègre le meilleur du temps JODA. Pas d'implication.
  2. Utilisez nscala-time.
  3. Bibliothèque de dates Lamma (bibliothèque relativement nouvelle sur la scène)

J'éviterais d'utiliser java.util.Date en raison des problèmes bien documentés qui l'entourent.

MK
la source
5

MOTIVATION:

Les bibliothèques Java Date et Calendar sont largement inadéquates. Ils sont mutables, non thread-safe et très peu pratiques à utiliser.

La bibliothèque Joda Time est un excellent remplacement pour les classes de date et de calendrier de Java. Ils sont immuables par défaut, ont une API beaucoup plus riche et plus agréable, et peuvent facilement être convertis en classes de date et de calendrier de Java si nécessaire.

Ce projet offre une fine couche de commodité autour des bibliothèques Joda Time, les rendant plus idiomatiques à utiliser dans Scala.

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

Pavel Sklenak
la source
3

Tout le monde utilise JodaTime, ces bibliothèques d'aide / wrapper Scala peuvent nécessiter une recompilation avec les nouvelles versions de Scala. Jodatime est la seule bibliothèque de temps qui existe depuis longtemps, elle est stable et fonctionne de manière fiable avec chaque version de Scala.

irishjava
la source