Подтвердить что ты не робот

Получить Предыдущий день

Возможный дубликат:
Как определить дату за день до указанной даты на Java?

Если у меня есть объект Java.Util.Date, каков наилучший способ получить объект, представляющий 24 часа в прошлом?

4b9b3361

Ответ 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.

Ответ 2

Важно помнить, что класс Date должен представлять любые моменты времени, в то время как класс Calendar используется для управления этими точками во времени. В последнем случае SimpleDateFormat будет представлять их как строки.

Итак, лучший способ - использовать класс Calendar для вычисления новой даты для вас. Это обеспечит учет любых капризов (летнего времени, летящих лет и т.п.).

Я предполагаю, что вы действительно не хотите найти "24 часа раньше", но на самом деле хотите, чтобы новый экземпляр Date представлял "вчерашний день" - в любом случае вы можете запросить экземпляр календаря для даты 24 часа раньше до другого или за 1 день до этого.

Летняя экономия - отличный пример. Великобритания "вышла вперед" 26 марта 2009 года. Итак, за 1 день до 3.00a.m. на 26.Mar.2009 должен давать 3,00a.m. 25.Mar.2009, но за 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));

Ответ 4

    int dayInMs = 1000 * 60 * 60 * 24;
    Date previousDay = new Date(olddate.getTime() - dayInMs);

Лично, если есть много вычислений времени и даты, я бы пошел с Joda-time.