Wie kann man in Scala standardmäßig mit Datum und Uhrzeit arbeiten? Soll ich Java-Typen verwenden oder gibt es native Scala-Alternativen?

161

Wie kann man in Scala standardmäßig mit Datum und Uhrzeit arbeiten? Sollte ich Java-Typen wie java.util.Date verwenden oder gibt es native Scala-Alternativen?

Ivan
quelle

Antworten:

129

Ab Java SE 8 werden Benutzer aufgefordert, auf java.time (JSR-310) zu migrieren. Es gibt Bemühungen, Scala-Bibliotheken zu erstellen, die java.time für scala wie scala-time einschließen . Wenn Sie weniger als SE 8 anvisieren, verwenden Sie eine der folgenden Möglichkeiten. Siehe auch Warum JSR-310 keine Joda-Zeit ist


Ein neuer Scala-Wrapper für Joda Time . Dieses Projekt hat sich von der Scala-Zeit getrennt, da es den Anschein hat, dass die Scala-Zeit nicht mehr eingehalten wird.

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 ist eine gute Java-Bibliothek. Es gibt eine Scala-Wrapper / implizite Konvertierungsbibliothek, die für Joda Time zur Scala-Zeit verfügbar ist und von Jorge Ortiz erstellt wurde . (Beachten Sie, dass Implizite einen Leistungseinbruch haben, aber es hängt davon ab, was Sie tun, wenn Sie es bemerken. Und wenn Sie auf ein Leistungsproblem stoßen, können Sie einfach zur Joda-Oberfläche zurückkehren.)

Aus der 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
quelle
4
Video scalaj: Idiomatische Scala-Wrapper für Java-Bibliotheken days2010.scala-lang.org/node/138/164
oluies
Danke, ich weiß nichts über diesen Wrapper.
Vadim Shender
Ich kann daraus keine formatierte Ausgabe erhalten. Wenn ich DateTime.formatted ("yyyyMMdd") verwende, erhalte ich als Antwort einfach "yyyyMMdd" (Buchstaben werden nicht durch entsprechende Zahlen ersetzt). Wenn ich DateTime.formatted (DateTimeFormat.forPattern ("yyyyMMdd")) verwende, wird beim Abfragen eines Zeichenfolgenarguments eine Fehlermeldung angezeigt.
Ivan
1
Da die Scala-Zeit anscheinend nicht mehr eingehalten wird, wurde sie durch die Nscala-Zeit ersetzt (die im Gegensatz zur Scala-Zeit mit Scala 2.10 funktioniert). Es kann unter github.com/nscala-time/nscala-time gefunden werden .
Sebastian Ganslandt
1
Ich kann das Problem mit ihrem Importsund nicht herausfinden scala.concurrent.duration._. Ich habe stattdessen einfaches JodaTime verwendet und eigene Fahrräder darüber geschrieben.
Kisileno
12

Wenn Sie Java 8 verwenden, müssen Sie es nicht nscalamehr verwenden. Die Joda-Time-Bibliothek wurde unter dem java.timePaket (JSR-310) in Java 8 verschoben . Importieren Sie dieses Paket einfach in Ihr Scala-Projekt.


quelle
1
Das ist nicht wahr. Joda-Time-Code muss beim Wechsel zu Java-8 migriert / angepasst werden => zwei verschiedene APIs!
Meno Hochschild
7

In Scala gibt es keine Standardmethode für die Arbeit mit Daten. Folgende Optionen stehen zur Verfügung:

  1. Verwenden Sie java.time (wenn Sie Java 8 verwenden), da die beste JODA-Zeit integriert ist. Keine Implikationen.
  2. Verwenden Sie nscala-time.
  3. Lamma-Datumsbibliothek (relativ neue Bibliothek in der Szene)

Ich würde die Verwendung von java.util.Date aufgrund der gut dokumentierten Probleme vermeiden.

MK
quelle
5

MOTIVATION:

Die Java-Datums- und Kalenderbibliotheken sind weitgehend unzureichend. Sie sind veränderlich, nicht threadsicher und sehr unpraktisch in der Verwendung.

Die Joda Time-Bibliothek ist ein großartiger Ersatz für Javas Datums- und Kalenderklassen. Sie sind standardmäßig unveränderlich, haben eine viel umfangreichere und schönere API und können bei Bedarf problemlos in die Datums- und Kalenderklassen von Java konvertiert werden.

Dieses Projekt bietet eine dünne Ebene an Komfort für die Joda Time-Bibliotheken, sodass sie in Scala idiomatischer verwendet werden können.

(kopiert von https://github.com/jorgeortiz85/scala-time )

Pavel Sklenak
quelle
3

Jeder verwendet JodaTime. Diese Scala-Helfer- / Wrapper-Bibliotheken müssen möglicherweise mit neuen Versionen von Scala neu kompiliert werden. Jodatime ist die einzige Zeitbibliothek, die es schon lange gibt. Sie ist stabil und funktioniert zuverlässig mit jeder Version von Scala.

irishjava
quelle