Converte uma string para GregorianCalendar
Pergunta
Eu tenho uma string de um cabeçalho de e-mail, como Date: Mon, 27 Oct 2008 08:33:29 -0700
. O que eu preciso é uma instância de GregorianCalendar, que irá representar o mesmo momento. Tão fácil como isso - como faço para fazê-lo
E para os mais rápidos - isto é não indo para trabalho corretamente:
SimpleDateFormat format = ... // whatever you want
Date date = format.parse(myString)
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(date)
porque vai normalizar o fuso horário para UTC (ou seu tempo de máquina local, dependendo da versão do Java). O que eu preciso é calendar.getTimeZone (). GetRawOffset () para retornar -7 * milisInAnHour
.
Solução
Eu recomendo olhar para a biblioteca Joda Time, se isso é uma opção. Normalmente sou contra o uso de uma biblioteca de terceiros quando a plataforma central fornece uma funcionalidade semelhante, mas eu fiz isso uma exceção porque o autor do Joda Time, também está por trás JSR310, e Joda O tempo está basicamente vai ser enroladas em Java 7 eventualmente.
http://joda-time.sourceforge.net/
De qualquer forma, se Joda O tempo é uma opção, algo como isto deve trabalho:
DateTimeFormatter formatter =
DateTimeFormat.forPattern("your pattern").withOffsetParsed();
DateTime dateTime = formatter.parseDateTime("your input");
GregorianCalendar cal = dateTime.toGregorianCalendar();
Espero que isso ajude.
Outras dicas
E para os mais rápidos - isto não vai funcionar corretamente ... porque ele vai normalizar o fuso horário para UTC (ou seu tempo de máquina local, dependendo da versão do Java). O que eu preciso é calendar.getTimeZone (). GetRawOffset () para retornar -7 * milisInAnHour.
Bem tecnicamente isso não funciona, porque quando ele irá retornar um objeto com fuso horário igual ao fuso horário atual do sistema, o tempo será modificado para conta para o deslocamento.
Este código:
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);
saídas:
data analisado: Seg 27 outubro 11:33:29 EDT 2008
que tecnicamente está correto, desde o meu fuso horário sistema é EDT / UTC menos quatro horas (que é de três horas à frente do seu). Se você expressar tempo que o número de milissegundos desde 1 de janeiro de 1970, 00:00:00 GMT (que é como o objeto Date
armazena de data / hora), então estes data / tempos são iguais, é apenas o fuso horário que é diferente .
A sua questão é realmente Como faço para converter uma data / Calendário no meu fuso horário Para isso, dê uma olhada na minha resposta à pergunta anterior como lidar com timeZones calendário usando Java?