2015-12-04 5 views
2

Если у меня есть строка, содержащая дату в формате (неизвестно) «d/MM/YY» или «m: d: YYYY» и т. Д.).Получение даты из неизвестной строки формата даты

Как я могу разобрать его и получить значения день, месяц, год?

Я попытался разобрать их, заполнив массив всеми комбинациями форматов и попытаться разобрать дату с каждым из них, я думаю, что это глупое решение!

Любые идеи?

+2

Что означает «и т. Д.»? Если вы можете принять «dd/MM/yyyy» и «MM/dd/yyyy» (оба из которых довольно распространены), то это игра - вы не можете надеяться, что «04/12/2015» - 4 декабря или 12 апреля. –

+0

Если у вас много строк с одним шаблоном - игра еще не закончена, вы можете анализировать всю строку и находить там, где день и месяц. –

ответ

3

вам лучше использовать natty

очень полезная библиотека,

вот пример того, как использовать его:

public static Date parse(String date) throws Exception { 

    try{ 

     List<DateGroup> parse = new PrettyTimeParser().parseSyntax(date); 
     return parse.get(0).getDates().get(0); 

    }catch (Exception e){ 
     throw new Exception("unparseable date: " + date); 
    } 

} 
+0

PrettyTimeParser .. для него появилось много библиотек, какой из них PLZ? –

+0

Я отредактировал ответ, нажмите на natty. и перейдите на страницу github и загрузите последнюю версию – nafas

+0

no Jar file your! –

1

Попробуйте использовать это:

public static void main(String []args){ 
     SimpleDateFormat dt = new SimpleDateFormat(); 
     TimeZone date; 
     date = dt.getTimeZone(); 
    Calendar cal = Calendar.getInstance().getInstance(Locale.UK); 
    cal.setTimeZone(date); 
    int year = cal.get(Calendar.YEAR); 
    int month = cal.get(Calendar.MONTH); 
    int day = cal.get(Calendar.DAY_OF_MONTH); 

     System.out.println(year); 
     System.out.println(month); 
     System.out.println(day); 
    } 
+0

вы указали шаблон «dd/MM/yyyy»! , я хочу разобрать, не зная, что это шаблон –

1

Если вы не знаете формат рисунка, вы можете использовать что-то вроде этого

DateTimeFormatter formatter1 = DateTimeFormat.forPattern("d/MM/YY") 
      .withLocale(Locale.UK); 
    DateTimeFormatter formatter2 = DateTimeFormat.forPattern("m:d:YYYY") 
      .withLocale(Locale.UK); 
    ... 
    DateTimeFormatter formatterN = DateTimeFormat.forPattern(... 

    String stringDate = "08:18:2012"; 
    LocalDate date; 
    try { 
     date = formatter1.parseLocalDate(stringDate); 
    } catch (Exception exp) { 
     try { 
      date = formatter2.parseLocalDate(stringDate); 
     } catch (Exception exp) { 
      ... 
      date = formatterN.parseLocalDate(stringDate); 
     } 
    } 

ИЛИ с использованием списка:

List<DateTimeFormatter> formatterList = new ArrayList<>(); 
    formatterList.add(DateTimeFormat.forPattern("d/MM/YY") 
      .withLocale(Locale.UK)); 
    formatterList.add(DateTimeFormat.forPattern("m:d:YYYY") 
      .withLocale(Locale.UK)); 
    ... 
    formatterList.add(DateTimeFormat.forPattern(... 

    String stringDate = "08:18:2012"; 
    LocalDate date; 
    for(DateTimeFormatter formatter : formatterList) { 
     try { 
      return formatter.parseLocalDate(stringDate); 
     } catch (Exception exp) { 

     } 
    } 

Но это невозможно, если у вас есть образец, как "D/MM/YY" и "ММ/д/YY", потому что вы можете узнать, какая строка «01/01/15 "означает (где день и месяц). Только если у вас много строк с одним шаблоном, вы можете статистически определить, что такое день и что такое месяц (месяц никогда не будет больше 12).

Смежные вопросы