9

我正在阅读该课程的scala 文档scala.concurrent.duration.Duration,我刚刚发现它以:

此类并不意味着作为时间的通用表示,它针对 scala.concurrent 的需求进行了优化。

为什么这句话的含义?有什么更好的选择?

4

2 回答 2

5

我想我对此负有部分责任。

这里的一般问题是时间系统很难。真的,真的,真的很难。

致力于标准化 Futures 的 Akka 开发人员需要一个构造来描述两个“匿名”时间点之间的长度,以实现其功能。Duration旨在解决这一特定要求。

我担心的是人们可能会开始使用这个与时间相关的类来处理它不是为了让我们陷入与java.util.Date/java.util.Calendar相当的麻烦情况(不是因为Duration它实际上适用于它的用例),在这种情况下,很多人会滥用它作为某种 scala.time它从未打算成为的东西。

这就是为什么它有这个注释并被打包到scala.concurrent.duration而不是 eg scala.time

我期待java.time与 Java 8 一起发布的软件包。将来可能会对其进行标准化,这将稍微提高互操作性,并具有为更广泛的用例而设计的额外好处。(不过,Scala 使用 Java 8 作为基线可能需要很长时间……)

于 2013-09-08T17:25:03.373 回答
3

时间可以根据您的需要以各种方式表示。我个人使用过:

  1. Long——很多工具直接拿来
  2. 更新java.time.*感谢@Vladimir Matveev

    该包由 Joda Time (Stephen Colebourne) 的作者设计。他说它设计得更好。

  3. 乔达时间

  4. java.util.Date

  5. 单独的类层次结构:

    trait Time
    case class ExactTime(timeMs:Long) extends Time
    case object Now extends Time
    case object ASAP extends Time
    case class RelativeTime(origin:Time, deltaMs:Long) extends Time
    
  6. 有序时间表示:

    case class History[T](events:List[T])
    
  7. 模型时间。一旦我有一个全局Timer对象var currentTime:Long

    object Timer {
      private var currentTimeValue:Long
      def currentTimeMs = currentTimeValue
      def currentTimeMs_=(newTime:Long) { ... some checks and notifications}
      def pseudoRandom:Double = ...
    }
    

    在程序中的任何地方,我都打电话Timer.currentTimeMs来获取时间。它允许编写具有受控时间偏移的确定性测试。(注意全局变量!现在我更喜欢使用单独的实例Timer来避免并发问题。)

于 2013-09-08T09:08:01.997 回答