Проблема преобразования DateFormat в java?

моя строка ввода: 2010-03-24T17:28:50.000Z

шаблон вывода похож на:

DateFormat formatter1 = new SimpleDateFormat("EEE. MMM. d. yyyy");

я конвертирую это так:

formatter1.format(new Date("2010-03-24T17:28:50.000Z"));//illegalArgumentException here the string "2010-03-24T17:28:50.000Z"

вывод должен быть таким: Thu. 24 мар. 2010 идея

но я получаю исключение illegalArgumentException. Не знаю, почему? Есть идеи??

сообщение трассировки стека:

04-08 19:50:28.326: WARN/System.err(306): java.lang.IllegalArgumentException
04-08 19:50:28.345: WARN/System.err(306):     at java.util.Date.parse(Date.java:447)
04-08 19:50:28.355: WARN/System.err(306):     at java.util.Date.<init>(Date.java:157)
04-08 19:50:28.366: WARN/System.err(306):     at com.example.brown.Bru_Tube$SelectDataTask.doInBackground(Bru_Tube.java:222)
04-08 19:50:28.366: WARN/System.err(306):     at com.example.brown.Bru_Tube$SelectDataTask.doInBackground(Bru_Tube.java:1)
04-08 19:50:28.405: WARN/System.err(306):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
04-08 19:50:28.415: WARN/System.err(306):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
04-08 19:50:28.415: WARN/System.err(306):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
04-08 19:50:28.446: WARN/System.err(306):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
04-08 19:50:28.456: WARN/System.err(306):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
04-08 19:50:28.466: WARN/System.err(306):     at java.lang.Thread.run(Thread.java:1096)

person Praveen    schedule 08.04.2010    source источник
comment
IllegalArgumentException где? Я бы опубликовал трассировку стека.   -  person Sean Owen    schedule 08.04.2010


Ответы (2)


Проблема именно в этой части:

new Date("2010-03-24T17:28:50.000Z")

По-видимому, он не принимает дату/время в этом формате.

В любом случае вам не следует использовать этот конструктор - создайте соответствующий модуль форматирования для анализа этого конкретного формата, а затем проанализируйте его с ним.

Кроме того, для начала используйте Joda Time и избегайте полного использования DateFormat. Я не знаю, можете ли вы использовать Joda Time с Android, заметьте... и он довольно большой.

РЕДАКТИРОВАТЬ: Чтобы указать это явно:

String inputText = "2010-03-24T17:28:50.000Z";
// "Z" appears not to be supported for some reason.
DateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
inputFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
DateFormat outputFormat = new SimpleDateFormat("EEE. MMM. d. yyyy");
Date parsed = inputFormat.parse(inputText);
String outputText = outputFormat.format(parsed);

// Output is Wed. Mar. 24 2010 on my box
person Jon Skeet    schedule 08.04.2010
comment
джода время не удобно с андроидом. Я так думаю. Можно ли по-другому в java? я имею в виду, можем ли мы упомянуть формат ввода и вывода даты и времени, а затем я конвертирую его. - person Praveen; 08.04.2010
comment
SimpleDateFormat имеет шаблон в своем JavaDoc, который соответствует этому yyyy-MM-dd'T'HH:mm:ss.SSSZ - person Powerlord; 08.04.2010
comment
Как говорит Джон Скит, используйте SimpleDateFormat для анализа даты, аналогично тому, как вы уже используете его для форматирования даты. - person Andrea Polci; 08.04.2010
comment
SimpleDateFormat - это путь - person Mark B; 08.04.2010
comment
как это использовать? Я не могу понять вас, люди. подскажите плиз... :( - person Praveen; 08.04.2010
comment
@androidbase: Что из этого тебе не понятно? Используйте new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"), чтобы создать соответствующий формат даты, затем вызовите format.parse("2010-03-24T17:28:50.000Z"), чтобы получить Date. - person Jon Skeet; 08.04.2010
comment
@OMG Unicorns: Похоже, что формат часового пояса Z не поддерживает буквальное Z, как ни странно. Я установил это явно... - person Jon Skeet; 08.04.2010
comment
@Jon Skeet: мне было интересно об этом, так как я не видел упоминания об этом на странице SimpleDateFormat. Я думаю, я должен был проверить это. P.S. OMG Unicorns - это пародийное имя, но я не могу изменить его снова до 1 мая... дурацкое правило 30 дней... ворчать - person Powerlord; 08.04.2010

'Z' не то же самое, что Z

'Z' — это просто символьный литерал, тогда как Z — это обозначение часового пояса для нулевого смещения часового пояса. Он означает Zulu и указывает часовой пояс Etc/UTC (который имеет смещение часового пояса +00:00 часов).

Поэтому не используйте 'Z' в шаблоне для синтаксического анализа/форматирования.

java.время

API даты и времени java.util и их API форматирования SimpleDateFormat устарели и подвержены ошибкам. Рекомендуется полностью прекратить их использование и перейти на современный API даты и времени*.

Кроме того, ниже приводится уведомление с главной страницы Joda-Time< /а>:

Обратите внимание, что начиная с Java SE 8 пользователям предлагается перейти на java.time (JSR-310) — основную часть JDK, которая заменяет этот проект.

Решение с использованием java.time, современного API даты и времени:

Современный API даты и времени основан на ISO 8601 и не требует явного использования объекта DateTimeFormatter. если строка даты и времени соответствует стандартам ISO 8601. Строка даты и времени, 2010-03-24T17:28:50.000Z, соответствует стандартам ISO 8601.

import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        OffsetDateTime odt = OffsetDateTime.parse("2010-03-24T17:28:50.000Z");

        // Custom format
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEE. MMM. d. uuuu", Locale.ENGLISH);
        System.out.println(dtf.format(odt));
    }
}

Вывод:

Wed. Mar. 24. 2010

ОНЛАЙН-ДЕМО

Узнайте больше о современном API Date-Time на странице Trail: Date Time< /а>.

Использование устаревшего API:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class Main {
    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sdfInput = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ENGLISH);
        Date date = sdfInput.parse("2010-03-24T17:28:50.000Z");

        // Custom format
        SimpleDateFormat sdfOutput = new SimpleDateFormat("EEE. MMM. d. uuuu", Locale.ENGLISH);
        System.out.println(sdfOutput.format(date));
    }
}

Вывод:

Wed. Mar. 24. 0003

ОНЛАЙН-ДЕМО

Примечание. Всегда используйте Locale с DateTimeFormatter и SimpleDateFormat, так как это Locale-чувствительные типы.


* По какой-либо причине, если вам нужно придерживаться Java 6 или Java 7, вы можете использовать ThreeTen-Backport, который переносит большую часть функций java.time на Java 6 и 7. Если вы работаете над проектом Android и ваш уровень Android API по-прежнему не соответствует Java-8, проверьте Java 8+ API доступно через дешугаринг и Как использовать ThreeTenABP в Android Project.

person Arvind Kumar Avinash    schedule 25.06.2021