Попробуйте отформатировать шаблон даты Unix (% ​​Y-% m-% d) с помощью Android Kotlin, используя класс SimpleDateFormat, но безрезультатно - PullRequest
0 голосов
/ 25 января 2019

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

Я уже пробовал несколько библиотек дат и проводил много времени с исследованиями безрезультатно.

And here is simple of the code i am trying :

val simpleFormat = SimpleDateFormat("%Y-%m-%d", Locale.getDefault())
simpleFormat.timeZone = TimeZone.getDefault()
val now: Calendar = Calendar.getInstance()!!

Log.d("datedate", simpleFormat.format(now.time).toString())

Я получаю следующий результат% 2019-% 20-% 25

Я ищу нормальную дату, например 2019-4-25.

Ответы [ 3 ]

0 голосов
/ 25 января 2019

В SimpleDateFormat вы указываете, как хотите вывод даты.

В вашем примере у вас есть %Y-%M-%d, поэтому вы получите %2019-%01-%01

Если вы измените на Y-M-d, вы получите 2019-01-01

в своем коде

val simpleFormat = SimpleDateFormat("Y-m-d", Locale.getDefault())

Вы можете проверить Документацию для получения дополнительной информации

0 голосов
/ 26 января 2019

Строки формата даты Unix, например, %Y-%m-%d, следуют совершенно другой системе, чем строки шаблона формата, используемые в DateTimeFormatter Java или проблемные и устаревшие SimpleDateFormat, такие как yyyy-MM-dd (два класса Java с другой стороны, использовать довольно похожие, но не идентичные строки шаблона формата).

Я думаю, что первое, что вам нужно решить, это то, хотите ли вы охватить все возможные строки формата Unix или только самые распространенные. Строковый язык формата Unix довольно сложный. Достаточно просто перевести %Y в yyyy, %m в MM и т. Д., А %% в один %. Вам нужно будет заключать в кавычки любые буквы, которым не предшествует знак процента в одинарных кавычках, чтобы сообщить средству форматирования Java, что они не являются образцами букв. Например, Unix %d of %B должен быть dd 'of' MMMM в Java. Unix также включает %C век, который Java не поддерживает (или только через DateTimeFormatterBuilder и доморощенный TemporalField, вы не хотите беспокоиться). POSIX имеет несколько трехсимвольных расширений: %Ec, %EC, %Ex и т. Д., И вы можете вставить _, - или 0 между знаком процента и буквой для управления заполнением. Наконец, существуют различия между GNU и BSD, поэтому вам нужно решить, какой путь вы выберете.

Для перевода с Unix на Java вы, вероятно, сможете проделать длинный путь с помощью регулярных выражений, но если вы хотите охватить все случаи, я ожидаю, что ручное кодирование парсера будет легче в долгосрочной перспективе.

Взломать: String.format

String.format в Java использует строки формата, которые немного похожи на те, которые используются в Unix date. Основное отличие состоит в том, что у Java есть t между знаком процента и буквой: %Y в Unix равно %tY в Java и т. Д. Поэтому вставьте один:

    String unixFormatString = "%Y-%m-%d";
    // Insert 't'
    String javaFormatString = unixFormatString.replaceAll("(%)(\\w)", "$1t$2");

    ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Antarctica/Rothera"));

    // We need to pass the datetime to String.format as many times as there are
    // format specifiers in the format string. There cannot be more than half of the
    // length of the string. Passing too many doesn’t harm, so just pass this many.
    Object[] formatArgs = Collections.nCopies(javaFormatString.length() / 2, now).toArray();
    String formattedDateTime = String.format(javaFormatString, formatArgs);
    System.out.println(formattedDateTime);

Когда я сегодня запускал этот фрагмент, я получил:

2019-01-26

Есть очень много случаев, которые он не охватывает, но он охватывает многие из наиболее распространенных.

Link

Как отформатировать дату для отображения или использования в сценарии оболочки

0 голосов
/ 25 января 2019

Удалите символ % из кода форматера даты или измените его на код ниже.Дата должна отображаться правильно.

val simpleFormat = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault())

...