Другой ответ, поскольку вы, похоже, сосредоточены на просто разрыве String
(не очень хорошая идея, ИМХО.) Предположим, что строка действительна для ISO8601. Можете ли вы предположить, что он будет всегда быть в форме, которую вы цитируете, или она действительно действительна 8601? Если последний, вы должны справиться с кучей сценариев, как these guys did.
Регулярное выражение они придумали для проверки 8601 альтернатив является:
^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-2])
(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])
((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?
([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$
Выяснить, как дразнить правильные группы захвата заставляет меня ошалевший. Тем не менее, следующий будет работать для вашего конкретного случая:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Regex8601
{
static final Pattern r8601 = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})T((\\d{2}):"+
"(\\d{2}):(\\d{2})\\.(\\d{3}))((\\+|-)(\\d{2}):(\\d{2}))");
//2010-09-18T10:00:00.000+01:00
public static void main(String[] args)
{
String thisdate = "2010-09-18T10:00:00.000+01:00";
Matcher m = r8601.matcher(thisdate);
if (m.lookingAt()) {
System.out.println("Year: "+m.group(1));
System.out.println("Month: "+m.group(2));
System.out.println("Day: "+m.group(3));
System.out.println("Time: "+m.group(4));
System.out.println("Timezone: "+m.group(9));
} else {
System.out.println("no match");
}
}
}
Я думаю, что вы ищете регулярное выражение или аналогичный ответ. Я предоставил второй ответ с конкретным рабочим циклом для этого конкретного решения ... – andersoj