在Java中存储时间的最佳方式,格式为HH:MM

时间:2013-11-01 18:45:57

标签: java time types

在做完我的研究后,我无法找到应该用于变量的方法或数据类型,以便以HH:MM的格式存储时间,我确实找到了从“14”这样的字符串中获取此方法的方法:15:10“,但我认为这不是最好的方法,因为我需要增加或减去时间。我尝试将此作为double执行,但遇到以下问题,当您有05.45存储时间并添加0.15(或15分钟)时,结果为05.60其中与HH:MM格式一样,您希望它是06.00。

我通过java文档查看但仍然是,但似乎无法找到任何方法来实现这一点,我最接近的是date格式,如dd/mm/yyyy hh:mm:ss

6 个答案:

答案 0 :(得分:5)

使用Joda Time。与标准的Java日期相比,它提供了更好的日期/时间操作操作。如果要使用内部JDK类,请使用java.util.Date

答案 1 :(得分:3)

您绝对不应该做的是将它们存储在您自己的自定义格式中。存储代表Unix Epoch的Long值。

DateTime只不过是计算机的一个数字。此数字表示自1970-01-01 00:00:00 UTC以来的秒数(或毫秒)。解释为什么这个日期被普遍选择,但你可以通过搜索Unix Epoch或阅读http://en.wikipedia.org/wiki/Unix_time来找到它。

这也意味着DateTime本身没有存储时区信息。在推理日期和时间时,请务必牢记这一点。对于诸如比较DateTime对象之类的事情,没有关于本地化或时区的任何事情。只有在格式化时间,这意味着使人类可以读取时,或者为了开始一天的操作时,时区才会发挥作用。

这也是为什么你不应该像字母一样的格式存储时间20:11:15的原因,因为没有时区信息,这些信息毫无意义。我将在这里给你一个例子:考虑时钟向后移动1小时的时刻,例如当远离夏令时时。它恰好发生在很多国家。你的字符串02:30代表什么?第一个还是第二个?

减法等计算就像对数字一样简单。例如:Date newDate = new Date(date1.getTime() - date2.getTime());。或者想要添加一个小时的约会? Date newDate = new Date(oldDate.getTime() + 1000 * 60 * 60);

如果您需要更复杂的东西,那么使用Joda时间将是一个好主意,正如已经建议的那样。但是,使用本地库也完全可以做到这一点。

如果有一种资源可以让我了解很多日期/时间,那就是http://www.odi.ch/prog/design/datetime.php

答案 2 :(得分:1)

适合您案例的答案取决于您想要做什么。

  • 您使用RDBMS作为持久性引擎吗?
  • 如果是这样,您是否已经在使用旧数据格式,或者您是否从头开始构建数据库?
  • 您只是存储此数据,还是会进行广泛的日期算术和/或优先级计算?
  • 您是否在一个时区或者您是否需要跨越多个时区处理时间问题?

所有这些都是决定如何代表您的时间和日期的重要因素。

如果您的需求需要大量的日期算术(例如,确定日期之间的天数)或基于时间戳排序,那么请考虑使用浮点日期格式。使用数字格式表示时间戳的优点是进行日期算术和比较/排序操作变得微不足道;你只做简单的算术。另一个优点是浮点数和长整数是原始数据类型。它们不需要序列化,它们已经非常轻量级,而且使用它们所需的一切都不需要外部依赖。

使用数字格式表示时间戳的主要缺点是它们不是人类友好的。您需要将它们转换为String格式或从String格式转换为允许用户进行交互。通常情况下,这是值得的。请参阅:How do I use Julian Day Numbers with the Java Calendar API?

我建议您考虑将时间戳存储为Julian Day Numbers(JDN)或Modified Julian Day Numbers(MJD)。两者都将使用8字节浮点数表示毫秒精度的日期和时间。用于转换往和来自这两者的显示格式的算法是高度标准化的。它们赋予使用数字日期的所有优点。此外,它们仅针对GMT / UTC定义,这意味着您的时间戳已经可以在开箱即用的时区中进行通用化(只要您正确本地化)。

答案 3 :(得分:1)

Java具有java.sql.Time格式,可以处理时间值。只需导入它并创建变量。

import java.sql.Time;

//now we can make time variables
Time myTime;

刚看到https://db.apache.org/derby/docs/10.4/ref/rrefsqlj21908.html

答案 4 :(得分:0)

如果您不想要完整的date对象,最好的办法是将其存储在一个字符串中,但我个人仍然会推荐date,因为它还包含许多方便的方法派上用场。您可以从date对象中获取整个时间,而忽略其余部分。

答案 5 :(得分:0)

就“存储”日期而言,您应该使用long。这是系统如何看待它以及如何执行所有计算。是的,有些人指出你最终需要创建一个字符串,这样人类就可以阅读它,但人们遇到麻烦的时候就是他们开始考虑格式方面的日期。格式是为了便于阅读,而不是用于计算。 java.util.Datejava.util.Calendar充满了问题( Effective Java ,Bloch, et al。有很多话要说)但仍然是如果您需要方便的日期操作,请注意。