Creazione di oggetti data java da anno, mese, giorno


95
int day = Integer.parseInt(request.getParameter("day"));  // 25
int month = Integer.parseInt(request.getParameter("month")); // 12
int year = Integer.parseInt(request.getParameter("year")); // 1988

System.out.println(year);

Calendar c = Calendar.getInstance();
c.set(year, month, day, 0, 0);  

b.setDob(c.getTime());

System.out.println(b.getDob());  

L'output è:

1988
Mercoledì 25 gennaio 00:00:08 IST 1989

Sto passando 25 12 1988ma ottengo 25 Jan 1989. Perché?


1
Cos'è b nel codice?
MysteryGuy

Risposte:


109

I mesi sono a base zero in Calendar. Quindi il 12 viene interpretato come dicembre + 1 mese. Uso

c.set(year, month - 1, day, 0, 0);  

5
Progettisti API IBM, designer API JavaScript. A parte questo, probabilmente nessuno. Nota che Calendar è ora obsoleto dall'API java.time di Java 8, che fa la cosa giusta.
JB Nizet,

64

Questo è il mio modo preferito prima di Java 8:

Date date = new GregorianCalendar(year, month - 1, day).getTime();

Direi che questo è un approccio più pulito di:

calendar.set(year, month - 1, day, 0, 0);

4
Il mese può essere specificato utilizzando Calendarcostanti ad es. Calendar.FEBRUARY.
Geekarist

1
Attenzione, i mesi erano numerati da zero in Java 7. Utilizzare costanti per evitare problemi.
jediz

25

java.time

Utilizzo del java.timeframework integrato in Java 8

int year = 2015;
int month = 12;
int day = 22;
LocalDate.of(year, month, day); //2015-12-22
LocalDate.parse("2015-12-22"); //2015-12-22
//with custom formatter 
DateTimeFormatter.ofPattern formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
LocalDate.parse("22-12-2015", formatter); //2015-12-22

Se hai bisogno anche di informazioni sull'ora (ora, minuti, secondi) usa una conversione da LocalDateaLocalDateTime

LocalDate.parse("2015-12-22").atStartOfDay() //2015-12-22T00:00

Buona risposta, ma specifica un fuso orario se noto. A LocalDatenon ha fuso orario e quindi non rappresenta un momento esatto sulla sequenza temporale. Se il tuo contesto indica un fuso orario, applicalo per ottenere un ZonedDateTimeoggetto: LocalDate.parse("2015-12-22").atStartOfDay( ZoneId.of( "America/Montreal" ) )
Basil Bourque

8

La rappresentazione del calendario di Java non è delle migliori, ci stanno lavorando per Java 8. Ti consiglio di utilizzare Joda Time o un'altra libreria simile.

Ecco un rapido esempio utilizzando LocalDate dalla libreria Joda Time:

LocalDate localDate = new LocalDate(year, month, day);
Date date = localDate.toDate();

Qui puoi seguire un tutorial di avvio rapido.


6

Vedi JavaDoc :

mese: il valore utilizzato per impostare il campo del calendario MESE. Il valore del mese è in base 0. ad esempio, 0 per gennaio.

Quindi, il mese che imposti è il primo mese del prossimo anno.


0

Semplifica la tua vita quando lavori con date, timestamp e durate. Usa HalDateTime da

http://sourceforge.net/projects/haldatetime/?source=directory

Ad esempio, puoi semplicemente usarlo per analizzare il tuo input in questo modo:

HalDateTime mydate = HalDateTime.valueOf( "25.12.1988" );
System.out.println( mydate );   // will print in ISO format: 1988-12-25

È inoltre possibile specificare modelli per l'analisi e la stampa.


3
Sembra che tu stia promuovendo il tuo corso in biblioteca? Probabilmente è consentito, ma sarebbe più bello se menzionassi se sei uno sviluppatore principale di HalDateTime.
Ole VV

Non ho downvote. Tuttavia la vita non è mai facile con le date. La tua libreria non cambierà questo fatto.
kiltek

Perché downvote? La mia libreria risale al 2013. Tutte le funzionalità sono disponibili in java.time come specificato in JSR 310 che personalmente trovo sia una delle API meglio progettate. Consiglio vivamente di usarlo.
Hajo Lemcke
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.