Я хочу сделать что-то вроде:
Date date = new Date(); // current date
date = date - 300; // substract 300 days from current date and I want to use this "date"
Как это сделать?
Я хочу сделать что-то вроде:
Date date = new Date(); // current date
date = date - 300; // substract 300 days from current date and I want to use this "date"
Как это сделать?
java.util.Dateтеперь унаследованные , заменены классами java.time .
Ответы:
При изменении API даты и времени Java 8 используйте LocalDate
LocalDate date = LocalDate.now().minusDays(300);
Точно так же вы можете иметь
LocalDate date = someLocalDateInstance.minusDays(300);
Обратитесь к https://stackoverflow.com/a/23885950/260990 для перевода между java.util.Date <--> java.time.LocalDateTime
Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
Date out = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());
Используйте Calendar«S add()метод
Calendar cal = Calendar.getInstance();
cal.setTime(dateInstance);
cal.add(Calendar.DATE, -30);
Date dateBefore30Days = cal.getTime();
java.util.Date, java.util.Calendarи java.text.SimpleTextFormatтеперь наследие , вытесняется java.time классов. См. Учебник Oracle .
@JigarJoshi, это хороший ответ, и, конечно же, рекомендация @Tim. йода-время .
Я только хочу добавить больше возможностей для вычитания дней из java.util.Date.
Одна из возможностей - использовать apache-commons-lang . Вы можете сделать это DateUtilsследующим образом:
Date dateBefore30Days = DateUtils.addDays(new Date(),-30);
Конечно, добавьте commons-langзависимость, чтобы вычесть только дату, это, вероятно, не очень хороший вариант, однако, если вы уже используете commons-lang, это хороший выбор. Существует также удобные способы к addYears, addMonths, addWeeksи так далее, посмотрите на апи здесь .
Другая возможность состоит в том, чтобы воспользоваться преимуществами нового LocalDateиз Java 8 , используя minusDays(long days)метод:
LocalDate dateBefore30Days = LocalDate.now(ZoneId.of("Europe/Paris")).minusDays(30);
LocalDateTimeэтот класс, поскольку он не имеет понятия о часовом поясе или смещении от UTC. Используйте это только тогда, когда зона / смещение неизвестны или не актуальны. Вместо этого используйте LocalDateи передайте ZoneIdпри вызове его nowметода. См. Правильный ответ Якоба ван Лингена.
Просто используйте это, чтобы получить дату до 300 дней, замените 300 своими днями:
Date date = new Date(); // Or where ever you get it from
Date daysAgo = new DateTime(date).minusDays(300).toDate();
Вот,
DateTime является org.joda.time.DateTime;
Date является java.util.Date
API времени Java 8:
Instant now = Instant.now(); //current date
Instant before = now.minus(Duration.ofDays(300));
Date dateBefore = Date.from(before);
java.timeможет помочь. Кроме того, обычно ожидается некоторое обсуждение / объяснение по Stack Overflow, а не просто фрагмент кода. Вы обязательно должны объяснить, Durationпоскольку это дополнительная ценность вашего ответа по сравнению с существующим ответом ван Лингена .
Как вы можете видеть ЗДЕСЬ, вы можете выполнить множество манипуляций. Вот пример, показывающий, что вы можете сделать!
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
//Add one day to current date.
cal.add(Calendar.DATE, 1);
System.out.println(dateFormat.format(cal.getTime()));
//Substract one day to current date.
cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);
System.out.println(dateFormat.format(cal.getTime()));
/* Can be Calendar.DATE or
* Calendar.MONTH, Calendar.YEAR, Calendar.HOUR, Calendar.SECOND
*/
java.util.Date, java.util.Calendarи java.text.SimpleDateFormat, теперь унаследованы , вытеснены классами java.time, встроенными в Java 8 и новее. См. Учебник Oracle .
С Java 8 теперь это действительно просто:
LocalDate date = LocalDate.now().minusDays(300);
Большое руководство к новому API можно найти здесь .
nowметоду необязательный часовой пояс (или offset-from-UTC) . Если он опущен, текущий часовой пояс JVM по умолчанию применяется неявно и автоматически. Это значение по умолчанию находится вне вашего контроля и может измениться в любой момент, даже во время выполнения. Пример: LocalDate.now( ZoneId.of( "America/Montreal" ).
Я создал функцию, чтобы облегчить задачу.
В течение 7 дней после dateString: dateCalculate(dateString,"yyyy-MM-dd",7);
Чтобы обновить дату на 7 дней Строка: dateCalculate(dateString,"yyyy-MM-dd",-7);
public static String dateCalculate(String dateString, String dateFormat, int days) {
Calendar cal = Calendar.getInstance();
SimpleDateFormat s = new SimpleDateFormat(dateFormat);
try {
cal.setTime(s.parse(dateString));
} catch (ParseException e) {
e.printStackTrace();
}
cal.add(Calendar.DATE, days);
return s.format(cal.getTime());
}
java.util.Date, java.util.Calendarи java.text.SimpleDateFormatчто теперь наследие , вытеснили java.time классов. См. Учебник Oracle .
LocalDate.parse( "2017-01-23").plusWeeks( 1 )это проще, чем писать собственный метод, и более самодокументируется.
Вы можете легко вычесть с помощью календаря с SimpleDateFormat
public static String subtractDate(String time,int subtractDay) throws ParseException {
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.ENGLISH);
cal.setTime(sdf.parse(time));
cal.add(Calendar.DATE,-subtractDay);
String wantedDate = sdf.format(cal.getTime());
Log.d("tag",wantedDate);
return wantedDate;
}
c1.set(2017, 12 , 01); //Ex: 1999 jan 20 //System.out.println("Date is : " + sdf.format(c1.getTime()));
c1.add(Calendar.MONTH, -2); // substract 1 month
System.out.println
("Date minus 1 month : "
+ sdf.format(c1.getTime()));