2011-01-07 18 views
13

Ho due timestamp che descrivono lo stesso istante di tempo in due formati diversi.Data di analisi con Joda con fuso orario

2010-10-03 18:58:07 e 2010-10-03T16:58:07.000+02:00.

Analizzo i timestamp con due diversi formattatori di data con Joda. Alla fine voglio avere due oggetti DateTime che sono uguali in termini di essere lo stesso istante di tempo.

DateFormatter offre diversi metodi per controllare i fusi orari e le impostazioni internazionali ma non sono riuscito a farlo funzionare.

Questo è il codice che mi piacerebbe lavorare:

final String date1 = "2010-10-03 18:58:07"; // Europe/Berlin local time 
    final DateTimeFormatter formatter1 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"); 
    final DateTime dateTime1 = formatter1.parseDateTime(date1); 

    final String date2 = "2010-10-03T16:58:07.000+02:00"; // Europe/Berlin local time with time zone 
    final DateTimeFormatter formatter2 = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 
    final DateTime dateTime2 = formatter2.parseDateTime(date2); 

    Assert.assertTrue(dateTime1.isEqual(dateTime2)); 

Grazie in anticipo se qualcuno mi può aiutare!

risposta

6

Se lo zome orario predefinito è Europa/Berlino, 2010-10-03 18:58:07 corrisponde a 2010-10-03T16: 58: 07.000 + 00: 00.

Probabilmente fraintendete il campo del fuso orario nella rappresentazione della stringa. Il tuo timestamp 2010-10-03T16: 58: 07.000 + 02: 00 significa che "è 16:58:07 in un fuso orario con un offset di +2 ore da GMT), o in un'altra dicitura" è ora 16 : 58: 07 a Berlino. "Suppongo che ti aspettassi che significhi che sono le 16:58:07 GMT?

+0

Hai un tipo in "2010-10-03T16: 58: 07.000 + 02: 00 significa che non è 16:58:07 in un fuso orario con un offset di +2 ore da GMT)". È necessario leggere: "2010-10-03T16: 58: 07.000 + 02: 00 significa che sono le 16:58:07 in un fuso orario con un offset di +2 ore da UTC)" – MicSim

+0

Sì, mi aspettavo che fosse 16 : 58: 07 GMT. Quindi sembra che i timestamp siano stati interrotti. Questi sono timestamp da due diversi file di registro di diversi server. E sono abbastanza sicuro che specificano lo stesso evento. Quindi questo è stato il mio confusione proveniva da. – wilfried

+0

@MacSim: Certo, ho scritto un po 'troppo veloce lì. – jarnbjo

4

I tuoi due timestamp non rappresentano lo stesso istante di tempo (come già notato da jambjo). Vedi Time zone as offsets from UTC su wikipedia

Vedere anche la documentazione parseDateTime su come funziona.Se non si fornisce alcun fuso orario, verrà applicato il fuso orario predefinito (ovvero il fuso orario di Berlino UTC + 2 se ci sei). Quindi:

  • 2010-10-03 18:58:07 diventa 2010-10-03T18:58:07.000+02:00 (18:58 a Berlino con offset di 2 ore in UTC, ovvero 16:58 in UTC) come previsto.
  • 2010-10-03T16:58:07.000+02:00 rimane tale, perché non v'è un fuso orario previsto (cioè 16:58 a Berlino con compensato di 2 ore per UTC, che significa 14:58 in UTC)

spero tu abbia l'idea . Sarà necessario regolare i tempi con il metodo withZone per ottenere i risultati desiderati.

Problemi correlati