2016-12-08 4 views
2

Я могу разобрать все типы дат, но у этого есть дополнительное письмо в месяцах. Как это разобрать?Как разобрать «Thu, 8 Dece 2016 09:54:00 GMT» с дополнительным «e» в этом месяце?

Я не знаю, как наступают остальные месяцы, но, надеюсь, они приходят как месяцы с 4 буквами. Я использую формат E, dd MMM yyyy HH:mm:ss z, и возникает исключение при смещении 10.

+0

Можете ли вы объяснить, как там 'e'? Является ли это правильной аббревиатурой названия месяца, когда локализовано в какой-то определенной локали? –

ответ

0
// java  
String input = "Thu, 8 Dece 2016 09:54:00 GMT"; 
String p = "[^.*,\\s\\d+\\s+]+[\\s+]"; 
Pattern pattern = Pattern.compile(p); 
Matcher m = pattern.matcher(input); 
while (m.find()) { 
    String month = m.group().substring(0, 3); 
    input = input.replaceFirst(p, month + " "); 
} 
System.out.println(input); // Thu, 8 Dec 2016 09:54:00 GMT 

Если вы используете формат E, dd MMM yyyy HH:mm:ss Z ваша дата строка должна выглядеть Thu, 08 Dec 2016 19:33:26 +0000. Не уверен, почему месяц имеет 4 символа. В предыдущем случае вы можете конвертировать из одного формата в другой с помощью SimpleDateFormat:

try { 
    String input = "Thu, 8 Dec 2016 09:54:00 GMT"; 
    SimpleDateFormat sdf1 = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss Z"); 
    Date date1 = sdf1.parse(input); 
    SimpleDateFormat sdf2 = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss"); 
    String date2 = sdf2.format(date1); 
    System.out.println("Parsed : " + date2); //Parsed : 08-12-2016 09:54:00 
} catch (Exception e) { 
    System.out.println(e); 
} 
+0

Это js .... OP более java-ориентированный .... –

+0

О, пропустил тег java. – boring

+0

Ответ обновлен до версии java. – boring

2

Вы можете настроить DateFormatSymbols, используемый SimpleDateFormat:

DateFormatSymbols symbols = DateFormatSymbols.getInstance(); 

String[] months = symbols.getShortMonths(); 
months[11] = "Dece"; 
symbols.setShortMonths(months); 

DateFormat fmt = 
    new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", symbols); 

String s = "Thu, 8 Dece 2016 09:54:00 GMT"; 
Date date = fmt.parse(s); 

Вы также можете сделать это с Java 8 Дата- временные классы, хотя это немного более подробный:

Locale locale = Locale.getDefault(); 
Map<Long, String> monthNames = new HashMap<>(12); 
for (Month month : Month.values()) { 
    long value = month.getValue(); 
    String name = month.getDisplayName(TextStyle.SHORT, locale); 
    monthNames.put(value, name); 
} 

monthNames.put(12L, "Dece"); 

DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder(); 
builder.appendPattern("EEE, d "); 
builder.appendText(ChronoField.MONTH_OF_YEAR, monthNames); 
builder.appendPattern(" yyyy HH:mm:ss z"); 

DateTimeFormatter formatter = builder.toFormatter(); 

String s = "Thu, 8 Dece 2016 09:54:00 GMT"; 
ZonedDateTime dateTime = ZonedDateTime.parse(s, formatter); 
Date date = Date.from(dateTime.toInstant()); 
+0

Благодарим вас за ответ. –