Незаконный образец персонажа «T» при расстановке строки даты Java.util.date
-
25-09-2019 - |
Вопрос
У меня есть строка свидания, и я хочу разобрать его в нормальной дате, используйте API Java Дата API, в следующем случае мой код:
public static void main(String[] args) {
String date="2010-10-02T12:23:23Z";
String pattern="yyyy-MM-ddThh:mm:ssZ";
SimpleDateFormat sdf=new SimpleDateFormat(pattern);
try {
Date d=sdf.parse(date);
System.out.println(d.getYear());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Однако я получил исключение: java.lang.IllegalArgumentException: Illegal pattern character 'T'
Поэтому мне интересно, если я должен разделить строку и разбирать его вручную?
Кстати, я пытался добавить один символ цитаты по обе стороны от t:
String pattern="yyyy-MM-dd'T'hh:mm:ssZ";
Это также не работает.
Решение
Обновление для Java 8 и выше
Теперь вы можете просто сделать Instant.parse("2015-04-28T14:23:38.521Z")
и получить правильное сейчас, тем более, что вы должны использовать Instant
вместо сломанного java.util.Date
с самыми последними версиями Java.
Вы должны использовать DateTimeFormatter
вместо SimpleDateFormatter
также.
Оригинальный ответ:
Пояснение ниже все еще действует так, как представляет формат. Но он был написан до того, как Java 8 был повсеместливый, поэтому он использует старые классы, которые вы не должны использовать, если вы используете Java 8 или выше.
Это работает с входом с трейлингом Z
Как продемонстрировано:
В шаблоне
T
сбежал с'
по обе стороны.Шаблон для
Z
в конце на самом деле на самом делеXXX
Как документировано в Javadoc дляSimpleDateFormat
, на самом деле не очень ясно, как его использовать, так какZ
Маркер для старогоTimeZone
информация также.
Q2597083.java
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;
public class Q2597083
{
/**
* All Dates are normalized to UTC, it is up the client code to convert to the appropriate TimeZone.
*/
public static final TimeZone UTC;
/**
* @see <a href="http://en.wikipedia.org/wiki/ISO_8601#Combined_date_and_time_representations">Combined Date and Time Representations</a>
*/
public static final String ISO_8601_24H_FULL_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";
/**
* 0001-01-01T00:00:00.000Z
*/
public static final Date BEGINNING_OF_TIME;
/**
* 292278994-08-17T07:12:55.807Z
*/
public static final Date END_OF_TIME;
static
{
UTC = TimeZone.getTimeZone("UTC");
TimeZone.setDefault(UTC);
final Calendar c = new GregorianCalendar(UTC);
c.set(1, 0, 1, 0, 0, 0);
c.set(Calendar.MILLISECOND, 0);
BEGINNING_OF_TIME = c.getTime();
c.setTime(new Date(Long.MAX_VALUE));
END_OF_TIME = c.getTime();
}
public static void main(String[] args) throws Exception
{
final SimpleDateFormat sdf = new SimpleDateFormat(ISO_8601_24H_FULL_FORMAT);
sdf.setTimeZone(UTC);
System.out.println("sdf.format(BEGINNING_OF_TIME) = " + sdf.format(BEGINNING_OF_TIME));
System.out.println("sdf.format(END_OF_TIME) = " + sdf.format(END_OF_TIME));
System.out.println("sdf.format(new Date()) = " + sdf.format(new Date()));
System.out.println("sdf.parse(\"2015-04-28T14:23:38.521Z\") = " + sdf.parse("2015-04-28T14:23:38.521Z"));
System.out.println("sdf.parse(\"0001-01-01T00:00:00.000Z\") = " + sdf.parse("0001-01-01T00:00:00.000Z"));
System.out.println("sdf.parse(\"292278994-08-17T07:12:55.807Z\") = " + sdf.parse("292278994-08-17T07:12:55.807Z"));
}
}
Производит следующий вывод:
sdf.format(BEGINNING_OF_TIME) = 0001-01-01T00:00:00.000Z
sdf.format(END_OF_TIME) = 292278994-08-17T07:12:55.807Z
sdf.format(new Date()) = 2015-04-28T14:38:25.956Z
sdf.parse("2015-04-28T14:23:38.521Z") = Tue Apr 28 14:23:38 UTC 2015
sdf.parse("0001-01-01T00:00:00.000Z") = Sat Jan 01 00:00:00 UTC 1
sdf.parse("292278994-08-17T07:12:55.807Z") = Sun Aug 17 07:12:55 UTC 292278994
Другие советы
TL; доктор
Instant.parse( "2010-10-02T12:23:23Z" )
ISO 8601.
Этот формат определяется ISO 8601. Стандарт для форматов строки даты.
Обе:
- Java.Time Framework встроен в Java 8, а затем (Руководство)
- Joda-Time библиотека
... Используйте форматы ISO 8601 по умолчанию для разбора и создания строк.
Вы должны вообще Избегайте использования Old Java.util.date/.Calendar & java.text.simpledateFormat Classes, поскольку они цельнодоманно хлопотно, запутаны и недостаточно. При необходимости для взаимодействия вы можете конвертировать взад и сюда.
Java.Time.
Встроен в Java 8, а затем новый Java.Time. фреймворк. Вдохновлен Joda-Time, определяется JSR 310., и продлен на Threeten-Extra проект.
Instant instant = Instant.parse( "2010-10-02T12:23:23Z" ); // `Instant` is always in UTC.
Преобразовать в старый класс.
java.util.Date date = java.util.Date.from( instant ); // Pass an `Instant` to the `from` method.
Часовой пояс
При необходимости вы можете назначить часовой пояс.
ZoneId zoneId = ZoneId.of( "America/Montreal" ); // Define a time zone rather than rely implicitly on JVM’s current default time zone.
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId ); // Assign a time zone adjustment from UTC.
Конвертировать.
java.util.Date date = java.util.Date.from( zdt.toInstant() ); // Extract an `Instant` from the `ZonedDateTime` to pass to the `from` method.
Joda-Time
Обновление: проект Joda Time теперь находится в режиме обслуживания. Команда советует миграцию к Java.Time. классы.
Вот какой-то пример код в Joda-Time 2.8.
org.joda.time.DateTime dateTime_Utc = new DateTime( "2010-10-02T12:23:23Z" , DateTimeZone.UTC ); // Specifying a time zone to apply, rather than implicitly assigning the JVM’s current default.
Преобразовать в старый класс. Обратите внимание, что присвоенный часовой пояс теряется в преобразовании, поскольку судья не может быть назначен часовой пояс.
java.util.Date date = dateTime_Utc.toDate(); // The `toDate` method converts to old class.
Часовой пояс
При необходимости вы можете назначить часовой пояс.
DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime dateTime_Montreal = dateTime_Utc.withZone ( zone );
О Java.Time.
То Java.Time. Рамки встроены в Java 8, а затем. Эти классы вытесняют проблему старого наследие Классы даты времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
То Joda-Time Проект, сейчас в Режим технического обслуживания, советует миграцию к Java.Time. классы.
Чтобы узнать больше, см. Учебник Oracle. Отказ И поиск стека переполнения для многих примеров и пояснений. Спецификация JSR 310..
Вы можете обменять Java.Time. Объекты напрямую с вашей базой данных. Использовать JDBC драйвер совместимый с JDBC 4.2 или позже. Нет необходимости в струнах, нет необходимости в java.sql.*
классы.
Где получить классы Java.Time?
- Java SE 8., Java SE 9., и позже
- Встроенный.
- Часть стандартного Java API с подключенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6. а также Java SE 7.
- Большая часть функциональности Java.Time возвращается в Java 6 & 7 в Threeten-Backport..
- Андроид
- Последние версии Android Bundle Aflations Java.Time классов.
- Для ранее Android (<26), Threetenabp. Адапты проекта Threeten-Backport. (упомянутый выше). Видеть Как использовать THRETENABP ....
То Threeten-Extra Проект расширяет Java.Time с дополнительными классами. Этот проект является доказательством для возможных будущих дополнений в Java.Time. Вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
, а также более.