【问题标题】:How to remove milliseconds, seconds, minutes and hours from Date [duplicate]如何从日期中删除毫秒、秒、分钟和小时 [重复]
【发布时间】:2013-07-04 02:28:16
【问题描述】:

我遇到了一个问题,我想比较两个日期。但是,我只想比较年、月和日。这就是我能做到的:

 private Date trim(Date date) {

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.MILLISECOND, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.HOUR, 0);
        return calendar.getTime();
    }

我使用此功能来修剪除日、月和年之外的所有单位。

现在,问题是您对此有何看法? 你知道其他方法吗?

谢谢

【问题讨论】:

  • 我真的不明白问题出在哪里??
  • 看起来像干净的代码,访问 Date 类的任何其他代码都会更大,很可能你为什么要改变真的哈哈。
  • 您生成输出的用户的时区是否与运行 JVM 的平台的 timzeone 相同? :)
  • 我标记为重复的问题中未接受的答案指的是其他库和类,您可以使用它们更干净地使用Dates,除了接受的答案基本上具有和你的代码一样。
  • 我也会给这个函数起个名字。当与日期一起使用时,Trim 并没有真正说明什么。也许像trimTimeOfDayInformation 这样的东西可能更明确一些。

标签: java date


【解决方案1】:

我假设您想比较两个日期,而您只想比较 yearmonthday

您所做的很好,即删除 hourminutesecondmillisecond。这两个日期都必须这样做。

修剪完成后,您必须使用Date 类中的compareTo 方法。

您可以使用以下代码 -

if(date1.compareTo(date2) < 0) {
  // date1 is earlier
} else if(date1.compareTo(date2) > 0) {
  // date 2 is earlier
} else {
  // both dates are equal
}      

【讨论】:

  • 我不认为我真的需要那个。 date1.before(date2) 似乎更好。
  • 是的。希望对你有所帮助。
【解决方案2】:

您的代码有效且易于阅读。我没有发现任何问题或更改它的原因。

【讨论】:

  • 谢谢你。但是,我一直在寻找像“Stephen C”这样的答案。
【解决方案3】:

现在,问题是您这样做的目的是什么?

它看起来简单而合理。您正在创建一个新的 Date 和一个临时的 Calendar 对象,但这只是很小的开销。 (...除非您使用它对大型数据结构进行排序/排序...)

IMO,可能不需要更改它。

您知道其他方法吗?

  1. 开发/使用Comparator&lt;Date&gt; 仅使用您感兴趣的字段,使用Calendar 提取它们。

    这是否有帮助取决于您当前进行比较的方式。比较器可能更整洁。但另一方面,您最终可能会重复进行转换,而Comparator&lt;Date&gt; 不会为您提供任何缓存转换后日期的空间。

  2. 使用Date.getTime() 返回的值进行计算。大致是这样的:

    long val = date.getTime(); // milliseconds since 'epoch' in UTC 
    val = val + /* local timezone offset in milliseconds */  
    long day = val / (1000 * 60 * 60 * 24); // days since "local" epoch.
    
    // repeat for other Date, and compare the 'day' numbers as integers
    

    解释,做一些简单的算术应该比使用Calendar(或其他)更有效。代码有点晦涩,但应该对具有合理数学技能的人来说是显而易见的。

【讨论】:

  • 谢谢,这个答案正是我想要的。
  • 第二个建议没有考虑夏令时或闰秒的任何变化。它只会告诉您两个日期是否在 24 小时内,您可以更简单地通过计算 24 小时内的毫秒数。除非这正是您想要的,否则只需使用您现有的代码,这对于读者的意图来说非常更明显。
  • @SimonC - 相关的“代码”实际上是一个注释。是否考虑夏令时(或不考虑)取决于您如何实现它。 (但是是的,这确实使事情复杂化了。)我很确定闰秒是无关紧要的。它们通过调整 UTC 基线时间来工作......
  • @StephenC,您给出的公式没有给出自纪元以来的日历天数,而是给出了 24 小时周期数。您需要知道自纪元以来在本地日历中添加/删除的夏令时小时数。据我了解,闰秒被插入到当天,所以有一些日历日包含24 * 60 * 60 + 1 秒。这会进一步扭曲你的计算。除非有真的很好的理由不这样做,否则时间计算应始终由库完成(已被许多人测试过)。
  • @SimonC - 我不明白你关于计算的观点。由于夏令时而添加和删除的小时数将平衡......模数可以从当前 DST 状态和数量计算得出。你对闰秒是不正确的。正如我所说,它们是通过调整 UTC 基线时间来处理的。当有闰秒时,时间服务器报告的实际时间会发生变化......并且所有同步的时钟都会发生变化。出于正常的日历目的,这将被忽略。
【解决方案4】:

你可以试试这个,因为日期的格式是固定的:

    String first = date1.toString().substring(4,10) + " " + date.toString().substring(24, 28);
    String second = date2.toString().substring(4,10) + " " + date.toString().substring(24, 28);

哪个会输出

1969 年 12 月 31 日

1969 年 1 月 6 日

然后比较结果。

return (first.equals(second));

我不知道它是否比你的想法更好,但你会得到相同的结果。

【讨论】:

  • 这仅在您想比较日期是否相等时才有效。而且它确实效率低下......而且不可移植,因为 if 取决于特定于语言环境的默认字符串格式。
  • 感谢您的回答,但我无法使用 if(date1.before(date2)) ... :)
【解决方案5】:

你真的需要使用java.util.Date 吗?如果您可以切换到joda time,您会发现非常好的功能,例如:

dateTime.dayOfMonth().roundFloorCopy()

这正是您需要的。

【讨论】:

  • 这是我一直在寻找的一种答案,但是我的项目很小,我不需要添加更多依赖项:)
  • Joda 是现在的主流,所以你不必担心使用一些不起眼的库......无论项目多么小,如果你想做任何日志记录,你应该使用slf4j,如果你正在编写测试——testng,如果你关心日期/时间,你需要 Joda(或者他们的替代品,当然——不想在这里开始一场宗教战争)。
  • 你说得对可能以后我会加乔达
猜你喜欢
  • 1970-01-01
  • 2012-06-08
  • 2017-06-10
  • 2018-12-25
  • 1970-01-01
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多