2012-02-02 9 views
19

Ho pensato di creare un GregorianCalendar utilizzando il costruttore che prende l'anno, il mese e il giorno, ma non riesco ad ottenere in modo affidabile quei campi da un'istanza della classe java.sql.Date. I metodi che ottengono quei valori da java.sql.Date sono obsolete, e il seguente codice mostra il motivo per cui non possono essere utilizzati:Come si converte un oggetto java.sql.Date in un GregorianCalendar?

import java.sql.Date; 
import java.util.Calendar; 
import java.util.GregorianCalendar; 

public class DateTester { 

    public static void main(String[] args) { 
     Date date = Date.valueOf("2011-12-25"); 
     System.out.println("Year: " + date.getYear()); 
     System.out.println("Month: " + date.getMonth()); 
     System.out.println("Day: " + date.getDate()); 
     System.out.println(date); 

     Calendar cal = new GregorianCalendar(date.getYear(), date.getMonth(), date.getDate()); 
     System.out.println(cal.getTime()); 
    } 
} 

ecco l'output, che mostra che il mese e l'anno non vengono restituiti correttamente dal deprecato getYear() e getMonth() metodi di Date:

Anno: 111
Mese: 11
Giorno: 25
2011-12-25
mar nov 25 00:00:00 EST 111

Dal momento che non è possibile utilizzare il costruttore che ho provato sopra, e non c'è GregorianCalendar costruttore che richiede solo un Date, come posso convertire un oggetto in una java.sql.DateGregorianCalendar?

risposta

32

È necessario eseguire questa operazione in due passaggi. Creare prima un GregorianCalendar usando il costruttore predefinito, quindi impostare la data usando il metodo (con nome confuso) setTime.

import java.sql.Date; 
import java.util.Calendar; 
import java.util.GregorianCalendar; 

public class DateTester { 

    public static void main(String[] args) { 
     Date date = Date.valueOf("2011-12-25"); 
     System.out.println(date); 

     Calendar cal = new GregorianCalendar(); 
     cal.setTime(date); 
     System.out.println(cal.getTime()); 
    } 
} 

ecco l'output:

2011-12-25
Sole 25 Dicembre 00:00:00 EST 2011

3

sto andando a memoria, ma averti provato

Calendar cal = GregorianCalendar.getInstance(); 
cal.setTime(rs.getDate()); 
+1

Da dove proviene rs.getDate()? –

+1

sorry - rs è il nome della variabile che attribuisco sempre agli oggetti ResultSet - è lì solo per rappresentare un'istanza java.sql.Date che hai già istanziato. – DaveH

+0

Non proprio la risposta più specifica, ma +1 per seguire alcuni standard che hanno reso questo il codice esatto che stavo cercando. – KjetilNordin

4

Prova questo.

import java.sql.Date; 
import java.util.Calendar; 
import java.util.GregorianCalendar; 

public class DateTester { 

    public static void main(String[] args) { 
     Date date = Date.valueOf("2011-12-25"); 
     System.out.println(date); 

     Calendar cal = new GregorianCalendar(); 
     cal.setTime(date); 
     System.out.println(cal.getTime()); 
    } 
} 
1

Uso setTimeInMillis():

java.sql.Date date = new java.sql.Date(System.currentTimeMillis()); 
Calendar cal = new GregorianCalendar(); 
cal.setTimeInMillis(date.getTime()); 

penso che questo sia il modo più semplice.