【问题标题】:Get Previous Day [duplicate]获取前一天 [重复]
【发布时间】:2009-05-27 09:20:33
【问题描述】:

可能重复:
How to determine the date one day prior to a given date in Java?

如果我有一个 Java.Util.Date 对象,获取表示过去 24 小时的对象的最佳方法是什么?

【问题讨论】:

  • 切换到 Calendar 对象,它们是 100% 更容易做这样的事情。
  • 如果问题是 24 小时而不是一天,这可能不是骗人的。需要澄清一下。
  • 您应该知道,由于夏令时,有些日子有 23 或 25 小时,因此“前一天”与“24 小时前”不同。约会是一件讨厌的事。
  • 正确的是:“过去 24 小时”还是“前一天同一小时”? (((一台计算机按照您的程序进行操作,而不是您希望它执行的操作...))

标签: java datetime date


【解决方案1】:

使用 Java 1.6 java.util.Calendar.add

public static Date subtractDay(Date date) {

    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.add(Calendar.DAY_OF_MONTH, -1);
    return cal.getTime();
}

其他人建议使用Joda Time,目前是JSR 310,以后应该包含在Java本身中。

【讨论】:

  • 我会删除方法上下文 - 它不会添加任何内容,让我为它缺乏灵活性而畏缩。
  • 在 1.6 中期待这一点...日期一直是我在 Java 中的一个问题
【解决方案2】:

要记住的重要一点是,Date 类应该代表任何时间点,而 Calendar 类用于操作这些时间点。最后,SimpleDateFormat 会将它们表示为字符串。

因此,最好的方法是使用 Calendar 类为您计算新的 Date。这将确保考虑到任何变幻莫测(夏令时、闰年等)。

我假设您并不是真的想查找“24 小时前”,但实际上确实想要一个表示“昨天的这个时间”的新 Date 实例 - 无论哪种方式,您都可以向 Calendar 实例询问 24 小时前的日期到另一个或 1 天前。

夏令时就是一个很好的例子。英国于 2009 年 3 月 26 日“突飞猛进”。因此,在凌晨 3 点前 1 天。 2009 年 3 月 26 日应该会产生 3.00a.m. 2009 年 3 月 25 日,但提前 24 小时将产生 2.00a.m.

public class DateTests extends TestCase {
  private static String EXPECTED_SUMMER_TIME = "2009.Mar.29 03:00:00";
  private static String EXPECTED_SUMMER_TIME_LESS_DAY = "2009.Mar.28 03:00:00";
  private static String EXPECTED_SUMMER_TIME_LESS_24_HRS = "2009.Mar.28 02:00:00";
  private static String EXPECTED_SUMMER_TIME_LESS_FURTHER_24_HRS = "2009.Mar.27 02:00:00";

  public void testSubtractDayOr24Hours() {

    SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MMM.dd HH:mm:SS");

    Calendar calendar = Calendar.getInstance();

    // Create our reference date, 3.00 a.m. on the day the clocks go forward (they 'went' forward at 02.00)
    calendar.clear();
    calendar.set(2009, 2, 29, 3, 0);

    Date summerTime = calendar.getTime(); // Sun Mar 29 03:00:00 BST 2009
    String formattedSummerTime = formatter.format(summerTime);
    calendar.add(Calendar.DAY_OF_MONTH, -1);

    // Our reference date less 'a day'
    Date summerTimeLessADay = calendar.getTime(); // Sat Mar 28 03:00:00 GMT 2009
    String formattedSummerTimeLessADay = formatter.format(summerTimeLessADay);

    // reset the calendar instance to the reference day
    calendar.setTime(summerTime);

    // Our reference date less '24 hours' (is not quite 24 hours)
    calendar.add(Calendar.HOUR, -24);
    Date summerTimeLess24Hrs = calendar.getTime(); // Sat Mar 28 02:00:00 GMT 2009
    String formattedSummerTimeLess24Hrs = formatter.format(summerTimeLess24Hrs);

    // Third date shows that taking a further 24 hours from yields expected result
    calendar.add(Calendar.HOUR, -24);
    Date summerTimeLessFurther24Hrs = calendar.getTime(); // Fri Mar 27 02:00:00 GMT 2009
    String formattedSummerTimeLessFurther24Hrs = formatter.format(summerTimeLessFurther24Hrs);

    // reset the calendar once more to the day before
    calendar.setTime(summerTimeLess24Hrs);

    // Take a 'day' from the Sat will yield the same result as date 03 because Daylight Saving is not a factor
    calendar.add(Calendar.DAY_OF_MONTH, -1);
    Date summerTimeLessFurtherDay = calendar.getTime(); // Fri Mar 27 02:00:00 GMT 2009
    String formattedSummerTimeLessFurtherDay = formatter.format(summerTimeLessFurtherDay);

    assert(formattedSummerTime.equals(EXPECTED_SUMMER_TIME));
    assert(formattedSummerTimeLessADay.equals(EXPECTED_SUMMER_TIME_LESS_DAY));
    assert(formattedSummerTimeLess24Hrs.equals(EXPECTED_SUMMER_TIME_LESS_24_HRS));

    assert(formattedSummerTimeLessFurther24Hrs.equals(EXPECTED_SUMMER_TIME_LESS_FURTHER_24_HRS));

    // This last test proves that taking 24 hors vs. A Day usually yields the same result
    assert(formattedSummerTimeLessFurther24Hrs.equals(formattedSummerTimeLessFurtherDay));

  }
}

对于测试日期函数,wwwdot-timeanddate-dot-com 是一个很好的资源。

【讨论】:

    【解决方案3】:

    从时间中减去 1000*60*60*24 并创建一个新日期。

    Date yesterday = new Date(d.getTime() - (1000*60*60*24));
    

    【讨论】:

    • 这将在夏令时切换期间产生错误的结果
    • 实际上,日历是错误的。问题是过去 24 小时,而不是昨天的同一时间。
    • 几乎可以肯定问题本身是错误的,即 OP 没有考虑到这种特殊情况 - 在这一点上它不同意标题“获取前一天”
    【解决方案4】:
        int dayInMs = 1000 * 60 * 60 * 24;
        Date previousDay = new Date(olddate.getTime() - dayInMs);
    

    如果有很多时间/日期计算,我个人会选择Joda-time

    【讨论】:

    • 错误代码,夏令时开关将关闭 1 小时
    • 正如您自己在上面的 cmets 中所指出的,Nathaniel 可能没有意识到其中的区别,因此他需要重新解释他的实际意思。
    • 我明白了...我为文本(“24 小时”)而不是标题(“前一天”)赋予了更大的权重。
    猜你喜欢
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 2013-11-25
    • 2012-11-05
    相关资源
    最近更新 更多