Объект даты SimpleDateFormat неправильно анализирует строку метки времени в среде Java (Android) - PullRequest
5 голосов
/ 12 апреля 2011

Я использую объект SimpleDateFormat с объектом Date, как показано ниже.Проблема в том, что объект Date показывает неправильную дату, которая находится в нескольких минутах от исходной строки.Появляется объект Date для хранения времени в полных миллисекундах в отладчике.

Есть идеи по проблеме?

import java.text.SimpleDateFormat;

import java.util.Date;

Date played_at_local; 

dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSSSSZ");

played_at_local = dateFormat.parse("2011-04-11T22:27:18.491726-05:00"); 

//played_at_local shows "Mon Apr 11 22:35:29 America/Chicago 2011" in debugger

Ответы [ 5 ]

15 голосов
/ 28 мая 2011

Попробуйте удалить доли секунды из строки формата. Я просто столкнулся с той же проблемой, но с немного другим форматом. Мой формат ввода не был в формате ISO (без «T» и «Z»), но симптом был тот же - время было отключено на случайное количество минут и секунд, но все остальное было в порядке. Вот как выглядели результаты моего журнала:

При использовании дробного второго формата:

SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS");

# Parsed date: 2011-05-27 17:11:15.271816 => Fri May 27 17:15:46 EDT 2011
# Parsed date: 2011-05-27 17:09:37.750343 => Fri May 27 17:22:07 EDT 2011
# Parsed date: 2011-05-27 17:05:55.182921 => Fri May 27 17:08:57 EDT 2011
# Parsed date: 2011-05-27 16:55:05.69092 => Fri May 27 16:56:14 EDT 2011
# Parsed date: 2011-05-27 16:38:35.50348 => Fri May 27 16:39:25 EDT 2011

Я исправил это, удалив дробные секунды из формата.

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

# Parsed date: 2011-05-27 17:11:15.271816 => Fri May 27 17:11:15 EDT 2011
# Parsed date: 2011-05-27 17:09:37.750343 => Fri May 27 17:09:37 EDT 2011
# Parsed date: 2011-05-27 17:05:55.182921 => Fri May 27 17:05:55 EDT 2011
# Parsed date: 2011-05-27 16:55:05.69092 => Fri May 27 16:55:05 EDT 2011
# Parsed date: 2011-05-27 16:38:35.50348 => Fri May 27 16:38:35 EDT 2011

Я думаю, что происходит из-за того, что моя часть «дробных секунд» входной строки слишком длинная (то же самое верно и в примере с OP). Кажется, он ожидает только три десятичных знака. Если вы делаете математику (возьмите первый пример):

  • доли секунды = 0,271816 секунды
  • DateFormat видит 271816 / 1000 секунды
  • 271816/1000 == 271 секунда
  • 271/60 = 4 минуты
  • 271% 60 = 31 секунда
  • 17: 11: 15–17: 15: 46 ровно через 4 минуты с перерывом в 31 секунду
1 голос
/ 12 апреля 2011

Попробуйте, это работает для меня Z следует использовать в качестве даты или удалить из строки формата

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSSSS'Z'");

played_at_local = dateFormat.parse("2011-04-11T22:27:18.491726Z-05:00");
0 голосов
/ 28 ноября 2014

Попробуйте:

dTime  =  new  SimpleDateFormat("HH:mm:ss:SS");
String  sTime =  (dTime.format(new java.util.Date())).toString();

Надеюсь, эта помощь

0 голосов
/ 28 февраля 2013

Вы можете попробовать этот метод: http://docs.oracle.com/javase/6/docs/api/java/sql/Timestamp.html#valueOf(java.lang.String)

Ключевым моментом является то, что дробные цифры являются необязательными, и вы можете использовать их переменное число.Однако, похоже, это не относится к часовому поясу.

Из документов:

valueOf

public static Timestamp valueOf(String s)
Converts a String object in JDBC timestamp escape format to a Timestamp value.
Parameters:
s - timestamp in format yyyy-mm-dd hh:mm:ss[.f...]. The fractional seconds may be omitted.
Returns:
corresponding Timestamp value
Throws:
IllegalArgumentException - if the given argument does not have the format yyyy-mm-dd hh:mm:ss[.f...]
0 голосов
/ 12 апреля 2011

05:00 -->> 0500

и

hh --> HH // error not because of this ,but date is in 24hr format.

played_at_local = dateFormat.parse("2011-04-11T22:27:18.491726-05:00"); 

должно быть

played_at_local = dateFormat.parse("2011-04-11T22:27:18.491726-0500"); 
...