2012-12-17 14 views
17

Ho bisogno di convertire una stringa contenente la data in un oggetto data. La stringa avrà il formato "aaaa-mm-gg HH: mm: ss.SSSSSS" e voglio lo stesso formato in un oggetto data.Java String to Date oggetto del formato "aaaa-mm-gg HH: mm: ss"

Ad esempio, ho una stringa "2012-07-10 14: 58: 00.000000" e ho bisogno che l'oggetto data risultante sia dello stesso formato.

Ho provato i metodi seguenti, ma il risultato non è come previsto.

java.util.Date temp = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss.SSSSSS").parse("2012-07-10 14:58:00.000000"); 

DateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss"); 
       Date thisDate = dateFormat.parse("2012-07-10 14:58:00.000000"); 

Il risultato è "Mar Gen 10 14:58:00 EST 2012". Per favore fatemi sapere dove sto andando male.

Grazie, Yeshwanth Kota

+0

Cosa sta producendo "mar 10 gen 14:58:00 EST 2012"? Stai usando 'System.out.println (thisDate)'? – Gili

+2

Stai usando 'mm' per minuti e mesi. Come esattamente ti aspettavi che 'SimpleDateFormat' distinguesse tra minuti e mesi nella stringa fornita? Si prega di leggere ancora una volta la tabella degli schemi in javadoc: http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html – BalusC

+0

@ Gili: Sì, sto usando System.out.println (thisDate). –

risposta

44
java.util.Date temp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS").parse("2012-07-10 14:58:00.000000"); 

Il mm è minuti che si desidera MM

CODICE

public class Test { 

    public static void main(String[] args) throws ParseException { 
     java.util.Date temp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS") 
       .parse("2012-07-10 14:58:00.000000"); 
     System.out.println(temp); 
    } 
} 

Stampe:

mar 10 lug 14:58:00 EDT 2012

+0

Ho usato System.out.println (temp) e il risultato è sempre lo stesso. Mi scuso se sto commettendo un errore stupido, ma non sono in grado di capirlo. –

+0

@YeshwanthKota Hai ricompilato il tuo codice? – Woot4Moo

+0

Sì, l'ho fatto. Ho appena System.out.println (temp); nel mio codice. –

0

di riferimento futuro:

yyyy => 4 digit year 
MM => 2 digit month (you must type MM in ALL CAPS) 
dd => 2 digit "day of the month" 

HH => 2-digit "hour in day" (0 to 23) 
mm => 2-digit minute (you must type mm in lowercase) 
ss => 2-digit seconds 
SSS => milliseconds 

Quindi, "yyyy-MM-dd hh: mm: ss" restituisce "2018/01/05 09 : 49: 32"

Ma "MMM gG, aaaa hh: mm a" ritorni "5 gennaio 2018 09:49"

I cosiddetti esempi a https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html mostrano solo l'uscita. Non ti dicono quali formati usare!

+0

FYI, la fastidiosa classe 'SimpleDateFormat' è stata superata per anni dalle classi java.time incorporate in Java 8 e 9. In particolare,' 'DateTimeFormatter'] (https: // docs. oracle.com/javase/9/docs/api/java/time/format/DateTimeFormatter.html). Le vecchie lezioni di data-ora in bundle con le prime versioni di Java dovrebbero essere evitate. –

0

tl; dr

LocalDateTime.parse( 
    "2012-07-10 14:58:00.000000".replace(" " , "T") 
) 

Microsecondi non si adattano

Si sta tentando di spremere un valore con microsecondi (cifre a sei decimali) in un tipo di dati solo in grado di risoluzione millisecondi (tre cifre decimali) . Questo è impossibile.

Invece, utilizzare un tipo di dati con una risoluzione sufficientemente precisa. Le classi java.time utilizzano una risoluzione di nanosecondi (nove cifre decimali).

ingresso Unzoned non va bene per un tipo a zone

Si sta tentando di mettere un valore privo di qualsiasi offset da-UTC o il fuso orario in un tipo di dati (Date) che rappresenta solo i valori in UTC. Quindi stai aggiungendo informazioni (offset UTC) non intese dall'input.

Utilizzare invece un tipo di dati appropriato. Nello specifico, java.time.LocalDateTime.

Case-sensitive

Altre Risposte e commenti in modo corretto spiegare che i codici di modello di formattazione sono case-sensitive. Quindi MM e mm hanno effetti diversi.

classi Evitare legacy

Le classi fastidiosi vecchi data-ora in bundle con le prime versioni di Java sono ormai retaggio, soppiantato dalle classi java.time integrate in Java 8 e versioni successive.

ISO 8601

vostri stringhe di input quasi conformi ai formati standard ISO 8601. Sostituire lo SPAZIO nel mezzo con un T per soddisfare pienamente.

Le classi java.time utilizzano i formati standard per impostazione predefinita durante l'analisi/generazione di stringhe. Quindi non c'è bisogno di specificare un modello di formattazione.

oggetti data-ora non hanno "formato"

e ho bisogno l'oggetto data risultante essere dello stesso formato.

No, gli oggetti di data e ora non hanno un "formato". Non confondere gli oggetti di data-ora con semplici stringhe. Le stringhe sono input e output degli oggetti. Gli oggetti mantengono le proprie rappresentazioni interne delle informazioni di data-ora, i cui dettagli sono irrilevanti per noi come chiamanti programmatori.

java.time

Il vostro contributo è priva di qualsiasi indicatore della zona mi offset da-UTC o fastidioso. Quindi analizziamo come oggetti LocalDateTime che manca di questi concetti.

String input = "2012-07-10 14:58:00.000000".replace(" " , "T") ; 
LocalDateTime ldt = LocalDateTime.parse(input) ; 

Generazione di stringhe

per generare una stringa che rappresenta il valore della vostra LocalDateTime:

  • chiamata toString per ottenere una stringa in formato standard ISO 8601.
  • Utilizzare DateTimeFormatter per produrre stringhe in formati personalizzati o formati localizzati automaticamente.

Ricerca overflow dello stack per ulteriori informazioni poiché questi argomenti sono già stati trattati molte volte.

ZonedDateTime

Un LocalDateTime fa non rappresentano un punto esatto sulla timeline.

Per determinare un momento effettivo, assegnare un fuso orario. Per esempio il mezzogiorno a Calcutta in India arriva molto prima del mezzogiorno a Parigi, in Francia. Mezzogiorno senza un fuso orario potrebbe accadere in qualsiasi momento in un intervallo di circa 26-27 ore.

ZoneId z = ZoneId.of("Asia/Kolkata") ; 
ZonedDateTime zdt = ldt.atZone(z) ; 

Chi java.time

Il quadro java.time è costruito in Java 8 e versioni successive. Queste classi soppiantano le fastidiose classi di data legacy come java.util.Date, Calendar, & SimpleDateFormat.

Il progetto Joda-Time, ora in maintenance mode, consigliati migrazione ai java.time classi.

Per ulteriori informazioni, vedere Oracle Tutorial. E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310.

È possibile scambiare oggetti java.time direttamente con il database. Utilizzare un codice compatibile JDBC driver con JDBC 4.2 o successivo. Nessuna necessità di stringhe, nessuna necessità di classi java.sql.*.

Dove ottenere le classi java.time?

  • Java SE 8, Java SE 9, e più tardi
    • incorporato.
    • Parte dell'API Java standard con un'implementazione in bundle.
    • Java 9 aggiunge alcune funzionalità e correzioni minori.
  • Java SE 6 e Java SE 7
    • Molte delle funzionalità java.time è di back-porting per Java 6 .
  • Android
    • versioni successive di implementazioni fascio Android delle classi java.time.
    • Per Android precedente, il progetto ThreeTenABP si adatta a ThreeTen-Backport (menzionato sopra). Vedi How to use ThreeTenABP….

Il progetto ThreeTen-Extra java.time prolunga con classi aggiuntive. Questo progetto è un terreno di prova per possibili aggiunte future a java.time. È possibile trovare alcune classi utili come Interval, YearWeek, YearQuarter e more.

Problemi correlati