Насколько мне известно, ответ - нет, другой библиотеки для разбора строк, таких как 2018-01-02T12:34:56+00:00"
(формат ISO 8601), в OffsetDateTime
нет.Я бы ожидал услышать или прочитать об этом, если бы он существовал.
Я нахожусь на тонком льду со следующим пунктом, но у меня также сложилось впечатление, что стандартная библиотека (AKA java.time)достаточно эффективен и, вероятно, примерно так же быстро, как вы можете ожидать.
Редактировать: Мне стало любопытно, и я написал свой собственный метод разбора, чтобы посмотреть, смогу ли я превзойти одно-argOffsetDateTime.parse
.Я был.Мой собственный метод (источник ниже) не обладает гибкостью встроенного метода, он принимает только один из огромного числа вариантов стандартного формата, что может быть его сильной стороной с точки зрения производительности.Разбор вашей строки миллион раз занял:
- 1,034 секунды, используя
OffsetDateTime.parse
- 0,117 секунды, используя мой собственный метод
Это не рекомендация!Я, вероятно, никогда не использовал бы свой собственный метод.Для подавляющего большинства целей затраты на обслуживание не будут стоить этого.Если однажды появится другой вариант ISO 8601, у вас возникнет дорогостоящая проблема поддержки и исправления ошибки.
Мой метод довольно прост:
private static final OffsetDateTime parse(String s) {
char offsetSign;
if (s.length() != 25
|| s.charAt(4) != '-'
|| s.charAt(7) != '-'
|| s.charAt(10) != 'T'
|| s.charAt(13) != ':'
|| s.charAt(16) != ':'
|| ((offsetSign = s.charAt(19)) != '+' && offsetSign != '-')
|| s.charAt(22) != ':') {
throw new IllegalArgumentException();
}
int offsetHours = Integer.parseInt(s.substring(20, 22));
int offsetMinutes = Integer.parseInt(s.substring(23, 25));
if (offsetSign == '-') {
offsetHours = -offsetHours;
offsetMinutes = -offsetMinutes;
}
return OffsetDateTime.of(Integer.parseInt(s.substring(0, 4)),
Integer.parseInt(s.substring(5, 7)),
Integer.parseInt(s.substring(8, 10)),
Integer.parseInt(s.substring(11, 13)),
Integer.parseInt(s.substring(14, 16)),
Integer.parseInt(s.substring(17, 19)),
0,
ZoneOffset.ofHoursMinutes(offsetHours, offsetMinutes));
}
Я знаю об ошибках вкод.Я не думаю, что стоит тщательно проверять и исправлять ошибки в этом ответе, поскольку он вряд ли сильно повлияет на производительность.