Для того, чтобы игнорировать потенциально двойственную часть (повторение час, минуты и название зоны в другой зоне), вы должны написать свои собственный DateTimeParser в Joda время:
DateTimeFormatter dtf =
new DateTimeFormatterBuilder().appendPattern("HHmm 'GMT' (").append(
new DateTimeParser() {
@Override
public int estimateParsedLength() {
return 10;
}
@Override
public int parseInto(DateTimeParserBucket bucket, String text, int position) {
int pos = position;
while (text.charAt(pos) != ')') {
pos++;
}
return pos;
}
}
)
.appendPattern(") MMMM dd, yyyy")
.toFormatter()
.withLocale(Locale.US)
.withZoneUTC();
String input = "0022 GMT (0822 HKT) July 21, 2016";
DateTime dt = dtf.parseDateTime(input);
System.out.println("Joda: " + dt); // 2016-07-21T00:22:00.000Z
Для вашей информации, Я не вижу никакого способа сделать это в Java-8 (без предварительной обработки ввода), см. Этот пример, который генерирует исключение даже при использовании необязательных разделов. Java-8 не хватает механизма для написания собственного анализатора.
DateTimeFormatter dtf =
DateTimeFormatter.ofPattern("HHmm z ([HHmm z]) MMMM dd, uuuu", Locale.US);
ZonedDateTime zdt = ZonedDateTime.parse(input, dtf); // throws exception!!!
// java.time.format.DateTimeParseException:
// Text '0022 GMT (0822 HKT) July 21, 2016' could not be parsed at index 10
Side Примечание: Когда вы могли бы изучить мою библиотеку Time4J, который предлагает альтернативный и более производительный разбор двигатель, подходящий для Java-8, то он предлагает более простое решение, чем Joda-Time, увидеть эту маленькую gist example.
Else писать хак обходного с использованием строки предварительной обработкой всегда возможно (интересно, когда третья сторона библиотека не допускается):
String input = "0022 GMT (0822 HKT) July 21, 2016";
StringBuilder sb = new StringBuilder();
boolean markedForRemoval = false;
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
if (c == ')') {
markedForRemoval = false;
}
if (!markedForRemoval) {
sb.append(c);
}
if (c == '(') {
markedForRemoval = true;
}
}
input = sb.toString();
System.out.println(input); // 0022 GMT() July 21, 2016
// continue parsing the changed input based on a formatter of your choice