2016-12-26 2 views
0

Время в Epoch - это количество миллисекунд, прошедших с 1 января 1970 года, поэтому, если я хочу добавить x дней к этому времени, кажется естественным добавить миллисекунды, эквивалентные x дням, чтобы получить результатДобавление дней в эпоху Epoch [Java]

Date date = new Date(); 
System.out.println(date); 
// Adding 30 days to current time 
long longDate = date.getTime() + 30*24*60*60*1000; 
System.out.println(new Date(longDate)); 

дает следующий вывод

Mon Dec 26 06:07:19 GMT 2016 
Tue Dec 06 13:04:32 GMT 2016 

Я знаю, что я могу использовать Calendar класс, чтобы решить эту проблему, а просто хотел понять об этом поведении

ответ

3

Его так как JVM обрабатывает значение умножения 30 * 24 * 60 * 1000 как Int И результат умножения выходит за пределы диапазона Integer, он даст результат: -1702967296 рассчитан на 2592000000, поэтому дата его дате меньше текущей даты

Попробуйте код ниже:

public class Test { 
public static void main(final String[] args) { 
    Date date = new Date(); 
    System.out.println(date); 
    // Adding 30 days to current time 
    System.out.println(30 * 24 * 60 * 60 * 1000); // it will print -1702967296 
    long longDate = (date.getTime() + TimeUnit.DAYS.toMillis(30)); 
    System.out.println(TimeUnit.DAYS.toMillis(30)); 
    date = new Date(longDate); 
    System.out.println(date); 
} 
} 
0

Попробуйте это:

DateTime timePlusTwoDays = new DateTime().plusDays(days); 
long longDate = timePlusTwoDays.getTime(); 
System.out.println(new Date(longDate)); 

Dateime класс имеет:

public DateTime plusDays(int days) { 
     if (days == 0) { 
      return this; 
     } 
     long instant = getChronology().days().add(getMillis(), days); 
     return withMillis(instant); 
} 
2

Вы нажимаете на целое число с вашим номером. 30 * 24 * 60 * 60 * 1000 = 2,592,000,000, что больше, чем 32-битное целое число, подписанное под подпиской (2 147 483 647).

Вместо этого используйте longs, добавив L на любой из чисел: 1000L, например.

Обратите внимание, что если вы хотите иметь дело с летним временем (не говоря уже о прыжках секунд!), Этого все равно будет недостаточно. Но если вы согласны с тем, что день всегда ровно 24 часа, использование долгого времени поможет решить вашу проблему. (Время сложная вещь, и я предложил бы использовать библиотеку как Joda или Java 8 в классе, чтобы сделать это за вас!)

0

Изменить код следующим образом:

long longDate = date.getTime() + 30*24*60*60*1000L; 

Он будет работать точно.