Converti una stringa in GregorianCalendar
Domanda
Ho una stringa da un'intestazione di posta elettronica, come Data: lun, 27 ott 2008 08:33:29 -0700
. Quello di cui ho bisogno è un'istanza di GregorianCalendar, che rappresenterà lo stesso momento. Facile come quello: come posso farlo?
E per i più veloci, questo non funzionerà correttamente:
SimpleDateFormat format = ... // whatever you want
Date date = format.parse(myString)
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(date)
perché normalizzerà il fuso orario su UTC (o l'ora della macchina locale, a seconda della versione di Java). Quello di cui ho bisogno è calendar.getTimeZone (). GetRawOffset () per restituire -7 * milisInAnHour
.
Soluzione
Consiglierei di consultare la libreria di Joda Time, se questa è un'opzione. Normalmente sono contrario all'utilizzo di una libreria di terze parti quando la piattaforma principale offre funzionalità simili, ma l'ho fatta un'eccezione perché l'autore di Joda Time è anche dietro JSR310, e alla fine Joda Time verrà praticamente implementato in Java 7.
http://joda-time.sourceforge.net/
Quindi, se Joda Time è un'opzione, qualcosa come questo dovrebbe funzionare:
DateTimeFormatter formatter =
DateTimeFormat.forPattern("your pattern").withOffsetParsed();
DateTime dateTime = formatter.parseDateTime("your input");
GregorianCalendar cal = dateTime.toGregorianCalendar();
Spero che questo aiuti.
Altri suggerimenti
E per i più veloci, questo non funzionerà correttamente ... perché normalizzerà il fuso orario su UTC (o l'ora della macchina locale, a seconda della versione di Java). Quello di cui ho bisogno è calendar.getTimeZone (). GetRawOffset () per restituire -7 * milisInAnHour.
Beh, tecnicamente funziona, perché mentre restituirà un oggetto con TimeZone uguale al TimeZone di sistema corrente, il tempo verrà modificato per tenere conto dell'offset.
Questo codice:
String dateString = "Mon, 27 Oct 2008 08:33:29 -0700";
DateFormat df = new SimpleDateFormat("E, dd MMM yyyy hh:mm:ss Z");
Date parsed = df.parse(dateString);
System.out.println("parsed date: " + parsed);
Calendar newCalendar = Calendar.getInstance();
newCalendar.setTime(parsed);
uscite:
data analizzata: lun 27 ott 11:33:29 EDT 2008
che tecnicamente è corretto, dal momento che il mio fuso orario del sistema è EDT / UTC meno quattro ore (che è tre ore avanti rispetto al tuo). Se esprimi il tempo come numero di millisecondi dal 1 gennaio 1970, 00:00:00 GMT (che è come l'oggetto Date
memorizza la sua data / ora), allora queste date / ore sono uguali, è solo il TimeZone che è diverso.
Il tuo problema è davvero Come posso convertire una Data / Calendario nel mio fuso orario? Per questo, dai un'occhiata alla mia risposta alla domanda precedente Come gestire i fusi orari del calendario usando Java?