2016-04-12 3 views
2

У меня есть приложение для Android, которое выводит csv с несколькими сотнями строк в секунду. Каждая строка имеет метку, которая в основном генерируется так:Java SimpleDateFormat добавляет случайные нули

String formatTimeStamp (Calendar cal) 
{ 
    SimpleDateFormat timeFormatISO = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss") 
    return timeFormatISO.format(cal.getTime()); 
} 

Некоторые временные метки (возможно, один на тысячу) имеют неожиданные нули в них и выглядеть примерно так:

2016-04-12T09 : 0011: 30

2016-04-12T0009: 0011: 30

2016-04-0012T09: 11: 30

Влияния кажутся совершенно произвольными, по крайней мере Я не вижу ни одной картины позади них. Иногда между двумя неправильными линиями существует несколько тысяч строк, иногда есть только один.

Формат даты определен только в одном месте в коде.

Edit:

Here

являются неисправными метками времени моего последнего запуска, только так вы посмотрите на него можно. Единственное, что я заметил о них, это то, что это всегда два ведущих нуля перед элементом даты, но не перед годом.

Редакция 2:

Проблема решена! Оказывается, SimpleDateFormat не является потокобезопасным и делает странные вещи в строках при неправильном использовании. Я не знал, что многопоточность будет проблемой, поэтому я не указал ее в первоначальном вопросе. Прошу прощения за путаницу.

+4

Уверены ли вы, что проблема не в написании файла? –

+2

«SimpleDateFormat» явно протестирован и проверен. Я также буду исследовать процедуру ввода-вывода. – Shlublu

+0

Нет, я не уверен.Но моя рутина IO тоже ничего необычного. У меня просто есть FileOutputStream, в котором я .write (myString.getBytes()); – karpfen

ответ

1

«Оказывается, SimpleDateFormat не является потокобезопасным и делает странные вещи для строк при неправильном использовании».

Код, который вы показали нам в своем Вопросе, является потокобезопасным, если значение cal не обрабатывается безопасным способом.

SimpleDateFormat экземпляр является нить-ограничителем; то есть другие нитки не видят его. Таким образом, безопасность потока или иное значение не имеет значения.

Я предполагаю, что в вашем фактическом коде у вас было несколько потоков, пытающихся разделить экземпляр SimpleDateFormat. В javadoc говорится:

«Рекомендуется создавать отдельные экземпляры формата для каждого потока. Если несколько потоков обращаются к формату одновременно, его необходимо синхронизировать извне».

+0

Да, именно в этом была проблема. Я не включил это в свой вопрос, потому что хотел представить минимальный пример и подумал, что это не имеет значения. – karpfen

+0

@ karpfen - Ну, это плохая идея. Минимальные примеры хороши, но они должны быть примерами, которые фактически показывают поведение, которое является проблемой. –

0

необходимо указать часовой пояс во входной строке. например: timeFormatISO.setTimeZone (TimeZone.getTimeZone («GMT»));

Смежные вопросы