Общий анализ даты в Java - PullRequest
       9

Общий анализ даты в Java

0 голосов
/ 10 октября 2018

У меня есть строки даты в различных форматах, например, 10 октября 11:05:03 или 12.12.2016, 4:30 и т. Д. Если я сделаю

// some code...
getDate("Oct 10 11:05:03", "MMM d HH:mm:ss");
// some code ...

Дата будет проанализирована, но я получаюгод как 1970 (так как год не указан в строке.) Но я хочу, чтобы год был текущим, если год не указан.То же самое относится ко всем полям.

вот моя функция getDate:

public Date getDate(dateStr, pattern) {
    SimpleDateFormat parser = new SimpleDateFormat(pattern); 
    Date date = parser.parse(myDate);
    return date;
}

Может кто-нибудь сказать мне, как сделать это внутри функции getDate (потому что я хочу универсальное решение)?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Если вы не знаете формат заранее, вам следует перечислить фактические форматы, которые вы ожидаете, а затем попытаться проанализировать их.В случае неудачи попробуйте следующий.

Вот пример того, как заполнить значение по умолчанию.

В итоге вы получите что-то вроде этого:

DateTimeFormatter f = new DateTimeFormatterBuilder()
    .appendPattern("ddMM")
    .parseDefaulting(YEAR, currentYear)
    .toFormatter();
LocalDate date = LocalDate.parse("yourstring", f);

Или, что еще лучше, вышеупомянутый класс форматирования поддерживает необязательные элементы .Оберните спецификатор года в квадратных скобках, и этот элемент будет необязательным.Затем вы можете указать значение по умолчанию: parseDefaulting.

. Вот пример:

String s1 = "Oct 5 11:05:03";
String s2 = "Oct 5 1996 13:51:56"; // Year supplied
String format = "MMM d [uuuu ]HH:mm:ss";

DateTimeFormatter f = new DateTimeFormatterBuilder()
    .appendPattern(format)
    .parseDefaulting(ChronoField.YEAR, Year.now().getValue())
    .toFormatter(Locale.US);

System.out.println(LocalDate.parse(s1, f));
System.out.println(LocalDate.parse(s2, f));

Примечание. Даты и время нелегки.Вы должны принять во внимание, что интерпретация даты часто зависит от локали, и это иногда приводит к неоднозначности.Например, строка даты «05/12/2018» означает 12 мая 2018 года, когда вы американец, но в некоторых европейских регионах это означает 5 декабря 2018 года. Вы должны знать об этом.

0 голосов
/ 10 октября 2018

Один из вариантов - объединить текущий год со строкой входящей даты, а затем проанализировать:

String ts = "Oct 10 11:05:03";
int currYear = Calendar.getInstance().get(Calendar.YEAR);
ts = String.valueOf(currYear) + " " + ts;

Date date = getDate(ts, "yyyy MMM d HH:mm:ss");
System.out.println(date);

Wed Oct 10 11:05:03 CEST 2018

Демо

Обратите внимание, что мы могли бы использовать StringBuilder выше, но для краткости кода я использовал вместо этого конкатенации необработанных строк.Я также исправил несколько опечаток в вашем вспомогательном методе getDate().

...