Недопустимый символ шаблона ' T ' при разборе строки даты на java.утиль.Дата
у меня есть строка даты, и я хочу разобрать ее на обычную дату, используя Java date 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";
Он также не работает.
2 ответов:
обновление для 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; dr
Instant.parse( "2010-10-02T12:23:23Z" )ISO 8601
этот формат определяется ISO 8601 стандарт для форматов строк даты и времени.
как:
- java.временные рамки встроенный в Java 8 и более поздних версий (учебник)
- Joda Времени библиотека
...используйте форматы ISO 8601 по умолчанию для разбора и генерации строк.
вы должен вообще избегайте использования старой java.утиль.Дата/.Календарь и java.текст.Класса simpledateformat классы, а они, как известно, хлопотное, запутанное, и недостатки. Если требуется для работы, вы можете конвертировать туда и обратно.
java.время
встроенный в Java 8 и позже является новым java.время основы. Вдохновленный Joda Времени, определено 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 Времени
обновление: проект Joda-Time теперь находится в режиме обслуживания. Команда советует перейти на java.время классы.
вот пример кода в 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.конвертировать в старый класс. Обратите внимание, что назначенный часовой пояс теряется при преобразовании, так как j.U.Date не может быть назначен часовой пояс.
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.время
The java.время фреймворк встроен в Java 8 и более поздние версии. Эти классы вытесняют беспокойных старых наследие классы даты и времени, такие как
java.util.Date,Calendar,&SimpleDateFormat.The Joda-Time, теперь режим обслуживания, советует миграцию в java.время классы.
чтобы узнать больше, смотрите Oracle Tutorial. Поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310.
вы можете обменять java.время объекты непосредственно с вашей базой данных. Используйте - драйвера соответствуют JDBC 4.2 или позже. Нет необходимости в строках, нет необходимости в
java.sql.*классы.где получить java.время занятий?
- Java SE 8, Java SE 9, и позже
- встроенный.
- часть стандартного Java API с комплектной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- большая часть java.функциональность время портированы с Java 6 и 7 в ThreeTen-Backport.
- Android
- более поздние версии Android bundle реализации java.время занятий.
- для более ранних Android ( ThreeTenABP проект приспосабливается ThreeTen-Backport (упоминалось выше). Смотрите как использовать ThreeTenABP....
The ThreeTen-Extra проект расширяет java.время с дополнительными занятиями. Этот проект является испытательным полигоном для возможных будущих дополнений к java.время. Вы можете найти некоторые полезные классы, такие как
Interval,YearWeek,YearQuarterи больше.
Comments