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

Некоторое время я боролся с этим кодом для 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
  • Как отсортировать ArrayList в Java в порядке убывания?
  • IntelliJ показывает подсказки параметров метода использования - Как отключить его
  • Получение кадров из видеоизображения на Android
  • Ошибка соединения Bluetooth "java.io.IOException: чтение не выполнено, сокет может быть закрыт или таймаут, read ret: -1"
  • Click не работает с Listitem Listview android
  • Ошибка: class X является общедоступным, должен быть объявлен в файле с именем X.java
  • Как использовать WeakReference в разработке Java и Android?
  • Множественные разрешения для Android 6.0
  • Android Studio: не удалось выполнить выполнение gradleиента, причина пуста
  • Целочисленная арифметика в Java с символом char и integer literal
  • Interesting Posts

    Скрыть TabLayout на прокрутке содержимого вместо ToolBar

    «Введенный ключ продукта не соответствует ни одному из изображений Windows»

    Использовать зарезервированное ключевое слово enum case

    Что такое decltype с двумя аргументами?

    Загрузка Docx из IE – установка типов MIME в IIS

    Процессоры поддерживают скорость процессора

    C ++ for-loop – size_type vs. size_t

    Какое самое простое объяснение тому, что приложения Windows не совместимы с Linux?

    Предупреждение: «формат не строковый литерал и аргументы формата»

    Как переносить и группировать данные в Excel 2010?

    Как условно включить или отключить запланированные задания весной?

    Несколько версий Java, работающих одновременно под Windows

    Как перейти к новому окну браузера, который открывается после нажатия кнопки?

    Как автоматически сделать все введенные числа в строке отрицательными с помощью Excel?

    Как получить первые n символов строки без проверки размера или выхода за пределы?

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