Я немного наткнулся на это. Я сделал небольшое примерное приложение, чтобы быть уверенным, что я не вижу вещей, или значения не обрабатывались в более позднем моменте, который я не ловил.SimpleDateFormat.parse приводит к совершенно другим значениям на основе версии Android
Проблема в том, что когда я пытаюсь проанализировать дату String с использованием формата даты, я получаю два очень разных результата в зависимости от уровня API-устройства.
DateFormat utcFormat;
String utcDate = "2017-01-31 18:58:12.2334924Z";
utcFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSS'Z'");
utcFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
try{
conversion.setText(utcFormat.parse(utcDate).toString());
}
catch (ParseException e){
conversion.setText("exception encountered: " + e.getMessage());
}
Вот мои результаты:
On Android 4.4.2 device: Tue Jan 31 14:37:06 EST 2017
On Android 6.0.1 device: Tue Jan 31 13:58:12 EST 2017
Как вы можете видеть, есть разница около 40 минут на основе точно такой же вход. Локалы устройств одинаковы (хотя я также пробовал жестко кодировать локаль, чтобы убедиться), а установленное время на устройствах одинаково.
Я делаю что-то неправильно здесь?
Попробуйте использовать «SSS» только и подстригать вклад миллисекундной точности. Вы все еще видите разные результаты в этом случае? –
Я только заметил, что интерпретация «2334924» в виде миллисекунд дает количество минут около 40 минут (почти). Возможно, Android 6 изменил интерпретацию таким образом, что ввод теперь корректно интерпретируется, но пока не нашел намека на официальную документацию (и ваш пример кода действительно использует неправильный шаблон и, следовательно, неправильный расчет - 14:37:06 EST ошибочен !). –
Есть ли простой способ обрезать миллисекунды в этом случае? –