Converter seqüência de caracteres para o object de calendar em Java

Eu sou novo em Java, geralmente trabalho com PHP.

Eu estou tentando converter essa string:

Seg 14 de março 16:02:37 GMT 2011

Em um object de calendar para que eu possa facilmente puxar o ano e mês assim:

String yearAndMonth = cal.get(Calendar.YEAR)+cal.get(Calendar.MONTH); 

Seria uma má ideia analisá-lo manualmente? Usando um método de subcadeia?

Qualquer conselho ajudaria, obrigado!

 Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH); cal.setTime(sdf.parse("Mon Mar 14 16:02:37 GMT 2011"));// all done 

nota: definir Locale acordo com o seu ambiente / exigência


Veja também

  • Javadoc

Bem, acho que seria uma má idéia replicar o código que já está presente em classs como SimpleDateFormat .

Por outro lado, pessoalmente, sugiro evitar o Calendar e o Date completamente, se possível, e usando o Joda Time , como uma API de data e hora muito melhor projetada. Por exemplo, você precisa estar ciente de que SimpleDateFormat não é thread-safe, portanto, você precisa de thread-locals, synchronization ou uma nova instância toda vez que você usá-lo. Analisadores e formatadores Joda são thread-safe.

Nenhum novo Calendário precisa ser criado, o SimpleDateFormat já usa um Calendário abaixo.

 SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.EN_US); Date date = sdf.parse("Mon Mar 14 16:02:37 GMT 2011"));// all done Calendar cal = sdf.getCalendar(); 

(Eu não posso comentar ainda, é por isso que eu criei uma nova resposta)

tl; dr

 YearMonth.from( ZonedDateTime.parse( "Mon Mar 14 16:02:37 GMT 2011" , DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" ) ) ).toString() 

2011-03

Evite classs legadas de data e hora

A maneira moderna é com as classs java.time. As antigas classs de data e hora, como o Calendar , provaram ser mal projetadas, confusas e problemáticas.

Defina um formatador personalizado para corresponder à sua input de string.

 String input = "Mon Mar 14 16:02:37 GMT 2011"; DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" ); 

Analisar como um ZonedDateTime .

 ZonedDateTime zdt = ZonedDateTime.parse( input , f ); 

Você está interessado no ano e no mês. As classs java.time incluem a class YearMonth para essa finalidade.

 YearMonth ym = YearMonth.from( zdt ); 

Você pode interrogar os números do ano e do mês, se necessário.

 int year = ym.getYear(); int month = ym.getMonthValue(); 

Mas o método toString gera uma string no formato padrão ISO 8601 .

 String output = ym.toString(); 

Coloque tudo isso junto.

 String input = "Mon Mar 14 16:02:37 GMT 2011"; DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" ); ZonedDateTime zdt = ZonedDateTime.parse( input , f ); YearMonth ym = YearMonth.from( zdt ); int year = ym.getYear(); int month = ym.getMonthValue(); 

Despeje para consolar.

 System.out.println( "input: " + input ); System.out.println( "zdt: " + zdt ); System.out.println( "ym: " + ym ); 

input: seg 14 mar 16:02:37 GMT 2011

zdt: 2011-03-14T16: 02: 37Z [GMT]

ym: 2011-03

Código vivo

Veja este código em execução no IdeOne.com .

Conversão

Se você precisa ter um object Calendar , é possível converter em um GregorianCalendar usando novos methods adicionados às classs antigas.

 GregorianCalendar gc = GregorianCalendar.from( zdt ); 

Sobre o java.time

O framework java.time está embutido no Java 8 e posterior. Essas classs substituem as antigas classs herdadas de data e hora legadas , como java.util.Date , Calendar e SimpleDateFormat .

O projeto Joda-Time , agora em modo de manutenção , aconselha a migration para java.time.

Para saber mais, veja o Oracle Tutorial . E pesquise o Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .

Onde obter as classs java.time?

  • Java SE 8 e SE 9 e posterior
    • Construídas em.
    • Parte da API Java padrão com uma implementação integrada.
    • O Java 9 adiciona alguns resources e correções menores.
  • Java SE 6 e SE 7
    • Grande parte da funcionalidade java.time é transferida para o Java 6 e 7 no ThreeTen-Backport .
  • Android
    • O projeto ThreeTenABP adapta o ThreeTen-Backport (mencionado acima) especificamente para o Android.
    • Veja como usar… .

O projeto ThreeTen-Extra estende java.time com classs adicionais. Este projeto é um campo de testes para possíveis futuras adições ao java.time. Você pode encontrar algumas classs úteis aqui como Interval , YearWeek , YearQuarter e muito mais .

SimpleDateFormat é ótimo, apenas note que HH é diferente de hh quando trabalha com horas. HH retornará 24 horas com base em horas e hh retornará 12 horas com base em horas.

Por exemplo, o seguinte retornará 12 horas:

 SimpleDateFormat sdf = new SimpleDateFormat("hh:mm aa"); 

Enquanto isso irá retornar 24 horas:

 SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); 

Sim, seria uma má prática analisá-lo você mesmo. Dê uma olhada no SimpleDateFormat , ele transformará a String em uma Data e você poderá definir a Data em uma instância do Calendar.

Método simples:

 public Calendar stringToCalendar(String date, String pattern) throws ParseException { String DEFAULT_LOCALE_NAME = "pt"; String DEFAULT_COUNTRY = "BR"; Locale DEFAULT_LOCALE = new Locale(DEFAULT_LOCALE_NAME, DEFAULT_COUNTRY); SimpleDateFormat format = new SimpleDateFormat(pattern, LocaleUtils.DEFAULT_LOCALE); Date d = format.parse(date); Calendar c = getCalendar(); c.setTime(d); return c; } 

Analise uma hora com fuso horário, Z no padrão é para fuso horário

 String aTime = "2017-10-25T11:39:00+09:00"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.getDefault()); try { Calendar cal = Calendar.getInstance(); cal.setTime(sdf.parse(aTime)); Log.i(TAG, "time = " + cal.getTimeInMillis()); } catch (ParseException e) { e.printStackTrace(); } 

Saída: retornará a hora UTC

 1508899140000 

insira a descrição da imagem aqui

Se não yyyy-MM-dd'T'HH:mm:ss o fuso horário no padrão como yyyy-MM-dd'T'HH:mm:ss . SimpleDateFormat usará o fuso horário definido na Setting