2012-05-23 10 views
9

Ok, więc mam ciąg znaków, powiedzmy "WT 21 maja 14:32:00 GMT 2012" Chcę przekonwertować ten ciąg do czasu lokalnego w formacie 21 maja , 2012 14:32. Próbowałem SimpleDateFormat ("MM dd, yyyy hh: mm a") .parse(), ale odrzucił wyjątek. Więc co powinienem zrobić?Java/Android - Konwertuj ciąg czasu GMT na czas lokalny

Wyjątkiem jest "niezgłoszony wyjątek java.text.ParseException; musi zostać przechwycony lub zgłoszony jako zgłoszony."

w linii Date date = inputFormat.parse(inputText);

Kodeksu wpadłem na TextMate:

public class test{ 
    public static void main(String arg[]) { 
     String inputText = "Tue May 22 14:52:00 GMT 2012"; 
     SimpleDateFormat inputFormat = new SimpleDateFormat(
      "EEE MMM dd HH:mm:ss 'GMT' yyyy", Locale.US); 
     inputFormat.setTimeZone(TimeZone.getTimeZone("Etc/UTC")); 
     SimpleDateFormat out = new SimpleDateFormat("MMM dd, yyyy h:mm a"); 
     Date date = inputFormat.parse(inputText); 
     String output = out.format(date); 
     System.out.println(output); 
    } 
} 
+0

Jaki jest wyjątek? –

+0

jaki był wyjątek? – Jeshurun

+0

Twój przykładowy tekst do góry to 21, czyli poniedziałek, a nie wtorek. Różni się od przykładowego kodu. –

Odpowiedz

20

Ciąg formatu podałeś dla parsowania nie koresponduje z formatem tekstowym rzeczywiście masz. Najpierw musisz parsować, a następnie sformatować. To wygląda tak, jak chcesz:

SimpleDateFormat inputFormat = new SimpleDateFormat(
    "EEE MMM dd HH:mm:ss 'GMT' yyyy", Locale.US); 
inputFormat.setTimeZone(TimeZone.getTimeZone("Etc/UTC")); 

SimpleDateFormat outputFormat = new SimpleDateFormat("MMM dd, yyyy h:mm a"); 
// Adjust locale and zone appropriately 

Date date = inputFormat.parse(inputText); 
String outputText = outputFormat.format(date); 

EDIT: Tutaj jest ten sam kod w postaci krótkiego, ale kompletny program, z wejściem próbki:

import java.util.*; 
import java.text.*; 

public class Test { 
    public static void main(String[] args) throws ParseException { 
     String inputText = "Tue May 21 14:32:00 GMT 2012"; 
     SimpleDateFormat inputFormat = new SimpleDateFormat 
      ("EEE MMM dd HH:mm:ss 'GMT' yyyy", Locale.US); 
     inputFormat.setTimeZone(TimeZone.getTimeZone("Etc/UTC")); 

     SimpleDateFormat outputFormat = 
      new SimpleDateFormat("MMM dd, yyyy h:mm a"); 
     // Adjust locale and zone appropriately 
     Date date = inputFormat.parse(inputText); 
     String outputText = outputFormat.format(date); 
     System.out.println(outputText); 
    } 
} 

można skompilować i uruchomić że dokładnie kod?

+1

Próbowałem, ale wiersz Date date = inputFormat.parse (inputText); Nadal wyrzucam wyjątek, o którym wspomniałem powyżej :( – Manto

+0

@ user1066956: Proszę o wpisanie * ściśle * ciągu znaków - ponieważ użyłem napisu, który dałeś mi w pytaniu, i było dobrze. –

+0

"Wt 21 maja 14:32:00 GMT 2012 "to dokładnie taki ciąg, jakiego użyłem. Uruchomiłem poniższy kod w TextMate i otrzymałem błąd, o którym wspomniałem powyżej. – Manto

3

Formater, którego używasz do analizy, musi być zdefiniowany zgodnie z oczekiwanym formatem. Oto przykład, który działa dla wartości dostarczonych Ci jednak może trzeba go zmienić w zależności od sposobu niektóre przypadki brzegowe działać na wejściu:

String date = "Tue May 21 14:32:00 GMT 2012"; 
DateFormat inputFormat = new SimpleDateFormat("EE MMM dd HH:mm:ss zz yyy"); 
Date d = inputFormat.parse(date); 
DateFormat outputFormat = new SimpleDateFormat("MMM dd, yyy h:mm a zz"); 
System.out.println(outputFormat.format(d)); 
1

Sposób SimpleDateFormat.parse zgłasza wyjątek przetworzenia.

Wyjątkiem dostajesz to ty o tym mówisz ...

Wyjątkiem jest „nieudokumentowanych wyjątek java.text.ParseException;. musi być złapany lub uznane za rzucony

Wrap linia, która robi parsowania z try-catch i powinien być złoty ..

Date d=null; 
try{ 
    d = inputFormat.parse(date); 
catch(ParseException e){ 
    // handle the error here.... 
} 

R

1

Używasz kłopotliwych starych klas daty i godziny teraz wypieranych przez klasy java.time.

Błędne dane wejściowe

Twój pierwszy przykład ciąg jest nieprawidłowy, jako 21-to nie poniedziałek wtorek. Drugi przykładowy ciąg z 22. jest poprawny i użyty w moim przykładowym kodzie poniżej.

Korzystanie java.time

Należy unikać używania tego rodzaju formatu reprezentacji tekstowych wartości daty i godziny. W szczególności nigdy nie należy używać skrótu o długości 3-4 liter, takiego jak EST lub IST widziane w tego rodzaju formacie, ponieważ nie są to prawdziwe strefy czasowe, nie są ustandaryzowane, a nawet unikalne (!). Podaj proper time zone name. W tym konkretnym przypadku java.time jest w stanie przetłumaczyć to jako GMT jako UTC, ale inne wartości mogą zawieść.

String input = "Tue May 22 14:52:00 GMT 2012"; 
DateTimeFormatter f = DateTimeFormatter.ofPattern ("EEE MMM dd HH:mm:ss z uuuu").withLocale (Locale.US); 
ZonedDateTime zdt = ZonedDateTime.parse (input , f); 

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

Zrzut na konsolę. Metoda toString generuje ciąg w standardowym formacie ISO 8601, rozszerzony przez dodanie nazwy strefy w nawiasach. Te standardowe formaty są znacznie lepszym wyborem, gdy trzeba serializować wartości daty i godziny do tekstu.

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

ZDT: 2012-05-22T14: 52Z [GMT]

Generowanie String

można wygenerować ciąg do reprezentowania tej wartości w dowolnym formacie pragnienie. Ogólnie najlepiej, aby java.time lokalizował się automatycznie, używając Locale i DateTimeFormatter.

Pożądany format wykorzystuje styl średniej długości dla części daty, ale styl krótkiej długości dla porcji dnia. Na szczęście model DateTimeFormatter umożliwia zlokalizowanie każdej części osobno, jak widać tutaj, gdzie przekazujemy parę obiektów FormatStyle.

Locale l = Locale.US; // Or Locale.CANADA_FRENCH, or Locale.ITALY, etc. 
DateTimeFormatter fOutput = DateTimeFormatter.ofLocalizedDateTime (FormatStyle.MEDIUM , FormatStyle.SHORT).withLocale (l); 
String output = zdt.format (fOutput); 

Zrzut na konsolę.

System.out.println ("zdt: " + zdt + " | output: " + output); 

ZDT: 2012-05-22T14: 52Z [GMT] | Wyjście: Maj 22, 2012 14:52

O java.time

Ramy java.time jest wbudowana w Java 8 i późniejszych. Klasy te zastępują stare, kłopotliwe klasy czasu i daty, takie jak java.util.Date, .Calendar, java.text.SimpleDateFormat.

Projekt Joda-Time, teraz w maintenance mode, zaleca migrację do java.time. Aby uzyskać więcej informacji, zobacz

. I wyszukaj Stack Overflow dla wielu przykładów i objaśnień.

Znaczna część funkcjonalności java.time powraca walcowy Java 6 & 7 w ThreeTen-Backport i ponadto dostosowany do Android w ThreeTenABP (patrz How to use…).

Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem wskazującym na możliwe przyszłe dodatki do java.time. Możesz znaleźć tutaj kilka użytecznych klas, takich jak Interval, YearWeek, YearQuarter i więcej.

Powiązane problemy