【问题标题】:Is there a good date/time API available for Scala? [closed]Scala 是否有一个好的日期/时间 API? [关闭]
【发布时间】:2011-02-20 20:29:32
【问题描述】:

我正在寻找类似于 JodaTime 或 JSR 310 for Scala 的东西,它利用了很好的 Scala 特性,例如运算符重载,并且不依赖于隐式转换(我对隐式转换有一种非理性的恐惧)。

我知道http://github.com/jorgeortiz85/scala-time,但它只是在暗示 JodaTime。

【问题讨论】:

  • 您在寻找提供 运算符的东西吗?
  • 我建议你摆脱对隐式转换的非理性恐惧。 ;-)
  • @Timo - 我想要比较操作,以及 + 和减号之类的东西。 @Jesper - 恐惧并非完全不合理。隐式会影响性能。它们可以引发与平等等事物的奇怪互动。它们依赖于类型推断,我发现混合大量依赖于类型推断的东西是绝对混淆的好方法。
  • 如果您想通过运算符重载将 JodaTime 与 Scala 一起使用以进行比较等,您可以构建 JodaTime 的替代版本,例如将 Ordered trait 方法添加到 AbstractPartial 和 AbstractInstant。我知道这是有风险的,但我也不喜欢 Pimp-my-library 使用的隐式转换。
  • 性能:热点中的逃逸分析可以消除这里的一些开销。但我还没有确切的数字。平等:如果您在 A 上定义一个“新方法”并转换为 B,那么只有在新方法中返回 B 类型的东西(不再是 A)时,才会混淆平等。我认为,这是 RichString 不对称的问题。

标签: datetime scala scala-2.8


【解决方案1】:

隐式转换没有错。即使没有将 Java 库用于底层逻辑,任何设计合理的纯 Scala 库仍然会使用隐式,允许您编写表达式,例如 5.days + 3.minutes

并非所有的隐式都是平等的,隐式转换为您可以完全控制的非常特定的类型几乎肯定是安全的。

正如其他人已经说过的,在大多数情况下,此类转换将被优化掉,尤其是在打开逃逸分析的情况下,所以不要让他们担心!

在 JSR 310 最终确定之前,joda-time 是您将获得的最佳选择。

除了需要遵循 Java 命名约定和缺乏运算符重载之外,joda-time 已经非常适合惯用的 Scala。该设计本质上非常实用,尤其是它包含不可变性的方式,因此 scalaj-time 实际上只是库的一个非常薄的包装器。

您还可以获得这样的好处,即 scalaj-time 在可用时可以轻松升级以使用 JSR 310,因此在那时迁移您的代码将不会那么痛苦。

从 2.8 开始,scala-time 已更名为 scalaj-time:http://github.com/scalaj/scalaj-time

【讨论】:

  • 我可以想象,从 Scala 的 JodaTime 包装器迁移到 Scala 的 JSR310 包装器将比直接使用这些东西(或在 Java 中)少得多痛苦。如果更改导出和修复一些类名就足够了会很有趣:-)
  • 隐式转换在包装的作用之上添加了一个半隐藏的间接层。这增加了复杂性和运行时开销。它们作为一个特性并没有错,但有时它们会被无偿使用。
  • 将裸整数转换为分钟数是否无偿?
猜你喜欢
  • 1970-01-01
  • 2010-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多