tl; dr
Back-порт классов java.time занимает за микросекунду для генерации String
из LocalDate
вВаш желаемый шаблон.
String output = myLocalDate.toString() ; // Takes less than a microsecond.
Используя эту библиотеку, я не стал бы беспокоиться о узких местах строк даты и времени.
ThreeTen-Backport
Современный подход использует классы java.time , которые вытеснили ужасные старые классы даты и времени, такие как Date
& Calendar
.Для Java 6 и 7 большая часть этой функциональности перенесена в проект ThreeTen-Backport с использованием почти идентичного API.Добавьте библиотеку и импортируйте: import org.threeten.bp.*;
Ваш пример формата YYYY-MM-DD используется по умолчанию для класса LocalDate
при синтаксическом анализе / генерации текста.
Пример кода.
Настройка списка LocalDate
объектов.
long years = 1000;
LocalDate today = LocalDate.now();
LocalDate lastDate = today.plusYears( years );
int initialCapacity = ( int ) ( ( years + 1 ) * 366 );
List < LocalDate > dates = new ArrayList <>( initialCapacity );
LocalDate localDate = today;
System.out.println( "From: " + today + " to: " + lastDate );
while ( localDate.isBefore( lastDate ) ) {
dates.add( localDate );
// Setup next loop.
localDate = localDate.plusDays( 1 );
}
Выполнение теста.
long start = System.nanoTime();
for ( LocalDate date : dates ) {
String output = date.toString(); // Generate text in standard ISO 8601 format.
}
long stop = System.nanoTime();
long elapsed = ( stop - start );
long nanosEach = elapsed / dates.size();
System.out.println( "nanosEach: " + nanosEach );
Результаты: по микросекунде каждый
При работе на MacBook Pro (Retina, 15-дюймовый, конец 2013 г.), 2,3 ГГц Intel Core i7, 16 ГБ 1600 МГц DDR3, в IntelliJ 2018.3, с использованием Java 10.0.2 из OpenJDK * на базе *1047* JVM Zulu от Azul Systems ...
При выполнении 100-летней партии я получаю около 650 наносекунд каждая.Это примерно две трети микросекунды.
При выполнении серии из 1000 лет я получаю около 260 наносекунд каждая.Это примерно четверть микросекунды.
Я сомневаюсь, что обработка строк с датами в этой библиотеке окажется узким местом в производительности вашего приложения.
Потоковая безопасность
Классы java.time разработаны для обеспечения поточной безопасности , включая использование неизменяемых объектов .
Вы можете кэшироватьодин DateTimeFormatter
объект, и используйте его многократно, даже между потоками.
Ваш желаемый формат, определенный стандартом ISO 8601 , предварительно определен как константа в обоих java.time и в библиотеке ThreeTen-Backport : DateTimeFormatter .ISO_LOCAL_DATE
.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd" ) ; // Or just use the pre-defined constant for that particular pattern, `DateTimeFormatter .ISO_LOCAL_DATE`, also used by default in `LocalDate::toString`.
…
String output = localDate.format( f ) ;
О java.time
Фреймворк java.time встроен в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .
Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где получить классы java.time?