2010-05-10 62 views
13

ho bisogno di un programma Java per ottenere la data corrente senza un timestamp:programma Java per ottenere la data corrente senza timestamp

Date d = new Date(); 

mi dà la data e timestamp.

Ma ho bisogno solo della data, senza un timestamp. Uso questa data per confrontarla con un altro oggetto data che non ha un timestamp.

sulla stampa

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

di d dovrebbe stampare May 11 2010 - 00:00:00.

+1

Vuoi confrontare due date per vedere se sono nello stesso giorno (ignorando il tempo), o vuoi stampare una data senza la parte del tempo? Ho avuto l'impressione che volevi il primo, ma le risposte sembrano pensare che tu voglia il secondo –

+0

Bene, prima parla del confronto, e poi dà a stamparlo come un esempio per indicare cosa intende per nessun timestamp, quindi sto indovinando che vuole davvero confrontare il tempo piuttosto che stamparlo, ma se è quello che vuole, probabilmente non dovrebbe aver menzionato la stampa, dal momento che confonde il problema. –

risposta

36

Un java.util.Date oggetto è una sorta di timestamp - contiene un certo numero di millisecondi dal 1 gennaio 1970, 00:00:00 UTC. Pertanto non è possibile utilizzare un oggetto standard Date per contenere solo un giorno/mese/anno, senza un orario.

Per quanto ne so, non esiste un modo davvero semplice per confrontare le date prendendo in considerazione solo la data (e non l'ora) nell'API Java standard. È possibile utilizzare la classe Calendar e deselezionare le ore, minuti, secondi e millesimi di secondo:

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); 

Fate lo stesso con un altro oggetto Calendar che contiene la data che si desidera confrontare, e utilizzare le after() o before() metodi per fai il confronto.

Come spiegato nel Javadoc di java.util.Calendar.clear (campo int):

Il HOUR_OF_DAY, ORA e AM_PM campi vengono gestiti in modo indipendente e la risoluzione regola per l'ora del giorno viene applicata. Cancellare uno dei campi non ripristina il valore dell'ora del giorno di questo calendario. Usa set (Calendar.HOUR_OF_DAY, 0) per ripristinare il valore dell'ora.

modifica - La risposta sopra è del 2010; in Java 8, c'è una nuova data e ora API nel pacchetto java.time che è molto più potente e utile delle vecchie classi java.util.Date e java.util.Calendar. Usa le nuove classi di data e ora invece di quelle vecchie.

+1

Non sapevo di cal.clear(), ho intenzione di rubarlo e aggiornare la mia risposta. – staticman

+0

Puoi farlo se mi dai +1 ;-) – Jesper

+0

Nessun problema, già fatto. – staticman

4

Si potrebbe utilizzare

// 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" 

Date un'occhiata al Formatter API documentation.

+0

Non passerò nessuna data come hai detto. – minil

+0

Aggiornamento del codice per passare a GregorianCalendar.getInstance() che restituisce la data corrente. – aioobe

+1

Perché usare 'GregorianCalendar' in modo esplicito - perché non usare semplicemente' 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

È sempre possibile utilizzare la classe apache commons 'DateUtils. Ha il metodo statico isSameDay() che "Verifica se due oggetti data sono nello stesso giorno ignorando l'ora."

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

Ho letto la documentazione di isSameDay e non capisco come funziona. Come può determinare il giorno senza usare il fuso orario? a volte due istanze di Date possono essere nello stesso giorno o in giorni diversi (prima e dopo mezzanotte) a seconda del fuso orario che si assume. Assume il fuso orario predefinito del sistema? –

+1

Non so esattamente cosa faccia. Dovresti guardare la fonte per essere sicuro. Tuttavia, se si guarda l'API Date, sembra che faccia tutto in base al fuso orario locale. In effetti, tutti i suoi metodi relativi alla conversione in altri fusi orari sono deprecati. Quindi, date davvero sembra che non abbia a che fare con i fusi orari. Se vuoi fare qualcosa con i fusi orari, guarda Calendar. –

+0

La data internamente è millisecondi da "1 gennaio 1970, 00:00:00 GMT". Mi aspetterei che anche i calcoli giornalieri siano in GMT. – ToolmakerSteve

0

Penso che funzionerà. Usa il calendario per manipolare i campi del tempo (azzerarli), quindi ottenere la data dal 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(); 

Oppure fare il contrario. Mettere la data che si desidera confrontare in un calendario e confrontare i giorni del calendario

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

Ecco un modo poco elegante di farlo veloce senza ulteriori dipendenze.
Si potrebbe semplicemente usare java.sql.Date, che estende java.util.Date sebbene per i confronti si dovrà confrontare le stringhe.

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); 

uscita:

Date1 attuale: 2010-05-10
Date2 attuale: 2010-05-10
confronto data è falsa
confronto String è vero

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

Ho fatto come segue e ha funzionato:

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 

Eseguire questa operazione per altre istanze a cui si desidera confrontare. Questa logica ha funzionato per me; Ho dovuto confrontare le date se sono uguali o no, ma è possibile fare paragoni diversi (prima, dopo, è uguale, etc.)

7

ho fatto come segue e ha funzionato: (data corrente senza timestamp)

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

è possibile ottenere da questa data:

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

Se davvero si vuole utilizzare una data invece per un calendario per il confronto, questo è il pezzo più breve di codice è possibile utilizzare:

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

In questo modo si assicura che i valori di ore/minuti/secondi/millisecondi siano vuoti.

0

Stavo cercando la stessa soluzione e il seguente ha funzionato per me.

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(); 

Si prega di notare che sto usando calendar.set (Calendar.HOUR_OF_DAY, 0) per HOUR_OF_DAY invece di utilizzare il metodo chiaro, perché si suggerisce in javadocs del metodo Calendar.clear come la seguente

I campi HOUR_OF_DAY, HOUR e AM_PM vengono gestiti in modo indipendente e viene applicata la regola di risoluzione per l'ora del giorno. Cancellare uno dei campi non ripristina il valore dell'ora del giorno di questo calendario. Utilizzare set (Calendar.HOUR_OF_DAY, 0) per reimpostare il valore dell'ora.

Con la soluzione sopra postato ottengo uscita come

Wed Sep 11 00:00:00 EDT 2013 

Usando metodo chiaro per HOUR_OF_DAY resetta ora a 12 durante l'esecuzione dopo le 12 o 00 durante l'esecuzione prima 12:00.

8

Usa DateFormat per risolvere questo 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

Questo è un modo semplice per ottenere la data nel formato desiderato. – Janpan

1

Il accepted answer by Jesper è corretto, ma ormai superata. Le classi java.util.Date e .Calendar sono notoriamente problematiche. Evitalo.

java.time

utilizzare invece il quadro java.time, integrato in Java 8 e versioni successive, back-ported to Java 6 & 7 e further adapted to Android.

Se davvero non ti importa dell'ora e dei fusi orari, utilizza LocalDate nel framework java.time().

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

essere consapevoli che se avete qualsiasi possibilità di dover trattare con gli altri fusi orari o UTC, questo è il modo sbagliato di procedere. I programmatori ingenui tendono a pensare di non aver bisogno di fusi orari quando invece lo fanno.

Chiamare toString per generare una stringa nel formato standard ISO 8601.

String output = localDate.toString(); 

2014-05-06

Per gli altri formati, cercare Stack Overflow per DateTimeFormatter di classe.

Joda Time

se ora soppiantato da java.time, è possibile utilizzare il simile LocalDate di classe nella libreria Joda-Time (l'ispirazione per java.time).

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

Inoltre è possibile utilizzare comuni apache lib DateUtils.truncate():

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

tempo sarà impostato 00:00:00 modo da poter lavorare con questa data o stamparla formattato:

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

Ecco il mio codice per ottenere una sola data:

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)); 
Problemi correlati