【问题标题】:Simple date class in JavaJava中的简单日期类
【发布时间】:2011-02-16 06:43:55
【问题描述】:

在 Java 中是否有一个日期类,我可以用年、月、日、小时、分钟、秒和毫秒构造它,然后进行比较,给出两个日期值之间的毫秒数,忽略夏令时之类的东西,闰秒等?我可以为此使用日历类吗?我正在考虑这样做,但它谈到了闰秒和夏令时,我不希望这影响计算。

以下不变量始终成立很重要:

对于所有 y1、y2、m1、m2、d1、d2、h、m、s、ms:

(
    f(y1, m1, d1, h, m, s, ms).getTimeInMillis() - 
    f(y2, m2, d2, h, m, s, ms).getTimeInMillis()
) 
% 
(24 * 60 * 60 * 1000) == 0

我基本上需要知道函数 f 应该是什么。

【问题讨论】:

  • 如果您使用Calendar 与本地时区,它仍然适用闰秒吗? (对于本地时区,如果 JDK 中没有有用的值,您可以使用自己的 SimpleTimeZone 实例——我不记得了)。

标签: java date time calendar


【解决方案1】:

是的,您可以使用 Calendar 类进行计算。您可以构建日期并使用getTimeInMillis() 进行比较。

我还推荐一个joda-time java 库,它有很多日期功能。它的性能也更好。

【讨论】:

  • 日历年/月/日/时/分/秒构造函数是否忽略夏令时?
【解决方案2】:

您可以使用 Calendar 类来设置您的年、月和其他内容。

查看calendar.set()calendar.getTime() 方法的javadocs。

然后,date.getTime() 将为您提供 1970 年以来的绝对毫秒数。

【讨论】:

    【解决方案3】:

    我会尝试在你可以做的地方使用 Joda DateTime

    DateTime d1 = new DateTime(y1,m1,d1,h1,m1,s1,ms1);
    DateTime d2 = new DateTime(y2,m2,d2,h2,m2,s2,ms2);
    long delta = d1.toMillis() - d2.toMillis();
    

    同时考虑:

     DateTime d1 = new DateTime(y1,m1,d1,h1,m1,s1,ms1);
     DateTime d2 = new DateTime(y2,m2,d2,h2,m2,s2,ms2);
     Duration delta = new Duration( d1, d2);
     int days = delta.toPeriod().getDays();
    

    如果您有不寻常的需求,您可能需要查看 Joda Chronology 对象。

    【讨论】:

      【解决方案4】:

      你可以只使用 long。但是您仍然需要担心闰日。你可以做类似的比较。

      long start = System.currentTimeMillis(); // nanoTime is better for benchmarks
      // do something.
      long time = System.currentTimeMillis() - start;
      

      但是,如果您必须考虑闰年等。日历可能是最好的选择,因为日期自然是混乱的;)您可以考虑 JodaTime 库,它更好但并不简单。

      【讨论】:

        【解决方案5】:

        您可以使用DateUtils 进行日期操作。还有完整的new API since Java 8

        【讨论】:

          猜你喜欢
          • 2010-10-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-31
          • 2023-03-20
          • 2016-02-05
          • 1970-01-01
          • 2013-01-01
          相关资源
          最近更新 更多