วิธีมาตรฐานในการทำงานกับวันที่และเวลาในสกาล่าคืออะไร ฉันควรใช้ประเภท Java หรือมีทางเลือก Scala ดั้งเดิมหรือไม่


161

วิธีมาตรฐานในการทำงานกับวันที่และเวลาในสกาล่าคืออะไร ฉันควรใช้ประเภท Java เช่น java.util.Date หรือมีทางเลือก Scala ดั้งเดิมหรือไม่

คำตอบ:


129

จาก Java SE 8 เป็นต้นไปผู้ใช้จะถูกขอให้ย้ายไปยัง java.time (JSR-310) มีความพยายามในการสร้างห้องสมุดสกาล่า java.time ห่อสำหรับสกาล่าเช่นสกาล่าเวลา หากการกำหนดเป้าหมายต่ำกว่า SE 8 ให้ใช้วิธีใดวิธีหนึ่งต่อไปนี้ ดูเพิ่มเติมที่ทำไม JSR-310 ไม่ใช่ Joda-Time


เสื้อคลุม Scala ใหม่สำหรับ Joda เวลา โครงการนี้แยกจากเวลาสกาล่าเนื่องจากดูเหมือนว่าเวลาสกาล่าจะไม่ได้รับการบำรุงรักษาอีกต่อไป

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 เวลาที่ดี Java ห้องสมุดมี Scala เสื้อคลุม / นัยใช้ได้ห้องสมุดการแปลงสำหรับ Joda เวลาที่สกาล่าเวลาที่สร้างขึ้นโดยJorge ออร์ติซ (หมายเหตุนัยมีการเข้าชมประสิทธิภาพ แต่ขึ้นอยู่กับสิ่งที่คุณทำถ้าคุณจะสังเกตเห็นและถ้าคุณพบปัญหาประสิทธิภาพการทำงานที่คุณสามารถย้อนกลับไปที่อินเตอร์เฟซ 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

4
scal scal วิดีโอ: Idiomatic Scala Wrappers สำหรับ Java Libraries days2010.scala-lang.org/node/138/164
oluies

ขอบคุณฉันไม่ทราบเกี่ยวกับเสื้อคลุมนี้
Vadim Shender

ฉันไม่สามารถรับผลลัพธ์ที่จัดรูปแบบจากนี้ ถ้าฉันใช้ DateTime.formatted ("yyyyMMdd") ฉันเพิ่งได้รับธรรมดา "yyyyMMdd" (ตัวอักษรไม่ถูกแทนที่ด้วยตัวเลขที่เกี่ยวข้อง) เป็นการตอบสนอง ถ้าฉันใช้ DateTime.formatted (DateTimeFormat.forPattern ("yyyyMMdd")) - ฉันได้รับข้อผิดพลาดในการขออาร์กิวเมนต์สตริง
Ivan

1
เนื่องจากดูเหมือนว่าเวลาสกาล่าจะไม่ได้รับการบำรุงรักษาอีกต่อไปจึงถูกแทนที่ด้วย nscala-time (ซึ่งตรงกันข้ามกับสกาล่าเวลาทำงานกับสกาล่า 2.10) มันสามารถพบได้ที่github.com/nscala-time/nscala-time
Sebastian Ganslandt

1
ไม่สามารถคิดออกมีปัญหากับพวกเขาและImports scala.concurrent.duration._ใช้ JodaTime ธรรมดาแทนและเขียนจักรยานของตัวเองเหนือมัน
kisileno

12

หากคุณกำลังใช้ Java 8 แสดงว่าไม่จำเป็นต้องใช้nscalaอีกต่อไป ไลบรารี Joda-Time ถูกย้ายไปยัง Java 8 ภายใต้java.timeแพ็คเกจ (JSR-310) เพียงนำเข้าแพ็คเกจนั้นไปยังโครงการ Scala ของคุณ


1
นั่นไม่เป็นความจริง Joda-Time-code จะต้องทำการโยกย้าย / ปรับเปลี่ยนเมื่อเปลี่ยนเป็น Java-8 => API ที่แตกต่างกันสองตัว!
Meno Hochschild

7

ไม่มีวิธีมาตรฐานในการทำงานกับเดทในสกาลา ตัวเลือกที่ใช้ได้คือ:

  1. ใช้ java.time (ถ้าคุณใช้ Java 8) เนื่องจากมีเวลา JODA ที่ดีที่สุด ไม่มีนัย
  2. ใช้ nscala-time
  3. ไลบรารีวันที่ของ Lamma (ไลบรารีที่ค่อนข้างใหม่ในที่เกิดเหตุ)

ฉันจะหลีกเลี่ยงการใช้ java.util.Date เนื่องจากปัญหาที่มีเอกสารอย่างดีล้อมรอบ


5

แรงจูงใจ:

ไลบรารี Java Date และ Calendar ส่วนใหญ่ไม่เพียงพอ พวกเขาจะไม่แน่นอนไม่ปลอดภัยเธรดและไม่สะดวกในการใช้

ไลบรารี Joda Time เป็นสิ่งทดแทนที่ยอดเยี่ยมสำหรับคลาสวันที่และปฏิทินของ Java พวกมันไม่เปลี่ยนรูปโดยค่าเริ่มต้นมี API ที่สมบูรณ์ยิ่งขึ้นและดีกว่าและสามารถแปลงเป็นคลาส Date และ Calendar ของ Java ได้อย่างง่ายดายเมื่อจำเป็น

โครงการนี้มอบความสะดวกสบายบางชั้นรอบห้องสมุด Joda Time ทำให้พวกเขาใช้สำนวนได้ง่ายขึ้นภายใน Scala

(คัดลอกมาจากhttps://github.com/jorgeortiz85/scala-time )


3

ทุกคนใช้ JodaTime ห้องสมุดผู้ช่วย / ผู้ห่อหุ้ม Scala เหล่านี้อาจต้องรวบรวมใหม่ด้วย Scala เวอร์ชันใหม่ Jodatime เป็นห้องสมุดเวลาเพียงแห่งเดียวที่มีมานานและมีเสถียรภาพและทำงานได้อย่างน่าเชื่อถือกับ Scala ทุกรุ่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.