Jaki jest standardowy sposób pracy z datami i godzinami w Scali? Czy powinienem używać typów Java, czy istnieją natywne alternatywy dla Scala?

161

Jaki jest standardowy sposób pracy z datami i godzinami w Scali? Czy powinienem używać typów Java, takich jak java.util.Date, czy istnieją natywne alternatywy dla Scala?

Ivan
źródło

Odpowiedzi:

129

Począwszy od Java SE 8, użytkownicy są proszeni o migrację do java.time (JSR-310). Podejmowane są wysiłki w celu stworzenia bibliotek scala, opakowujących java.time dla scali, takich jak scala-time . Jeśli celujesz poniżej SE 8, użyj jednego z poniższych. Zobacz także Dlaczego JSR-310 to nie Joda-Time


Nowe opakowanie Scali dla Joda Time . Ten projekt rozwidlił czas skalowania, ponieważ wydaje się, że czas skalowania nie jest już obsługiwany.

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 to dobra biblioteka Java, dostępna jest biblioteka opakowująca / niejawna konwersja Scala dla Joda Time w czasie scala, stworzona przez Jorge Ortiza . (Zauważ, że implikacje mają wpływ na wydajność, ale to zależy od tego, co zrobisz, jeśli zauważysz. A jeśli napotkasz problem z wydajnością, możesz po prostu powrócić do interfejsu Jody)

Z 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
źródło
4
Wideo scalaj: Idiomatic Scala Wrappers for Java Libraries days2010.scala-lang.org/node/138/164
oluies
Dzięki, nie wiem o tym opakowaniu.
Vadim Shender
Nie mogę uzyskać z tego sformatowanego wyniku. Jeśli używam DateTime.formatted („yyyyMMdd”), otrzymuję po prostu zwykły „yyyyMMdd” (litery nie zastępowane odpowiednimi liczbami) jako odpowiedź. Jeśli używam DateTime.formatted (DateTimeFormat.forPattern ("yyyyMMdd")) - pojawia się błąd z prośbą o podanie argumentu w postaci ciągu.
Ivan
1
Ponieważ wydaje się, że czas scala nie jest już obsługiwany, został on zastąpiony przez czas nscala (który w przeciwieństwie do czasu skalowania działa ze skalą 2.10). Można go znaleźć pod adresem github.com/nscala-time/nscala-time .
Sebastian Ganslandt,
1
Nie mogę rozwiązać problemu z ich Importsi scala.concurrent.duration._. Zamiast tego użył zwykłego JodaTime i napisał na nim własne rowery.
kisileno,
12

Jeśli używasz Java 8, nie ma już potrzeby korzystania z niej nscala. Biblioteka Joda-Time została przeniesiona do Java 8 w ramach java.timepakietu (JSR-310). Po prostu zaimportuj ten pakiet do projektu Scala.


źródło
1
To nie jest prawda. Kod czasu Joda musi zostać zmigrowany / dostosowany podczas przełączania na Java-8 => dwa różne API!
Meno Hochschild
7

Nie ma standardowego sposobu pracy z datami w Scali. Dostępne opcje to:

  1. Użyj java.time (jeśli używasz Java 8), ponieważ ma wbudowany najlepszy czas JODA. Bez implikacji.
  2. Użyj czasu nscala.
  3. Biblioteka dat Lamma (stosunkowo nowa biblioteka na scenie)

Unikałbym używania java.util.Date ze względu na dobrze udokumentowane problemy z tym związane.

MK
źródło
5

MOTYWACJA:

Biblioteki Java Date i Calendar są w dużej mierze niewystarczające. Są zmienne, nie są bezpieczne dla wątków i bardzo niewygodne w użyciu.

Biblioteka Joda Time jest doskonałym zamiennikiem klas daty i kalendarza języka Java. Są one domyślnie niezmienne, mają znacznie bogatszy i ładniejszy interfejs API i w razie potrzeby można je łatwo przekonwertować na klasy Java Date i Calendar.

Ten projekt zapewnia cienką warstwę wygody wokół bibliotek Joda Time, dzięki czemu są one bardziej idiomatyczne w użyciu w Scali.

(skopiowane z https://github.com/jorgeortiz85/scala-time )

Pavel Sklenak
źródło
3

Wszyscy używają JodaTime, te biblioteki pomocnicze / opakowujące Scala mogą wymagać ponownej kompilacji z nowymi wersjami Scali. Jodatime to jedyna biblioteka czasu, która istnieje od dłuższego czasu, jest stabilna i działa niezawodnie z każdą wersją Scali.

irishjava
źródło