Date in =newDate();LocalDateTime ldt =LocalDateTime.ofInstant(in.toInstant(),ZoneId.systemDefault());Date out =Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());
Date dateBefore30Days =DateUtils.addDays(newDate(),-30);
Por supuesto, agregue la commons-langdependencia 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, addWeeksy así sucesivamente, echar un vistazo a la API aquí .
No tiene sentido usarlo, LocalDateTimeya 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 LocalDatey pase un ZoneIdal llamar a su nowmétodo. Ver la respuesta correcta de Jacob van Lingen.
Basil Bourque
1
@BasilBourque Después de su consejo, verifico la API y tiene toda la razón, por lo tanto, actualizo la respuesta. Gracias.
albciff
Brian Montellano gustaría comentar: no debe haber ninguna sen DateUtils, es sólo DateUtil.
Ole VV
@ OleV.V. Brian Montellano está equivocado, puedes consultar los DateUtilsdocumentos
albciff
33
Simplemente use esto para obtener la fecha antes de 300 días, reemplace 300 con sus días:
Date date =newDate();// Or where ever you get it fromDate daysAgo =newDateTime(date).minusDays(300).toDate();
Debo decir Java 8 API, no 7. Y mencionar el paquete java.timepodrí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, Durationya que ese es el valor agregado de su Respuesta sobre la existente de van Lingen .
Basil Bourque
Java 8 de causa, fijada
Grigory Kislin
tan cerca, pero debería ser para modificar un objeto de fecha arbitraria, no "ahora"
bharal
9
Como puede ver AQUÍ, hay mucha manipulación que puede hacer. ¡Aquí un ejemplo que muestra lo que puedes hacer!
DateFormat dateFormat =newSimpleDateFormat("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
*/
Sugiero pasar siempre la zona horaria opcional (o offset-from-UTC) a ese nowmé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" ).
Basil Bourque
debe estar en un objeto de fecha arbitraria según la pregunta, no "ahora"
bharal
1
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);
publicstaticString dateCalculate(String dateString,String dateFormat,int days){Calendar cal =Calendar.getInstance();SimpleDateFormat s =newSimpleDateFormat(dateFormat);try{
cal.setTime(s.parse(dateString));}catch(ParseException e){
e.printStackTrace();}
cal.add(Calendar.DATE, days);return s.format(cal.getTime());}
La pregunta involucra objetos de fecha y hora, no generar cadenas. Por cierto, LocalDate.parse( "2017-01-23").plusWeeks( 1 )es más simple que escribir su propio método y es más autodocumentado.
Basil Bourque
0
Puede restar fácilmente con el calendario con SimpleDateFormat
java.util.Date
ahora son heredadas , suplantadas por las clases java.time .Respuestas:
Java 8 y posterior
Con el cambio de API de fecha y hora de Java 8, use
LocalDate
Del mismo modo puedes tener
Consulte https://stackoverflow.com/a/23885950/260990 para la traducción entre java.util.Date <--> java.time.LocalDateTime
Java 7 y versiones anteriores
Use
Calendar
eladd()
métodofuente
java.util.Date
,java.util.Calendar
yjava.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
.Apache-commons
Una posibilidad es usar apache-commons-lang . Puedes hacerlo usando
DateUtils
lo siguiente:Por supuesto, agregue la
commons-lang
dependencia para hacer solo restar fecha, probablemente no sea una buena opción, sin embargo, si ya está usandocommons-lang
, es una buena opción. También hay métodos convenientes aaddYears
,addMonths
,addWeeks
y así sucesivamente, echar un vistazo a la API aquí .Java 8
Otra posibilidad es aprovechar las novedades
LocalDate
de Java 8 utilizando elminusDays(long days)
método:fuente
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, useLocalDate
y pase unZoneId
al llamar a sunow
método. Ver la respuesta correcta de Jacob van Lingen.s
enDateUtils
, es sóloDateUtil
.DateUtils
documentosSimplemente use esto para obtener la fecha antes de 300 días, reemplace 300 con sus días:
Aquí,
DateTime
esorg.joda.time.DateTime;
Date
esjava.util.Date
fuente
API de Java 8 Time:
fuente
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!
fuente
java.util.Date
,java.util.Calendar
yjava.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:
Una gran guía para la nueva API se puede encontrar aquí .
fuente
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);
fuente
java.util.Date
,java.util.Calendar
yjava.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
fuente
fuente