Строки формата даты 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
Как отформатировать дату для отображения или использования в сценарии оболочки