Apa cara standar untuk bekerja dengan tanggal dan waktu di Scala? Haruskah saya menggunakan tipe Java atau ada alternatif Scala asli?


161

Apa cara standar untuk bekerja dengan tanggal dan waktu di Scala? Haruskah saya menggunakan tipe Java seperti java.util.Date atau ada alternatif Scala asli?

Jawaban:


129

Dari Java SE 8 dan seterusnya, pengguna diminta untuk bermigrasi ke java.time (JSR-310). Ada upaya membuat perpustakaan scala yang membungkus java.time untuk scala seperti scala-time . Jika penargetan lebih rendah dari SE 8 gunakan salah satu di bawah ini. Juga lihat Mengapa JSR-310 bukan Joda-Time


Pembungkus Scala baru untuk Joda Time . Proyek ini bercabang dari scala-time karena tampaknya scala-time tidak lagi dipertahankan.

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 adalah perpustakaan Java yang baik, ada perpustakaan Scala wrapper / implisit konversi yang tersedia untuk Joda Time pada scala-time yang dibuat oleh Jorge Ortiz . (Catatan implisit memiliki hit kinerja, tetapi itu tergantung pada apa yang Anda lakukan jika Anda akan melihat. Dan jika Anda mengalami masalah kinerja Anda bisa kembali ke antarmuka Joda)

Dari 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

4
Video scalaj: Pembungkus Scala Idiomatik untuk Perpustakaan Java days2010.scala-lang.org/node/138/164
oluies

Terima kasih, saya belum tahu tentang bungkus ini.
Vadim Shender

Saya tidak bisa mendapatkan output yang diformat dari ini. Jika saya menggunakan DateTime.formatted ("yyyyMMdd"), saya hanya mendapatkan "yyyyMMdd" (huruf tidak diganti dengan angka yang sesuai) sebagai respons. Jika saya menggunakan DateTime.formatted (DateTimeFormat.forPattern ("yyyyMMdd")) - Saya mendapatkan pesan kesalahan meminta argumen string.
Ivan

1
Karena tampaknya scala-time tidak lagi dipertahankan, ia telah digantikan oleh nscala-time (yang berbeda dengan scala-time bekerja dengan scala 2.10). Itu dapat ditemukan di github.com/nscala-time/nscala-time .
Sebastian Ganslandt

1
Tidak dapat menemukan masalah dengan mereka Importsdan scala.concurrent.duration._. Sebaliknya, gunakan JodaTime biasa dan menulis sepeda sendiri di atasnya.
kisileno

12

Jika Anda menggunakan Java 8, maka tidak perlu digunakan nscalalagi. Perpustakaan Joda-Time telah dipindahkan ke Java 8 di bawah java.timepaket (JSR-310). Impor saja paket itu ke proyek Scala Anda.


1
Itu tidak benar. Joda-Time-code harus dimigrasikan / disesuaikan ketika beralih ke Java-8 => dua API yang berbeda!
Meno Hochschild

7

Tidak ada cara standar untuk bekerja dengan kurma di Scala. Opsi yang tersedia adalah:

  1. Gunakan java.time (jika Anda menggunakan Java 8) karena ia memiliki waktu JODA terbaik yang ada di dalamnya. Tidak ada yang tersirat.
  2. Gunakan waktu nscala.
  3. Lamma date library (perpustakaan yang relatif baru di tempat kejadian)

Saya akan menghindari menggunakan java.util.Date karena masalah yang terdokumentasi dengan baik di sekitarnya.


5

MOTIVASI:

Perpustakaan Java Date dan Calendar sebagian besar tidak memadai. Mereka bisa berubah, tidak aman untuk benang, dan sangat tidak nyaman untuk digunakan.

Perpustakaan Joda Time adalah pengganti yang hebat untuk kelas Date dan Calendar Java. Mereka tidak dapat diubah secara default, memiliki API yang lebih kaya dan lebih bagus, dan dapat dengan mudah dikonversi ke kelas Tanggal dan Kalender Java bila perlu.

Proyek ini memberikan lapisan tipis kenyamanan di sekitar perpustakaan Joda Time, menjadikannya lebih idiomatis untuk digunakan dalam Scala.

(disalin dari https://github.com/jorgeortiz85/scala-time )


3

Semua orang menggunakan JodaTime, pustaka pembantu / pembungkus Scala ini mungkin perlu dikompilasi ulang dengan versi Scala baru. Jodatime adalah satu-satunya perpustakaan waktu yang sudah ada sejak lama, dan stabil dan berfungsi dengan baik pada setiap versi Scala.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.