2010-03-04 12 views
12

Posso sapere qual è il modo più efficiente per costruire un oggetto data utilizzando un giorno, un mese e un anno specifici.Data di costruzione - Un modo efficace

Date(int year, int month, int day) 

Questo costrutto è ammortizzato. Quindi, quello che faccio di solito è:

Calendar calendar = Calendar.getInstance(); 
Date date = calendar.set(year, month, date).getTime(); 

Tuttavia, la mia comprensione è che Calendar.getInstance() è piuttosto costoso. Qual è il modo più efficiente per costruire un oggetto Date? O dovrei semplicemente usare Date (int anno, int mese, int giorno) tranquillamente senza dire il resto?

Si consiglia di non utilizzare librerie di terze parti.

+1

Qualsiasi motivo specifico per non utilizzare una libreria di terze parti? Joda Time è un'API * molto * migliore di quella integrata. A meno che tu non abbia davvero una buona ragione per non usarlo, ti raccomando caldamente di saltarci sopra. –

+1

Sì. So che 9 su 10 mi suggeriranno di usare Joda Time. Ecco perché ho inserito un commento su nessuna libreria di terze parti :) –

+0

Penso che se non vuoi librerie, sei praticamente bloccato. Normalmente, 4 sviluppatori su 5 raccomanderebbero Joda Time per qualsiasi data correlata. – sfussenegger

risposta

15

Con questo è possibile evitare la creazione di istanze "ora in ora".

Date coolDate = new GregorianCalendar(year, month, day).getTime(); 

È possibile controllare GregorianCalendar javadoc per altri costruttori. Hai data + ora e fuso orario.

In ogni caso sono d'accordo con Jon Skeet che non è così costoso. Sono d'accordo con te che il codice non ha bisogno di un'inizializzazione "ora" predefinita.

+0

+1 per la costruzione diretta, ma attenzione a utilizzare un calendario specifico. – medopal

+0

Sì. Comprendo che l'uso di giorno, mese, anno implica una conoscenza del calendario utilizzato (ma se si tratta della gestione generica di DMY ... non esiste un metodo per creare il calendario ... :) – helios

+1

Il punto di utilizzo di 'Calendar.getInstance () 'è per consentire differenze specifiche della locale. Creare un 'GregorianCalendar' butta direttamente questo vantaggio per salvare ... una riga di codice. Sarebbe meglio semplicemente mettere la creazione in un metodo statico di fabbrica. – cletus

6

"Piuttosto costoso" è un po 'vago. Hai provato a utilizzare il codice che hai fornito, misurato e trovato che sia troppo costoso? Hai un'idea concreta di quanto sia economica questa operazione?

Inoltre, non è stato specificato il fuso orario desiderato per rappresentare il valore in Date. UTC? Il fuso orario predefinito? A che ora del giorno vuoi che sia - a mezzanotte o all'ora attuale? Il tuo codice attuale manterrà l'ora attuale - è davvero quello che vuoi?

(Come ho detto in un commento, ti consiglio vivamente di passare a Joda Time, ma anche se non lo fai, dovresti comunque controllare se hai effettivamente avuto un problema con il tuo codice esistente prima di guardare per una soluzione.)

+2

Joda Time è probabilmente eccessivo. "Costoso" in relazione ai calendari è qualcosa che era vero nei 1.4 giorni di JDK che è persistito. Ero sotto lo stesso equivoco come l'OP fino a quando l'ho testato e potrebbe facilmente istanziare centinaia di migliaia di questi un secondo senza problemi. – cletus

+2

@cletus: La maggior parte della ragione per cui raccomando Joda Time non è quella di accelerare la procedura, ma di utilizzare un'API migliore. Suppongo che se sta creando un appuntamento, lo userà anche lui. Joda Time è semplicemente un modo migliore di gestire date e orari, periodo. –

+1

Ci si deve chiedere se Joda Time è diventato Java cosa è diventato jQuery in Javascript: qualcosa ha sempre suggerito. :) – cletus

1

Qualunque cosa si utilizza, finché è nella API Java Standard, che comporterà l'utilizzo di Calendar (sia il Date costruttore e SimpleDateFormat usarlo internamente), quindi non c'è motivo di preoccuparsi riguardo presunta inefficienza di tale classe.

1

vorrei semplicemente fare questo:

DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
Date thisDate = formatter.parse("2010-03-04"); 

E 'abbastanza efficiente da un punto di vista righe di codice; Non posso parlare con la sua efficienza di runtime vis a vis Calendar.

Problemi correlati