2015-12-02 2 views
2

Если я попытаюсь вычесть от 1 до 29 дней, дата возврата верна, но если я попытаюсь вычесть более 30 дней, то дата возврата неверна. Кто-нибудь может объяснить, где я ошибаюсь?Почему вычитание более 30 дней приводит к неправильному ответу

public class MapTesting { 
    public static void main(String[] args) { 
     Date dNow = new Date(); 
     SimpleDateFormat ft = new SimpleDateFormat ("yyyy-dd-MM"); 

     try { 
      Date date = ft.parse("2011-01-10"); 
      Date su=new Date(date.getTime()-30*24*3600*1000); 
      System.out.println(su); 
      System.out.println(date); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
+0

Какой результат вы получаете, и что вы ожидали? –

+0

Что вы нашли, когда вы перешли код в своем отладчике? – csmckelvey

+3

use 30 * 24 * 3600 * 1000L – ashiquzzaman33

ответ

8

У вас переполнение внутри int: 30 * 24 * 3600 * 1000.

Попробуйте бросить Интс долго: Date su=new Date(date.getTime() - 30 * 24 * 3600 * 1000L);

+2

Я нахожу, что легче отличить, если вы используете капитал L вместо строчной буквы. Легко ошибиться '30l' за' 301', а не с '30L'. – JonK

3

Это происходит из-за целого числа сгущенного продукта/перелива.

Когда целое число будет слишком высоким, оно будет изменяться с положительного на отрицательное.

Пример этого:

System.out.println(24*24*3600*1000); // = 2073600000 
System.out.println(25*24*3600*1000); // = -2134967296 

Когда мы праздновали новое тысячелетие, люди были напуганы для этого, когда их 99 пошел перелива 00.

Чтобы устранить эту проблему, можно отливать 1 от числа до длинного 30l*24*3600*1000.

2

Как упоминалось в @ antonu17, у вас ошибка переполнения.

Если вам нужна дата до или после, вы можете непосредственно выполнить эти вычисления в календарном объекте.

Calendar cal = Calendar.getInstance(); 
cal.add (Calendar.DAY_OF_MONTH, (-/+)30); //you can add - sign to 30 if you want current date -30 days. 

Затем получите дату с этого объекта.

+0

Также взгляните на http://www.joda.org/joda-time/ – antonu17

+1

Да, но я лично чувствую, что это можно сделать, используя встроенные классы, почему использовать для сторонних библиотек или api. –

2

Конструктор даты ожидает большое значение. Код работает, если вы укажете длинные значения:

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

public class MapTesting { 
    public static void main(String[] args) { 
     Date dNow = new Date(); 
     SimpleDateFormat ft = new SimpleDateFormat("yyyy-dd-MM"); 

     try { 
      Date date = ft.parse("2011-01-10"); 
      Date su = new Date(date.getTime() - 30L * 24L * 3600L * 1000L); 
      System.out.println(su); 
      System.out.println(date); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

thats Лучшее объяснение дня .... Конструктор ждет долго ... хм ... хорошо, я получил его сейчас – user1742919

Смежные вопросы