Qual é a maneira padrão de trabalhar com datas e horas no Scala? Devo usar tipos Java ou existem alternativas nativas do Scala?

161

Qual é a maneira padrão de trabalhar com datas e horas no Scala? Devo usar tipos Java, como java.util.Date, ou existem alternativas nativas do Scala?

Ivan
fonte

Respostas:

129

A partir do Java SE 8, os usuários são solicitados a migrar para o java.time (JSR-310). Há esforços na criação de bibliotecas scala que envolvem java.time para scala, como scala-time . Se a segmentação for inferior a SE 8, use uma das opções abaixo. Veja também Por que o JSR-310 não é Joda-Time


Um novo invólucro Scala para a Joda Time . Este projeto foi extraído do scala-time, pois parece que o scala-time não é mais mantido.

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

O Joda Time é uma boa biblioteca Java, existe uma biblioteca de conversão implícita / wrapper Scala disponível para o Joda Time no scala-time criado por Jorge Ortiz . (Nota: os implícitos têm um impacto no desempenho, mas isso depende do que você faz, se perceber. E se você encontrar um problema de desempenho, poderá reverter para a interface Joda)

No 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
fonte
4
Scalaj de vídeo: Idiomatic Scala Wrappers para bibliotecas Java days2010.scala-lang.org/node/138/164
oluies
Obrigado, não conheço este invólucro.
Vadim Shender
Não consigo obter uma saída formatada disso. Se eu usar DateTime.formatted ("aaaamMMdd"), simplesmente recebo "aaaaMMdd" simples (letras não substituídas pelos números correspondentes) como resposta. Se eu usar DateTime.formatted (DateTimeFormat.forPattern ("aaaaMMdd")) - eu recebo um erro solicitando um argumento de seqüência de caracteres.
Ivan Ivan
1
Como parece que o tempo de escala não é mais mantido, ele foi substituído pelo tempo de escala (que, em contraste com o tempo de escala, trabalha com a escala 2.10). Pode ser encontrado em github.com/nscala-time/nscala-time .
Sebastian Ganslandt 6/03/2013
1
Não consigo descobrir o problema com eles Importse scala.concurrent.duration._. Em vez disso, usou o JodaTime simples e escreveu bicicletas próprias sobre ele.
Kisileno
12

Se você estiver usando o Java 8, não será mais necessário usá-lo nscala. A biblioteca Joda-Time foi movida para o Java 8 no java.timepacote (JSR-310). Basta importar esse pacote para o seu projeto Scala.


fonte
1
Isso não é verdade. O código de tempo Joda deve ser migrado / ajustado ao mudar para Java-8 => duas APIs diferentes!
Meno Hochschild 30/03
7

Não há uma maneira padrão de trabalhar com datas no Scala. As opções disponíveis são:

  1. Use java.time (se você estiver usando o Java 8), pois ele possui o melhor tempo do JODA. Sem implícitos.
  2. Use nscala-time.
  3. Biblioteca de datas Lamma (biblioteca relativamente nova em cena)

Eu evitaria usar o java.util.Date devido aos problemas bem documentados que o cercam.

MK
fonte
5

MOTIVAÇÃO:

As bibliotecas Java Date e Calendar são em grande parte inadequadas. Eles são mutáveis, não são seguros para threads e são muito inconvenientes de usar.

A biblioteca Joda Time é um ótimo substituto para as classes Date e Calendar do Java. Eles são imutáveis ​​por padrão, possuem uma API muito mais rica e agradável e podem ser facilmente convertidos nas classes Date e Calendar do Java, quando necessário.

Este projeto fornece uma fina camada de conveniência nas bibliotecas Joda Time, tornando-as mais idiomáticas para uso no Scala.

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

Pavel Sklenak
fonte
3

Todo mundo usa o JodaTime, essas bibliotecas auxiliar / wrapper do Scala podem precisar de recompilação com as novas versões do Scala. O Jodatime é a única biblioteca de tempo que existe há muito tempo, e é estável e funciona de maneira confiável com todas as versões do Scala.

irishjava
fonte