【问题标题】:Best Duration type in Java or .NetJava 或 .Net 中的最佳持续时间类型
【发布时间】:2009-11-05 12:37:54
【问题描述】:

我见过很多方法,其中方法需要 long 或 int 来表示以纳秒、毫秒(最常见)、秒甚至天为单位的持续时间。这也是查找错误的好地方。

一旦您意识到您可以将持续时间设置为一定的秒数,或者更适合人类对时间感知的间隔,那么问题也非常复杂,因此 24 小时的持续时间总是第二天在同一个“挂钟”时间。或者一年是 365 天或 366 天,具体取决于日期,因此从 2 月 28 日开始的一年始终是 2 月 28 日。

为什么没有不同的类型来表示这个?我在 Java 或 .net 中都没有找到

【问题讨论】:

  • 你会怎么称呼一个表示绝对毫秒数的对象和一个表示“人类友好”的时间感知的对象?

标签: java .net


【解决方案1】:

在 .Net 中,您可以使用 TimeSpan structure 来表示时间长度。

【讨论】:

  • 许多程序员不知道这种结构的存在,因为他们没有看到它在本机 C# 或 VB.NET 数据类型中表示 - 投票支持你 - 鼓励更多人这样做,所以经常这样做遗漏的数据类型众所周知。
  • 当然,如果您在 .NET 中减去或添加日期,则会返回 TimeSpan。
  • 是的,但这并不完全符合最初的问题。例如,没有 TimeSpan.FromYears(int) 方法。在内部,它被测量为一个 64 位无符号整数,其中包含自某个时期以来的毫秒数。无论月份长度和闰年如何,都没有适用于所有情况的月/年的抽象概念。我认为 .NET BCL 中不存在这种类型。
【解决方案2】:

对于 Java,请查看 Joda(一个直观且一致的日期/时间库)及其 DurationPeriod 类。 DateTime 对象可以通过这些对象处理添加和操作。

(答案已更改以反映下面关于 Period 类的 cmets)

【讨论】:

  • Joda 的 Duration 类只是一个 ms 值的包装,不能正确表示像“一天”这样的更长的持续时间。
  • True - 但是 Joda 提供了 DurationPeriod 类来表示类似的概念。后者不是确切的毫秒数,但可以是“一天”或“一个月”,其确切的实际持续时间取决于它们所应用的间隔的开始。
  • ...如果我正确理解他的要求,这实际上正是 OP 所要求的 - joda-time.sourceforge.net/key_period.html
  • 这看起来确实更相关。我已经编辑以突出显示上述内容。
【解决方案3】:

这不是一个简单的问题。也许Joda-Time 对您来说是一个有用的库。它有一个 Duration 类,可以满足您的要求。

【讨论】:

    猜你喜欢
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2015-06-10
    • 1970-01-01
    • 2020-05-20
    • 2012-09-11
    • 1970-01-01
    相关资源
    最近更新 更多