Який стандартний спосіб роботи з датами та часом у 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 . Цей проект розгорнувся з масштабного часу, оскільки, здається, масштабний час більше не підтримується.

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, є бібліотека обгортки / неявна конвертація, доступна для Joda Time у масштабі часу, створена Хорхе Ортісом . (Зверніть увагу, що наслідки мають ударну ефективність, але це залежить від того, що ви зробите, якщо ви помітите. І якщо у вас виникнуть проблеми з продуктивністю, ви можете просто повернутися до інтерфейсу Joda)

З ПРОЧИТАННЯ:

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
Відео scalaj: Ідіоматичні обгортки Scala для бібліотек Java days2010.scala-lang.org/node/138/164
oluies

Дякую, я не знав про цю обгортку.
Вадим Шендер

Я не можу отримати від цього форматований вихід. Якщо я використовую DateTime.formatted ("yyyyMMdd"), я просто отримую звичайний "yyyyMMdd" (літери, не замінені відповідними номерами) як відповідь. Якщо я використовую DateTime.formatted (DateTimeFormat.forPattern ("yyyyMMdd")) - я отримую помилку із запитом рядкового аргументу.
Іван

1
Оскільки, здається, масштабний час більше не підтримується, його витіснив nscala-час (який на відміну від масштабного часу працює зі шкалою 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!
Meno Hochschild

7

У Scala немає стандартного способу роботи з датами. Доступні варіанти:

  1. Використовуйте java.time (якщо ви використовуєте Java 8), оскільки в неї вбудовано найкращий час JODA. Без наслідків.
  2. Використовуйте nscala-time.
  3. Бібліотека побачень Lamma (порівняно нова бібліотека на сцені)

Я б уникав використовувати java.util.Date через добре задокументовані проблеми, які його оточують.


5

МОТИВАЦІЯ:

Бібліотеки дати та календаря Java в основному недостатні. Вони мінливі, не захищені від ниток і дуже незручні у використанні.

Бібліотека часу Joda - це чудова заміна для класів «Дата та Календар Java». За замовчуванням вони незмінні, мають набагато багатший і приємніший API, і при необхідності легко можуть бути перетворені на класи Дата та Календар Java.

Цей проект забезпечує тонкий рівень зручності навколо бібліотек Joda Time, що робить їх ідіоматичнішими для використання в Scala.

(скопійовано з https://github.com/jorgeortiz85/scala-time )


3

Усі користуються JodaTime, цим бібліотекам помічників / обгортки Scala може знадобитися повторна компіляція з новими версіями Scala. Jodatime - це єдина бібліотека часу, яка існує вже давно, стабільна і надійно працює з кожною версією Scala.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.