Quiero hacer algo como:
Date date = new Date(); // current date
date = date - 300; // substract 300 days from current date and I want to use this "date"
¿Cómo hacerlo?
java.util.Date
ahora son heredadas , suplantadas por las clases java.time .
Quiero hacer algo como:
Date date = new Date(); // current date
date = date - 300; // substract 300 days from current date and I want to use this "date"
¿Cómo hacerlo?
java.util.Date
ahora son heredadas , suplantadas por las clases java.time .
Respuestas:
Con el cambio de API de fecha y hora de Java 8, use LocalDate
LocalDate date = LocalDate.now().minusDays(300);
Del mismo modo puedes tener
LocalDate date = someLocalDateInstance.minusDays(300);
Consulte https://stackoverflow.com/a/23885950/260990 para la traducción entre 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 cal = Calendar.getInstance();
cal.setTime(dateInstance);
cal.add(Calendar.DATE, -30);
Date dateBefore30Days = cal.getTime();
java.util.Date
, java.util.Calendar
y java.text.SimpleTextFormat
ahora están legado , suplantados por los java.time clases. Ver Tutorial de Oracle .
@JigarJoshi es la buena respuesta, y por supuesto también la recomendación de @Tim para usar. joda-time .
Solo quiero agregar más posibilidades para restar días de a java.util.Date
.
Una posibilidad es usar apache-commons-lang . Puedes hacerlo usando DateUtils
lo siguiente:
Date dateBefore30Days = DateUtils.addDays(new Date(),-30);
Por supuesto, agregue la commons-lang
dependencia para hacer solo restar fecha, probablemente no sea una buena opción, sin embargo, si ya está usando commons-lang
, es una buena opción. También hay métodos convenientes a addYears
, addMonths
, addWeeks
y así sucesivamente, echar un vistazo a la API aquí .
Otra posibilidad es aprovechar las novedades LocalDate
de Java 8 utilizando el minusDays(long days)
método:
LocalDate dateBefore30Days = LocalDate.now(ZoneId.of("Europe/Paris")).minusDays(30);
LocalDateTime
ya que esa clase no tiene un concepto de zona horaria ni compensación de UTC. Úselo solo cuando la zona / desplazamiento es desconocida o no relevante. En su lugar, use LocalDate
y pase un ZoneId
al llamar a su now
método. Ver la respuesta correcta de Jacob van Lingen.
Simplemente use esto para obtener la fecha antes de 300 días, reemplace 300 con sus días:
Date date = new Date(); // Or where ever you get it from
Date daysAgo = new DateTime(date).minusDays(300).toDate();
Aquí,
DateTime
es org.joda.time.DateTime;
Date
es java.util.Date
API de Java 8 Time:
Instant now = Instant.now(); //current date
Instant before = now.minus(Duration.ofDays(300));
Date dateBefore = Date.from(before);
java.time
podría ayudar. Además, generalmente se espera alguna discusión / explicación en Stack Overflow en lugar de solo un fragmento de código. Definitivamente debe explicar, Duration
ya que ese es el valor agregado de su Respuesta sobre la existente de van Lingen .
Como puede ver AQUÍ, hay mucha manipulación que puede hacer. ¡Aquí un ejemplo que muestra lo que puedes hacer!
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
y java.text.SimpleDateFormat
ahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y posteriores. Ver Tutorial de Oracle .
Con Java 8 es realmente simple ahora:
LocalDate date = LocalDate.now().minusDays(300);
Una gran guía para la nueva API se puede encontrar aquí .
now
método. Si se omite, la zona horaria predeterminada actual de la JVM se aplica implícita y silenciosamente. Ese valor predeterminado queda fuera de su control y puede cambiar en cualquier momento, incluso durante el tiempo de ejecución. Ejemplo: LocalDate.now( ZoneId.of( "America/Montreal" )
.
He creado una función para facilitar la tarea.
Durante 7 días después de la fecha dateCalculate(dateString,"yyyy-MM-dd",7);
Para obtener 7 días hasta la fecha 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
y java.text.SimpleDateFormat
que ahora están legado , suplantados por los java.time clases. Ver Tutorial de Oracle .
LocalDate.parse( "2017-01-23").plusWeeks( 1 )
es más simple que escribir su propio método y es más autodocumentado.
Puede restar fácilmente con el calendario con 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()));