2013-03-31 16 views
31

Sto provando a formattare una data in aaaa-MM-gg'T'HH: mm: ss.SSSz format yyyy-mm-dd HH: mm: ss, che dovrebbe essere facile ma non riesco a farlo funzionare.Formato Java yyyy-MM-dd'T'HH: mm: ss.SSSz a aaaa-mm-gg HH: mm: ss

Una data che deve essere analizzato è sotto forma di: 2012-10-01T09: 45: 00.000 + 02: 00
ora uso di questa data semplice formattatore di formattarlo:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSz", Locale.FRANCE); 

tuttavia questo dà un'uscita simile a 2012-10-01T09: 45: 00.000UTC + 00: 00.

Ho anche provato a usare "yyyy-MM-dd'T'HH: mm: ss.SSSZ" come schema e "aaaa-MM-ggHH: mm: ss". Quest'ultimo restituisce una data nella forma 2012-10-01T09: 45: 00 chiusa, ma non ancora presente.

Ho pensato che la sottostringa del T lontano sarebbe un po 'caotica e crea un sovraccarico senza motivo, quindi quale sarebbe il modo corretto di formattare queste date?

Per illustrare vorrei convertire 2012-10-01T09: 45: 00.000 + 02: 00 in 2012-10-01 09:45:00

Cheers!

+0

Substringing è molto più veloce/più semplice di conversione a/da un oggetto data. Basta rompere l'originale in due sottostringhe (offset fissi) e quindi concatenare insieme con uno spazio vuoto tra. –

+0

Perché è questo? Potrei analizzare fino a 100+ date in una volta sola. – Gooey

+0

Non pensi che due operazioni di sottostringa con offset hardcoded più un paio di operazioni di concatenazione sarebbero più veloci della costruzione e dell'esecuzione di due formattatori di data? –

risposta

57
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 
SimpleDateFormat output = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
Date d = sdf.parse(time); 
String formattedTime = output.format(d); 

Questo funziona. Devi usare due SimpleDateFormats, uno per l'input e uno per l'output, ma ti darà esattamente quello che vuoi.

+0

Si aggiunge 12 all'inizio ... Mi aspetto data 02/05/2017 ma mi dà 122/05/2017 – VVB

6

Gooye se è possibile utilizzare Joda tempo nel progetto, allora questo codice funziona per me:

String dateStr = "2012-10-01T09:45:00.000+02:00"; 
String customFormat = "yyyy-MM-dd HH:mm:ss"; 

DateTimeFormatter dtf = ISODateTimeFormat.dateTime(); 
LocalDateTime parsedDate = dtf.parseLocalDateTime(dateStr); 

String dateWithCustomFormat = parsedDate.toString(DateTimeFormat.forPattern(customFormat)); 
System.out.println(dateWithCustomFormat); 
+2

Aggiunta di più dipendenza per nulla. Esiste nel JDK, vedi risposta di Chris Tate – Aubin

+0

penso che funzionerà in java 8, non per java 7 o sotto. –

+0

@Sam, Funzionerà in qualsiasi versione java perché utilizza la libreria joda-time. Basta importarlo nel tuo progetto e importare le dipendenze richieste. – moleksyuk

1

Se davvero devi essere veloce (non che io credo si fa):

char[] chars = sourceDate.toCharArray(); 
chars[10] = ' '; 
String targetDate = new String(chars, 0, 19); 
1

stavo cercando di formattare la stringa data di ricezione da una risposta JSON per esempio 2016-03-09T04: 50: 00-0800 to yyyy-MM-dd. Ecco cosa ho provato e ha funzionato e mi ha aiutato ad assegnare alla stringa di data formattata un widget di calendario.

String DATE_FORMAT_I = "yyyy-MM-dd'T'HH:mm:ss"; 
String DATE_FORMAT_O = "yyyy-MM-dd"; 


SimpleDateFormat formatInput = new SimpleDateFormat(DATE_FORMAT_I); 
SimpleDateFormat formatOutput = new SimpleDateFormat(DATE_FORMAT_O); 

Date date = formatInput.parse(member.getString("date")); 
String dateString = formatOutput.format(date); 

Questo ha funzionato. Grazie.

+0

Questa risposta non affronta le specifiche della domanda. E duplica le idee della [risposta accettata di 3 anni] (http://stackoverflow.com/a/15730771/642706). Quindi non vedo nessun valore aggiunto. Sono felice di vedere che vuoi partecipare a Stack Overflow. Ma le tue risposte devono riguardare le specifiche della domanda e non essere un duplicato. –

4

java.time

Abbiamo una nuova tecnologia per questo problema: il quadro java.time integrato in Java 8 e versioni successive.

La stringa di input è in formato ISO 8601 standard. Tale standard viene utilizzato di default nelle classi java.time per l'analisi/generazione di rappresentazioni testuali di valori di data e ora.

OffsetDateTime odt = OffsetDateTime.parse("2012-10-01T09:45:00.000+02:00"); 

La tua domanda suggerisce di voler troncare per un intero secondo.

OffsetDateTime odtTruncatedToWholeSecond = odt.truncatedTo(ChronoUnit.SECONDS); 

Sembra che tu voglia omettere l'offset e le informazioni sul fuso orario. Il formattatore predefinito DateTimeFormatter.ISO_LOCAL_DATE_TIME lo fa.

E a quanto pare si desidera utilizzare uno spazio nel mezzo anziché lo standard T. È possibile definire il proprio formattatore per questo, ma vorrei semplicemente eseguire una manipolazione delle stringhe per sostituire lo T con uno SPAZIO.

String output = odtTruncatedToWholeSecond.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME).replace("T" , " "); 

Semplicemente String Manipolazioni

come i commenti sulla domanda suggeriscono, a rigor di termini si può raggiungere il tuo obiettivo, lavorando solo con le stringhe e non la conversione in oggetti data-ora. Ma fornisco questa risposta presumendo che tu possa avere altre logiche di business per lavorare con questi valori di data-ora.


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, consiglia la migrazione alle classi java.time.

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.

+0

solo per java 8 o superiore –

+1

@Sangram In realtà, no, non solo Java 8. Gran parte della funzionalità java.time è back-porting su Java 6 e Java 7 in [ThreeTen-Backport] (http: // www. threeten.org/threetenbp/) progetto e ulteriormente adattato ad Android nel progetto [ThreeTenABP] (https://github.com/JakeWharton/ThreeTenABP). –

0
String dateStr = "2016-09-17T08:14:03+00:00"; 
String s = dateStr.replace("Z", "+00:00"); 
s = s.substring(0, 22) + s.substring(23); 
Date date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse(s); 
Timestamp createdOn = new Timestamp(date.getTime()); 
mcList.setCreated_on(createdOn); 

Java 7 aggiunto il supporto per il fuso orario descrittori secondo la norma ISO 8601. Questo uso può essere in Java 7.

Problemi correlati