2015-11-23 8 views
0

У меня есть метка времени, которая выглядит примерно так: 2015-11-12T20:45:24+0000. Это генерируется чужим скриптом, который якобы использует команду UNIX date (возможно, что-то вроде строк date -u +%Y-%m-%dT%H:%M:%S%z).Есть ли лучший способ отформатировать эту метку времени до ISO8601?

Однако, согласно DateTimeFormatter Яве, ближайший формат ISO 8601 для этого будет ISO_OFFSET_DATE_TIME, который выглядит следующим образом: 2015-11-12T20:45:24+00:00 (уведомления дополнительного двоеточие в конце). Если я передам в свою версию отметки времени, синтаксический анализатор не сможет обработать его, но если я вручную добавлю двоеточие, то проблем не будет.

Мой вопрос: Есть ли более простой, надежный/надежный способ обработки этих временных меток? Я получаю временные метки, которые могут или не могут иметь, что окончательное двоеточие ограничивающую минуты и секунды, и в настоящее время мой код имеет такую ​​проверку в нем:

// We expect a colon at index length-3 (the colon delimits the hours:minutes of the timezone offset) 
char colon = ':'; 
int expectedIndexOfColon = string.length() - 3; 

// If that colon is not there, add it 
if (string.lastIndexOf(colon) == expectedIndexOfColon) { 
    return string; 
} else { 
    int substringIndex = string.length() - 2; 
    return string.substring(0, substringIndex) + colon + string.substring(substringIndex); 
} 

Это выглядит Hacky, и мне было интересно, если бы был более элегантный способ обработки этих двух разных форматов. Я знаю о Joda-Time, но их парсер также отклоняет временную метку без двоеточия (от того, что я пробовал). Кроме того, Joda-Time рекомендует использовать Java java.time для Java 8 в любом случае (это я).

+0

Создайте два формата, которые отвечают вашим требует один и один без ':', попробуйте оба и используйте тот, который не сбой – MadProgrammer

+0

@MadProgrammer. Что вы подразумеваете под созданием двух форматов? – yiwei

+0

Вы можете использовать 'DateTimeFormatter.ofPattern' для создания собственных шаблонов. Если в тексте иногда есть ':', а иногда нет, вы можете использовать два форматирования для проверки текста и использовать тот, который проходит – MadProgrammer

ответ

2

Если ваш код ожидает несколько разных форматов, вам необходимо учитывать эти различия.

Общий подход, чтобы положить ваши ожидаемые форматы в какой-то массив List и перебрать это, находя формат, который не выбрасывает исключение

Например:

  • DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ") является в состоянии разобрать 2015-11-12T20:45:24+0000
  • DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssz") способен разобрать 2015-11-12T20:45:24+00:00

Вы могли бы использовать что-то вроде ...

public static LocalDateTime parse(String text, List<DateTimeFormatter> formats) { 
    LocalDateTime ldt = null; 
    for (DateTimeFormatter formatter : formats) { 
     try { 
      ldt = LocalDateTime.parse(text, formatter); 
     } catch (DateTimeParseException e) { 
      // Maybe log the failure if you're interested 
     } 
    } 
    return ldt; 
} 

Тогда вы могли бы использовать что-то вроде ...

List<DateTimeFormatter> formats = new ArrayList<>(2); 
formats.add(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ")); 
formats.add(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssz")); 
System.out.println(parse("2015-11-12T20:45:24+0000", formats)); 
System.out.println(parse("2015-11-12T20:45:24+00:00", formats)); 

Какие выходы ...

2015-11-12T20:45:24 
2015-11-12T20:45:24 
+0

Вы знаете, почему это 'z' и' Z' вместо 'x' и' X'? Я смотрю на [шаблоны] (https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#patterns), а 'x' и' X' выглядят больше интуитивно ... но они, конечно, не работают, когда я их использую – yiwei

+0

Также спасибо за ваш ответ ... Я думаю, что это похоже на третий вопрос, который вы мне помогли за последние несколько лет. xD – yiwei

+0

Для меня это неясно, почему «Z» или «z» будут иметь значение (или почему «X» или «x» не сработают), сформируйте то, что я могу сказать, 'x' или' Z' должны были работать для обоих форматов, но это не было в моих тестах: P – MadProgrammer

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