2010-05-10 15 views
13

Necesito un programa Java para obtener la fecha actual sin una marca de tiempo:programa Java para obtener la fecha actual sin marca de tiempo

Date d = new Date(); 

me da la fecha y la marca de tiempo.

Pero solo necesito la fecha, sin una marca de tiempo. Uso esta fecha para comparar con otro objeto de fecha que no tiene una marca de tiempo.

sobre la impresión

System.out.println("Current Date : " + d) 

de d debe imprimir May 11 2010 - 00:00:00.

+1

¿Desea comparar dos fechas para ver si están en el mismo día (ignorando el tiempo), o desea sacar una fecha sin la porción de tiempo? Tengo la impresión de que querías la primera, pero las respuestas parecen pensar que quieres la segunda –

+0

Bueno, primero habla de comparar, y luego da la impresión como un ejemplo para indicar lo que quiere decir sin marca de tiempo, así que estoy adivinando que realmente quiere comparar el tiempo en lugar de imprimirlo, pero si eso es lo que quiere, probablemente no debería haber mencionado imprimirlo ya que eso confunde el problema. –

Respuesta

36

A java.util.Date objeto es una especie de marca de tiempo - que contiene un número de milisegundos desde el 1 de enero de 1970, 00:00:00 UTC. Por lo tanto, no puede usar un objeto estándar Date para contener solo un día/mes/año, sin tiempo.

Por lo que sé, no hay una manera realmente fácil de comparar fechas teniendo en cuenta la fecha (y no la hora) en la API estándar de Java. Puede utilizar la clase Calendar y despejar la hora, minutos, segundos y milisegundos:

Calendar cal = Calendar.getInstance(); 
cal.clear(Calendar.HOUR_OF_DAY); 
cal.clear(Calendar.AM_PM); 
cal.clear(Calendar.MINUTE); 
cal.clear(Calendar.SECOND); 
cal.clear(Calendar.MILLISECOND); 

Hacer lo mismo con otro objeto Calendar que contiene la fecha que desea comparar, y el uso de los after() o before() métodos a hacer la comparación

Como se explica en el Javadoc de java.util.Calendar.clear (campo int):

El HOUR_OF_DAY, HOUR y AM_PM campos se manejan de forma independiente y la resolución se aplica la regla para la hora del día. Al borrar uno de los campos, no se restablece el valor de la hora del día de este calendario. Use set (Calendar.HOUR_OF_DAY, 0) para restablecer el valor de la hora.

editar - La respuesta anterior es de 2010; en Java 8, hay una nueva API de fecha y hora en el paquete java.time que es mucho más poderosa y útil que las antiguas clases java.util.Date y java.util.Calendar. Use las nuevas clases de fecha y hora en lugar de las antiguas.

+1

No sabía de cal.clear(), voy a robarlo y actualizar mi respuesta. – staticman

+0

Puedes hacerlo si me das +1 ;-) – Jesper

+0

No hay problema, ya está hecho. – staticman

4

Usted podría utilizar

// Format a string containing a date. 
import java.util.Calendar; 
import java.util.GregorianCalendar; 
import static java.util.Calendar.*; 

Calendar c = GregorianCalendar.getInstance(); 
String s = String.format("Duke's Birthday: %1$tm %1$te,%1$tY", c); 
// -> s == "Duke's Birthday: May 23, 1995" 

Tener un vistazo a la Formatter API documentation.

+0

No pasaré ninguna fecha como mencionaste. – minil

+0

Se actualizó el código para pasar por GregorianCalendar.getInstance() que devuelve la fecha actual. – aioobe

+1

¿Por qué usar 'GregorianCalendar' explícitamente? ¿Por qué no usar' Calendar.getInstance() '? – Jesper

3
DateFormat dateFormat = new SimpleDateFormat("MMMM dd yyyy"); 
    java.util.Date date = new java.util.Date(); 
    System.out.println("Current Date : " + dateFormat.format(date)); 
11

Siempre se puede usar apache commons 'DateUtils class. Tiene el método estático isSameDay() que "Comprueba si dos objetos de fecha están en el mismo día ignorando el tiempo".

static boolean isSameDay(Date date1, Date date2) 
+0

Leo la documentación de isSameDay y no entiendo cómo funciona. ¿Cómo puede determinar el día sin usar la zona horaria? a veces, dos instancias de fecha pueden ser el mismo día o en días diferentes (antes y después de la medianoche) dependiendo de la zona horaria que se asume. ¿Asume la zona horaria predeterminada del sistema? –

+1

No sé exactamente qué hace. Tendrás que mirar la fuente para estar seguro. Sin embargo, si observa la API de fecha, parece hacer todo según la zona horaria local. De hecho, todos sus métodos relacionados con la conversión a otras zonas horarias están en desuso. Entonces, realmente parece que Date no se ocupa realmente de las zonas horarias. Si quieres hacer algo con zonas horarias, mira Calendar. –

+0

La fecha internamente es milisegundos desde "1 de enero de 1970, 00:00:00 GMT". Yo esperaría que los cómputos del día también estén en GMT. – ToolmakerSteve

0

Creo que esto va a funcionar. Utilice el calendario para manipular los campos de tiempo (restablecerlos a cero), luego obtenga la fecha del calendario.

Calendar c = GregorianCalendar.getInstance(); 
c.clear(Calendar.HOUR_OF_DAY); 
c.clear(Calendar.MINUTE); 
c.clear(Calendar.SECOND); 
c.clear(Calendar.MILLISECOND); 
Date today = c.getTime(); 

O haga todo lo contrario. Fechas de poner la fecha en la que desea comparar con un calendario en el calendario y compara

Date compareToDate; // assume this is set before going in. 
Calendar today = GregorianCalendar.getInstance(); 
Calendar compareTo = GregorianCalendar.getInstance(); 
compareTo.setTime(compareToDate); 
if(today.get(Calendar.YEAR) == compareTo.get(Calendar.YEAR) && 
    today.get(Calendar.DAY_OF_YEAR ) == compareTo.get(Calendar.DAY_OF_YEAR )) { 
    // They are the same day! 
} 
0

Aquí está una manera poco elegante de hacerlo rápido y sin dependencias adicionales.
Puede usar java.sql.Date, que extiende java.util.Date aunque para las comparaciones tendrá que comparar las cadenas.

java.sql.Date dt1 = new java.sql.Date(System.currentTimeMillis()); 
String dt1Text = dt1.toString(); 
System.out.println("Current Date1 : " + dt1Text); 

Thread.sleep(2000); 

java.sql.Date dt2 = new java.sql.Date(System.currentTimeMillis()); 
String dt2Text = dt2.toString(); 
System.out.println("Current Date2 : " + dt2Text); 

boolean dateResult = dt1.equals(dt2); 
System.out.println("Date comparison is " + dateResult); 
boolean stringResult = dt1Text.equals(dt2Text); 
System.out.println("String comparison is " + stringResult); 

Salida:

Fecha1 actual: 2010-05-10
Fecha2 actual: 2010-05-10
comparación fecha es falsa
comparación cuerdas es cierto

1
private static final DateFormat df1 = new SimpleDateFormat("yyyyMMdd"); 
    private static Date NOW = new Date(); 
    static { 
     try { 
      NOW = df1.parse(df1.format(new Date())); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
    } 
0

Hice lo siguiente y funcionó:

calendar1.set(Calendar.HOUR_OF_DAY, 0); 
calendar1.set(Calendar.AM_PM, 0); 
calendar1.set(Calendar.HOUR, 0); 
calendar1.set(Calendar.MINUTE, 0); 
calendar1.set(Calendar.SECOND, 0); 
calendar1.set(Calendar.MILLISECOND, 0); 
Date date1 = calendar1.getTime();  // Convert it to date 

Haga esto para otras instancias que desee comparar. Esta lógica funcionó para mí; Tenía que compare las fechas si son iguales o no, pero se puede hacer diferentes comparaciones (antes, después, iguales, etc.)

7

lo hice de la siguiente manera y funcionó: (Fecha y hora actual sin marca de tiempo)

SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy"); 
Date today = dateFormat.parse(dateFormat.format(new Date())); 
4

usted puede obtener por esta fecha:

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
print(dateFormat.format(new Date()); 
0

Si realmente desea utilizar una fecha en lugar de un calendario para la comparación, esto es la pieza más corta de código que puede usar:

Calendar c = Calendar.getInstance(); 
Date d = new GregorianCalendar(c.get(Calendar.YEAR), 
           c.get(Calendar.MONTH), 
           c.get(Calendar.DAY_OF_MONTH)).getTime(); 

De esta manera se asegura de que los valores de horas/minutos/segundos/milisegundos estén en blanco.

0

Estaba buscando la misma solución y lo siguiente funcionó para mí.

Calendar calendar = Calendar.getInstance(); 
    calendar.set(Calendar.HOUR_OF_DAY, 0); 
    calendar.clear(Calendar.HOUR); 
    calendar.clear(Calendar.MINUTE); 
    calendar.clear(Calendar.SECOND); 
    calendar.clear(Calendar.MILLISECOND); 

    Date today = calendar.getTime(); 

Tenga en cuenta que estoy usando calendar.set (Calendar.HOUR_OF_DAY, 0) para HOUR_OF_DAY lugar de utilizar el método claro, ya que se sugiere en javadocs del método Calendar.clear como la siguiente

Los campos HOUR_OF_DAY, HOUR y AM_PM se manejan de forma independiente y se aplica la regla de resolución para la hora del día. Al borrar un de los campos, no se restablece el valor de la hora del día de este calendario. Usar conjunto (Calendario.HOUR_OF_DAY, 0) para restablecer el valor de la hora.

Con la solución publicado anteriormente me sale salida como

Wed Sep 11 00:00:00 EDT 2013 

Usando método claro para HOUR_OF_DAY restablece hora a 12 cuando se ejecuta después de 12 o 00 cuando se ejecuta antes de las 12PM.

8

Uso DateFormat para resolver este problema:

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
DateFormat dateFormat2 = new SimpleDateFormat("MM-dd-yyyy"); 
print(dateFormat.format(new Date()); // will print like 2014-02-20 
print(dateFormat2.format(new Date()); // will print like 02-20-2014 
+0

Esta es una manera simple de obtener la fecha en el formato que desee. – Janpan

1

El accepted answer by Jesper es correcto pero ahora obsoleto. Las clases java.util.Date y .Calendar son notoriamente problemáticas. Evítales.

java.time

usar en su lugar el marco java.time, incorporado en Java 8 y versiones posteriores, back-ported to Java 6 & 7 y further adapted to Android.

Si realmente no le importan las zonas horarias y horarias, use LocalDate en el marco java.time().

LocalDate localDate = LocalDate.of(2014 , 5 , 6); 

en cuenta que si usted tiene cualquier posibilidad de tener que hacer frente a otras zonas horarias o UTC, este es el camino equivocado. Los programadores ingenuos tienden a pensar que no necesitan zonas horarias cuando de hecho lo hacen.

Llame toString para generar una cadena en formato estándar ISO 8601.

String output = localDate.toString(); 

2014-05-06

Para otros formatos, búsqueda de desbordamiento de pila para DateTimeFormatter clase.

Joda-Time

Aunque ahora suplantado por java.time, puede utilizar la clase LocalDate similares en el Joda-Time biblioteca (la inspiración para java.time).

LocalDate localDate = new LocalDate(2014, 5, 6); 
2

También se puede usar apache commons lib DateUtils.truncate():

Date now = new Date(); 
Date truncated = DateUtils.truncate(now, Calendar.DAY_OF_MONTH); 

tiempo se establecerá en 00:00:00 para que pueda trabajar con esta fecha o imprimir el formato:

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

System.out.println(dateFormat.format(now);  // 2010-05-11 11:32:47 
System.out.println(dateFormat.format(truncated); // 2010-05-11 00:00:00 
0

Aquí está mi código para obtener solo la fecha:

Calendar c=Calendar.getInstance(); 
DateFormat dm = new SimpleDateFormat("dd/MM/yyyy"); 
java.util.Date date = new java.util.Date(); 
System.out.println("current date is : " + dm.format(date)); 
Cuestiones relacionadas