在进行研究之后,我找不到应该用于变量以便以 HH:MM 格式存储时间的方法或数据类型,我确实找到了从像“14:15: 10",但我认为这不是最好的方法,因为我需要增加或减少时间。我尝试double
将05.45
其05.60
作为 .
我浏览了java文档,仍然是,但似乎找不到任何方法来实现这一点,我最接近的是date
格式dd/mm/yyyy hh:mm:ss
使用乔达时间。它提供了比标准 java 日期更好的操作来进行日期/时间操作。如果要使用内部 JDK 类,请使用java.util.Date。
从 Java 8 开始,您可以对日期和时间使用新的 API,包括 Instant、ZonedDateTime 和 LocalDateTime。这消除了对第三方库 Joda 时间的使用。它还使计算更加容易和正确。下面的建议有点过时,但仍有一些优点。
————</p>
您绝对不应该做的是以您自己的自定义格式存储它们。存储表示 Unix 纪元的 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 time 将是一个好主意,正如已经建议的那样。但是,即使使用本机库也完全有可能做到这一点。
如果有一个资源教会了我很多关于日期/时间的知识,那就是http://www.odi.ch/prog/design/datetime.php
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上看到它
适合您情况的答案取决于您想做什么。
所有这些事情都很重要,并且会影响您决定如何表示您的时间和日期。
如果您的需要需要大量的日期算术(例如,确定日期之间的天数)或基于时间戳排序,那么请考虑使用浮点日期格式。使用数字格式的时间戳的优点是进行日期算术和比较/排序操作变得微不足道;你只做简单的算术。另一个优点是浮点数和长整数是原始数据类型。它们不需要序列化,它们已经非常轻量级,使用它们所需的一切都不需要外部依赖。
使用数字格式的时间戳的主要缺点是它们对人类不友好。您需要将它们转换为字符串格式或从字符串格式转换,以允许用户进行交互。通常,这是值得的努力。请参阅:如何将儒略日数字与 Java 日历 API 结合使用?
我建议您考虑将时间戳存储为儒略日数字 (JDN) 或修改的儒略日数字 (MJD)。两者都将使用 8 字节浮点数以毫秒精度表示日期和时间。这两种显示格式的转换算法是高度标准化的。它们赋予使用数字日期的所有优点。此外,它们仅针对 GMT/UTC 定义,这意味着您的时间戳已经开箱即用地跨时区通用(只要您正确本地化)。
如果您不想要完整的date
对象,最好将其存储在字符串中,但我个人仍然建议date
,因为它还包含许多方便的方法。您可以从一个对象中获取整个时间,date
而忽略其余部分。
就“存储”日期而言,您应该使用long
. 这就是系统如何看待它以及如何执行所有计算。是的,正如某些人指出的那样,您最终将需要创建一个 String 以便人类可以阅读它,但是人们遇到麻烦的地方是当他们开始考虑格式方面的日期时。格式是为了可读性,而不是为了计算。 java.util.Date
并且java.util.Calendar
充满了问题(Effective Java、Bloch等人对此有很多话要说),但如果您需要方便的日期操作,这仍然是常态。