Вопрос по android, java – Java / Android - преобразование строки времени по Гринвичу в местное время

9

Итак, у меня есть строка, скажем "вторник 21 мая 14:32:00 GMT 2012" Я хочу преобразовать эту строку в местное время в формате 21 мая 2012 г. 14:32. Я пытался использовать SimpleDateFormat ("MM dd, гггг чч: мм а") parse (), но он выдал исключение. И что же мне делать?

Исключение составляет & reg; не сообщаемое исключение java.text.ParseException; должен быть пойман или объявлен брошенным. & quot;

в соответствииDate date = inputFormat.parse(inputText);

Код, который я запустил на 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);
    }
}
Что является исключением? Kumar Bibek
Ваш пример текста вверху - 21-й, который является понедельником, а не вторником. Отличается от примера кода. Basil Bourque
что было исключением? Jeshurun

Ваш Ответ

4   ответа
1

Вы используете проблемные старые классы даты и времени, которые теперь заменены классами java.time.

Wrong input data

Ваш первый пример строки неверен, поскольку 21-й - понедельник, а не вторник. Вторая строка примера с 22-й верна и используется в моем примере кода ниже.

Using java.time

Избегайте использования такого формата для текстовых представлений значений времени и даты. В частности, никогда не используйте 3-4-буквенное сокращение, такое какEST или жеIST видно в таком формате, поскольку они не являются истинными часовыми поясами, не стандартизированы и даже не уникальны (!). Укажитеправильное название часового пояса, В данном конкретном случае java.time может перевести это какGMT какуниверсальное глобальное время, но другие значения могут потерпеть неудачу.

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 );

Дамп на консоль.toString метод генерирует строку в стандартеISO 8601 формат, расширенный добавлением названия зоны в скобках. Эти стандартные форматы являются гораздо лучшим выбором, когда вам нужно сериализовать значения даты и времени в текст.

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

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

Generate String

Вы можете сгенерировать строку для представления этого значения в любом формате, который вы пожелаете. Как правило, лучше всего, чтобы java.time локализовался автоматически, используяLocale а такжеDateTimeFormatter.

В желаемом формате для части даты используется стиль средней длины, а для части времени - короткий стиль. К счастьюDateTimeFormatter позволяет локализовать каждую часть отдельно, как показано здесь, где мы передаем пару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 );

Дамп на консоль.

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

zdt: 2012-05-22T14:52Z[GMT] | output: May 22, 2012 2:52 PM

About java.time

java.time фреймворк встроен в Java 8 и выше. Эти классы вытесняют старые проблемные классы даты и времени, такие какjava.util.Date, .Calendar& amp;java.text.SimpleDateFormat.

Joda времени проект, сейчас вРежим технического обслуживания, советует перейти на java.time.

Чтобы узнать больше, см.Oracle Tutorial, И поиск переполнения стека для многих примеров и объяснений.

Большая часть функциональности java.time перенесена на Java 6 & amp; 7 вThreeTen-Backport и далее адаптирован кAndroid вThreeTenABP (увидетьHow to use…).

ThreeTen-Extra Проект расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь, такие какInterval, YearWeek, YearQuarter, и больше.

21

Строка формата, которую вы указалиparsing не соответствует текстовому формату, который вы на самом деле получили. Сначала нужно разобрать, потом отформатировать. Похоже, вы хотите:

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);

РЕДАКТИРОВАТЬ: здесь тот же код в виде короткой, но полной программы с вашим примером ввода:

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);
    }
}

Можете ли вы скомпилировать и запуститьthat exact code?

Error: User Rate Limit ExceededexactError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Manto
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Manto
Error: User Rate Limit Exceeded Manto
3

Форматер, который вы используете для разбора, должен быть определен в формате, который вы ожидаете. Вот пример, который работает для предоставленных вами значений, однако вам может потребоваться изменить его в зависимости от того, как некоторые крайние случаи действуют для ввода:

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

Метод SimpleDateFormat.parse генерирует исключение разбора.

Исключение, которое вы получаете, говорит вам об этом ...

The exception is "unreported exception java.text.ParseException; must be caught or declared to be thrown."

Оберните строку, которая выполняет разбор, с помощью try-catch, и вы должны быть золотыми ..

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

р

Похожие вопросы