Какой стандартный способ работы с датами и временем в Scala? Должен ли я использовать типы Java или есть собственные альтернативы Scala?

161

Какой стандартный способ работы с датами и временем в Scala? Должен ли я использовать типы Java, такие как java.util.Date, или есть собственные альтернативы Scala?

Иван
источник

Ответы:

129

Начиная с Java SE 8, пользователям предлагается перейти на java.time (JSR-310). Прилагаются усилия по созданию библиотек scala, обертывающих java.time для scala, таких как scala-time . Если таргетинг ниже, чем SE 8, используйте один из следующих. Также посмотрите, почему JSR-310 не Joda-Time


Новая оболочка Scala для Joda Time . Этот проект был основан на scala-time, поскольку кажется, что scala-time больше не поддерживается.

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 - хорошая библиотека Java, есть библиотека оболочки / неявного преобразования Scala, доступная для Joda Time во время scala-time, созданная Хорхе Ортисом . (Примечание: это влияет на производительность, но это зависит от того, что вы делаете, если заметите. А если у вас возникнут проблемы с производительностью, вы можете просто вернуться к интерфейсу Joda)

Из 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
источник
4
Видео scalaj: Идиоматические Scala Упаковщики для Java библиотеки days2010.scala-lang.org/node/138/164
oluies
Спасибо, я не знал об этой обертке.
Вадим Шендер
Я не могу получить отформатированный вывод из этого. Если я использую DateTime.formatted («yyyyMMdd»), я просто получаю «yyyyMMdd» (буквы, не замененные соответствующими номерами) в качестве ответа. Если я использую DateTime.formatted (DateTimeFormat.forPattern ("yyyyMMdd")) - я получаю ошибку, запрашивающую строковый аргумент.
Иван
1
Поскольку кажется, что время scala-времени больше не поддерживается, оно было заменено временем nscala (которое, в отличие от времени scala-времени, работает с scala 2.10). Его можно найти по адресу github.com/nscala-time/nscala-time .
Себастьян Гансландт
1
Не могу понять проблему с их Importsи scala.concurrent.duration._. Вместо этого использовал обычный JodaTime и писал над ним собственные велосипеды.
кисилено
12

Если вы используете Java 8, то больше нет необходимости использовать nscala. Библиотека Joda-Time была перемещена в Java 8 под java.timeпакетом (JSR-310). Просто импортируйте этот пакет в ваш проект Scala.


источник
1
Это неправда. Joda-Time-код должен быть перенесен / настроен при переключении на Java-8 => два разных API!
Мено Хохшильд
7

В Scala нет стандартного способа работы с датами. Доступные варианты:

  1. Используйте java.time (если вы используете Java 8), поскольку в него встроено лучшее время JODA. Никаких последствий.
  2. Используйте nscala-time.
  3. Библиотека дат Ламмы (относительно новая библиотека на сцене)

Я бы не использовал java.util.Date из-за хорошо задокументированных проблем, связанных с ним.

MK
источник
5

МОТИВАЦИЯ:

Библиотеки Java Date и Calendar в основном неадекватны. Они изменчивы, не поточнобезопасны и очень неудобны в использовании.

Библиотека Joda Time - отличная замена классам Java Date и Calendar. По умолчанию они неизменяемы, имеют более богатый и приятный API и могут быть легко преобразованы в классы Java и Calendar в случае необходимости.

Этот проект обеспечивает тонкий уровень удобства работы с библиотеками Joda Time, делая их более идиоматичными для использования в Scala.

(скопировано с https://github.com/jorgeortiz85/scala-time )

Павел Скленак
источник
3

Каждый использует JodaTime, эти библиотеки помощников / оболочек Scala могут нуждаться в перекомпиляции с новыми версиями Scala. Jodatime - единственная библиотека времени, которая существует уже давно, стабильна и надежно работает с каждой версией Scala.

irishjava
источник