Преобразование строк-строк с наносекундами

Некоторое время я боролся с этим кодом для Android-приложения, и я не могу его повесить. Я прочитал и пробовал все решения, которые я нашел в stackoverflow и других местах, но все равно не повезло.

То, что я хочу сделать, – это функция для преобразования строки типа "17.08.2012 05:35:19:7600000" в дату UTC и функцию, которая принимает UTC date и преобразует ее в такую ​​строку.

 String value = "17.08.2012 05:35:19:7600000"; DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss:SSSSSSS"); try { Date today = df.parse(value); System.out.println("Today = " + df.format(today) + " " + today.toGMTString()); } catch (ParseException e) { e.printStackTrace(); } 

В результате: Today = 17.08.2012 07:41:59:0000000 17 Aug 2012 04:41:59 GMT которые оба ошибаются.

Я пробовал устанавливать SDF's timezone на UTC , не повезло.
Еще одна вещь, которую я заметил: если я делаю df.setLenient(false);
Это дает мне: java.text.ParseException: Unparseable date: "17.08.2012 05:35:19:7600000" .

Если кто-нибудь может предоставить мне некоторые пояснения / образец кода, я был бы очень благодарен. заранее спасибо

Результат, который вы получаете, абсолютно прав.

Давайте проанализируем это:

 17.08.2012 05:35:19:7600000 
  • 17: День месяца (17)
  • 08: Месяц года (август)
  • 2012: Год (2012)
  • 05: Час дня (5 часов)
  • 35: минута часа (: 35)
  • 19: Вторая минута (: 19)
  • 7600000: миллисекунды второго (7 600 000)

Теперь, как VM видит это, вы заявляете время дня как 5:35:19, а затем добавляли к нему 7 600 000 миллисекунд. 7 600 000 миллисекунд = 7 600 секунд = 2 часа, 6 минут, 40 секунд. 5:35:19 am + 02:06:40 = 7:41:59 am (и 0 миллисекунд). Это результат, который вы получаете. (Также кажется, что вы не устанавливаете часовой пояс должным образом, поэтому строка GMT на 3 часа позади вашего результата.)

Если вы хотите сохранить :7600000 , :7600000 мне известно, это невозможно. Так как это можно упростить в секундах, виртуальная машина автоматически уменьшит ее до другого времени. Миллисекунды ( SSSS ) должны быть для хранения значений <1000.

Я предлагаю вам создать новый SimpleDateFormat для вашего вывода; но помните, что миллисекунды будут поглощены в другие времена (поскольку все они хранятся как один long объект Date ).

  private String convertDate(String cdate) { SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss:SSSSSSS"); SimpleDateFormat postFormater = new SimpleDateFormat("yyyy-MM-dd"); Date convertedDate; try { convertedDate = dateFormat.parse(cdate); cdate = postFormater.format(convertedDate); } catch (ParseException e) { Toast.makeText(getApplicationContext(),e.toString(),Toast.LENGTH_SHORT).show(); } return cdate; } 

Попробуй это.

Это то, что вам нужно (но оно потеряет миллисекунду информации):

 "dd.MM.yyyy HH:mm:ss.'000000'" 

Если вы использовали "dd.MM.yyyy HH:mm:ss.SSSSSS" , тогда получите три ведущих нуля за миллисекунды.

Если вы использовали "dd.MM.yyyy HH:mm:ss.SSS'000'" , тогда вы могли форматировать дату, но не анализировать ни одну дату.

Попробуйте:

 public static void main(String[] args) throws ParseException { printDate("dd.MM.yyyy HH:mm:ss.SSS");//02.05.2010 21:45:58.073 printDate("dd.MM.yyyy HH:mm:ss.SSSSSS");//02.05.2010 21:45:58.000073 printDate("dd.MM.yyyy HH:mm:ss.SSS'000'");//02.05.2010 21:45:58.073000 printDate("dd.MM.yyyy HH:mm:ss.'000000'");//02.05.2010 21:45:58.000000 tryToParseDate("dd.MM.yyyy HH:mm:ss.SSS");//good tryToParseDate("dd.MM.yyyy HH:mm:ss.SSSSSS");//good tryToParseDate("dd.MM.yyyy HH:mm:ss.SSS'000'");//bad tryToParseDate("dd.MM.yyyy HH:mm:ss.'000000'");//good } private static void printDate(String formatString) { Date now = new Date(); SimpleDateFormat format = new SimpleDateFormat(formatString); String formattedDate = format.format(now); // print that date System.out.println(formattedDate); } private static void tryToParseDate(String formatString) { Date now = new Date(); SimpleDateFormat format = new SimpleDateFormat(formatString); String formattedDate = format.format(now); // try to parse it again try { format.parse(formattedDate); System.out.println("good"); } catch (ParseException e) { System.out.println("bad"); } } 
  • Использование активности камеры в Android
  • андроид на прослушивателе изменения текста
  • Электронная почта с внутреннего хранилища
  • Невозможно получить ответ response.body.toString () OkHttp для возврата строки
  • Почему окончательная переменная должна быть инициализирована до завершения конструктора?
  • ошибка идентификации устройства Android
  • libavcodec.so: имеет перемещение текста
  • Как случайным образом выбрать элемент из массива
  • Невозможно получить информацию о подписке из API разработчика Google Play для Android
  • Как проверить, существует ли class в пакете?
  • Каковы подводные камни Java noob?
  • Interesting Posts

    Dell Vostro 1000 с новой установкой XP Pro работает очень медленно

    Можно ли скопировать все файлы Windows 7 с одного HD на другой и загрузиться с нового HD?

    Блокировка веб-сайта после двух посещений в тот же день в Google Chrome

    Просмотр списка фильтров Android

    Есть ли способ скопировать лист Excel без копирования всех стилей ячеек в исходной книге в целевую книгу?

    ссылка на clang ++ на OS X генерирует много символов, не найденных ошибок

    Почему в Java нет множественного наследования, но допускается реализация нескольких интерфейсов?

    Относительная производительность std :: vector vs. std :: list vs. std :: slist?

    Что произойдет, если я попытаюсь получить доступ к памяти за пределами области malloc ()?

    вопросы об управлении именами в C ++

    Разделить data.frame на основе уровней фактора в новые data.frames

    Android ListView текущее местоположение прокрутки Y пикселей

    Сколько дискового пространства я должен использовать для своего Linux / раздела?

    Цвет текста в ListView Android

    Проложить маршруты с помощью API Карт Google v2

    Давайте будем гением компьютера.