Каков формат времени для этой «даты»: «2014-08-20 00:00:00 -0500»?

Я попытался преобразовать эту дату следующим образом:

SimpleDateFormat fromFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSSZ"); 

Но я получил:

  java.text.ParseException: Unparseable date: "2014-09-20 00:00:00 -0500" (at offset 20) 

Это «-0500» является смещением от UTC в формате RFC822. Вы просто хотите Z , без SSS .

У Android SimpleDateFormat есть такие документы в таблице:

  • Символ: Z
  • Значение: часовой пояс (RFC 822)
  • Вид: (часовой пояс)
  • Пример: Z/ZZ/ZZZ : -0800 ZZZZ : GMT-08: 00 ZZZZZ : ZZZZZ : 00

Разумеется, я также лично определял локаль: это машиночитаемый формат, а не ориентированный на человека формат, поэтому я обычно указывал Locale.US :

 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z", Locale.US); String text = "2014-08-20 00:00:00 -0500"; System.out.println(format.parse(text)); 

Ответ Джона Скита правильный.

Стандартный формат даты и времени

Вот пример кода, показывающего, как преобразовать вашу строку в соответствие с ISO 8601 .

 String inputRaw = "2014-08-20 00:00:00 -0500"; String input = inputRaw.replaceFirst( " ", "T" ).replaceFirst( " ", "" ); // Replace first SPACE with a 'T', and delete second SPACE. // input is "2014-08-20T00:00:00-0500". 

Joda времени

Вы можете передать эту совместимую строку непосредственно конструктору DateTime в Joda-Time . То же самое для эквивалента в пакете java.time в Java 8 (вдохновленный Joda-Time).

 DateTimeZone timeZone = DateTimeZone.forID( "America/Montreal" ); // Specify it rather than have JVM's default applied. DateTime dateTimeMontréal = new DateTime( input, timeZone ); DateTime dateTimeUtc = dateTimeMontréal.withZone( DateTimeZone.UTC ); 

Дамп для консоли.

 System.out.println( "inputRaw: " + inputRaw ); System.out.println( "input: " + input ); System.out.println( "dateTimeMontréal: " + dateTimeMontréal ); System.out.println( "dateTimeUtc: " + dateTimeUtc ); 

При запуске …

 inputRaw: 2014-08-20 00:00:00 -0500 input: 2014-08-20T00:00:00-0500 dateTimeMontréal: 2014-08-20T01:00:00.000-04:00 dateTimeUtc: 2014-08-20T05:00:00.000Z