2010-08-12 25 views
5

estoy usando una herramienta de información que sólo soportan la expresión de una líneasólo una expresión para obtener la fecha de ayer y el primer día del mes

Por ejemplo, yo quiero obtener la fecha de ayer

la clase Calendario tiene un método add, pero regresa vacía por lo

Calendar.getInstance().add(Calendar.DAY_OF_MONTH,-1).getTime() 

no funcionó

no saben cómo hacer esto

Gracias

+2

¿Ayer la fecha en qué formato? Como un objeto de calendario? Como una cadena? Como un util.Date? Como sql.Date? – Stephen

Respuesta

2

Si realmente tiene que ser una sola línea y no importa si el código es comprensible, creo que la siguiente declaración debería funcionar:

Date yesterday = new SimpleDateFormat("yyyyMMdd").parse(
    ""+(Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()))-1)); 

formatea la fecha actual como "aaaaMMdd", por ejemplo "20100812" para hoy, lo analiza como int: 20100812, resta uno: 20100811, y luego analiza la fecha "20100811" utilizando el formato anterior. También funcionará si hoy es el primero de un mes, ya que el día 0 de un mes es analizado por un formato de fecha indulgente como el último día del mes anterior.

El formato "yyyyDDD" debería funcionar también (D es el día del año).

Para el primer día del mes en curso, se puede utilizar un truco similar:

Date firstday = new SimpleDateFormat("yyyyMMdd").parse(
    new SimpleDateFormat("yyyyMM").format(new Date())+"01"); 
+0

@jarnbjo gracias ~~ funciona bien – chun

+0

@jarnbjo Lo siento, volví a verificar la pregunta y su respuesta y descubrí que había entendido mal el problema. Tu respuesta es 100% correcta. Sin resentimientos. Mis comentarios no tenían sentido, así que los borré. – vizog

4

Use Joda-Time:

new org.joda.time.DateTime().minusDays(1).toDate(); 
+1

Claro, joda otra vez, pero si está restringido a una línea, entonces realmente dudo que pueda incluir libs de terceros. –

2

¿No puedes hacer algo como

new Date(new Date().getTime() - 86400000); 

para obtener la hora actual, restar el # de milisegundos en un día, y construir una nuevo objeto de fecha de eso?

+3

Debería funcionar con 'System.currentTimeMillis()' en lugar de 'new Date(). GetTime()' también. –

+0

Buen punto. Es mejor reducir la cantidad de objetos. –

+2

La lógica es incorrecta, ya que no todos los días tienen 86400000ms. – jarnbjo

1

Suponiendo desea que un objeto java.util.Date (ya que utilizó getTime() en su pregunta y que devuelve un java.util.Date), que podría hacer:

// Get yesterday's date. System.currentTimeMillis() returns the 
// number of milliseconds between the epoch and today, and the 
// 86400000 is the number of milliseconds in a day. 
new Date(System.currentTimeMillis() - 86400000); 

Vaya, no vio su primer día de la consulta mes antes . Se me ocurrió lo siguiente para obtener eso usando util.Date, pero creo que esta es la hora en que desea cambiar a usar Joda o Calendar ... (estimado SO, por favor no me vote por la horrenda magnitud de lo siguiente. ..)

// This will return the day of the week as an integer, 0 to 6. 
new Date(System.currentTimeMillis() - ((new Date().getDate()-1) * 86400000)).getDay(); 
0

Esto se debe hacer de la siguiente manera:

Calendar cal = Calendar.getInstance(); 
cal .add(Calendar.DAY_OF_MONTH,-1); 
cal .getTime(); 

Cuando usted está haciendo esto:

Calendar.getInstance().add(Calendar.DAY_OF_MONTH,-1).getTime() 

Básicamente está pidiendo un método (add()) que devuelve vacío para ejecutar .getTime(). Eso no puede funcionar.

0

Esto es lo que yo uso en JasperReports:

// Today 
new java.util.Date().format('yyyy-MM-dd') 
// Yesterday 
new SimpleDateFormat("yyyy-MM-dd").format(new Date()-1) 

// First Day of current month 
new java.util.Date().format('yyyy') + "-" + new java.util.Date().format('MM') + "-01" 

yo prefiero usar el formato ISO YYYY-MM-DD porque es reconocido en todas partes y evitar la confusión formatos regional (dd/mm posición en el campo de la fecha).

Cuestiones relacionadas