Cách tiêu chuẩn để làm việc với ngày và giờ trong Scala là gì? Tôi nên sử dụng các loại Java hoặc có các lựa chọn thay thế Scala bản địa?


161

Cách tiêu chuẩn để làm việc với ngày và giờ trong Scala là gì? Tôi có nên sử dụng các loại Java như java.util.Date hoặc có các lựa chọn thay thế Scala gốc không?

Câu trả lời:


129

Từ Java SE 8 trở đi, người dùng được yêu cầu chuyển sang java.time (JSR-310). Có những nỗ lực tạo thư viện scala gói java.time cho scala như scala-time . Nếu nhắm mục tiêu thấp hơn SE 8, hãy sử dụng một trong các cách bên dưới. Đồng thời xem tại sao JSR-310 không phải là Joda-Time


Một gói Scala mới cho Joda Time . Dự án này rẽ nhánh từ thời gian scala vì dường như thời gian scala không còn được duy trì.

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 là một thư viện Java tốt, có một thư viện chuyển đổi bao bọc / ẩn Scala có sẵn cho Joda Time vào thời gian scala được tạo bởi Jorge Ortiz . (Lưu ý ngụ ý có hiệu năng, nhưng nó phụ thuộc vào những gì bạn làm nếu bạn sẽ chú ý. Và nếu bạn gặp vấn đề về hiệu suất, bạn có thể quay lại giao diện Joda)

Từ 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: Trình bao bọc Scala thành ngữ cho Thư viện Java days2010.scala-lang.org/node/138/164
oluies

Cảm ơn, tôi không biết về cái bọc này.
Shimimim Shender

Tôi không thể có được một đầu ra được định dạng từ này. Nếu tôi sử dụng DateTime.formatted ("yyyyMMdd"), tôi chỉ nhận được "yyyyMMdd" đơn giản (các chữ cái không được thay thế bằng các số tương ứng) làm phản hồi. Nếu tôi sử dụng DateTime.formatted (DateTimeFormat.forPotype ("yyyyMMdd")) - Tôi gặp lỗi khi yêu cầu đối số chuỗi.
Ivan

1
Vì dường như thời gian scala không còn được duy trì, nó đã được thay thế bởi thời gian nscala (trái ngược với thời gian scala hoạt động với scala 2.10). Nó có thể được tìm thấy tại github.com/nscala-time/nscala-time .
Sebastian Ganslandt

1
Không thể tìm ra vấn đề với họ Importsscala.concurrent.duration._. Đã sử dụng JodaTime đơn giản thay vào đó và viết xe đạp riêng trên nó.
kisileno

12

Nếu bạn đang sử dụng Java 8, thì không cần phải sử dụng nscalanữa. Thư viện Joda-Time đã được chuyển vào Java 8 theo java.timegói (JSR-310). Chỉ cần nhập gói đó vào dự án Scala của bạn.


1
Điều đó không đúng. Mã thời gian phải được di chuyển / điều chỉnh khi chuyển sang Java-8 => hai API khác nhau!
Meno Hochschild

7

Không có cách tiêu chuẩn để làm việc với ngày trong Scala. Các tùy chọn có sẵn là:

  1. Sử dụng java.time (nếu bạn đang sử dụng Java 8) vì nó có thời gian JODA tốt nhất được tích hợp trong đó. Không có ngụ ý.
  2. Sử dụng thời gian nscala.
  3. Thư viện ngày Lamma (thư viện tương đối mới trên hiện trường)

Tôi sẽ tránh sử dụng java.util.Date do các vấn đề được ghi chép rõ ràng xung quanh nó.


5

ĐỘNG LỰC:

Các thư viện Ngày và Lịch Java phần lớn không đầy đủ. Chúng có thể thay đổi, không an toàn cho chủ đề và rất bất tiện khi sử dụng.

Thư viện Joda Time là sự thay thế tuyệt vời cho các lớp Ngày và Lịch của Java. Theo mặc định, chúng không thay đổi, có API phong phú và đẹp hơn nhiều và có thể dễ dàng được chuyển đổi thành các lớp Ngày và Lịch của Java khi cần thiết.

Dự án này cung cấp một lớp mỏng tiện lợi xung quanh các thư viện Joda Time, khiến chúng trở nên dễ sử dụng hơn trong Scala.

(được sao chép từ https://github.com/jorgeortiz85/scala-time )


3

Mọi người đều sử dụng JodaTime, các thư viện trình trợ giúp / trình bao bọc Scala này có thể cần biên dịch lại với các phiên bản mới của Scala. Jodatime là thư viện thời gian duy nhất tồn tại trong một thời gian dài, ổn định và hoạt động đáng tin cậy với mọi phiên bản của Scala.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.