Самый быстрый способ для преобразования формата даты в Java? - PullRequest
0 голосов
/ 12 марта 2012

У меня есть текстовое поле, в котором отображаются строки даты в следующем формате: MM / dd / yyyy (например, 12.03.2012) ... И я хочу преобразовать его в этот формат: yyyy-MM-dd (например, 2012 г.)-03-12) ... Так что в основном мне нужно преобразование:

MM/dd/yyyy ---> yyyy-MM-dd

Оба типа данных будут строками ..

Какой самый быстрый способ сделать это?

Ответы [ 10 ]

6 голосов
/ 12 марта 2012

Я бы просто использовал отдельный объект формата (то есть SimpleDateFormat или DateFormat) и применил бы его к тому же объекту Date.

Нет смысла преобразовывать строковые представленияодного и того же объекта;имеет больше смысла предоставлять разные взгляды.

5 голосов
/ 12 марта 2012
DateFormat formatter = new SimpleDateFormat("MM/dd/yy");
Date date = (Date)formatter.parse("03/12/2012");

formatter = new SimpleDateFormat("yyyy-MM-dd");
String formattedDate = formatter.format(date); //yyyy-MM-dd
3 голосов
/ 29 октября 2016

Вы запросили самый быстрый способ:

@Test
public void test() {
    assertEquals("2016-10-29", convert("10/29/2016"));
}

// MM/dd/yyyy ---> yyyy-MM-dd
public static String convert(final String date) {
    // We assume that the format is guaranteed to be correct,
    // otherwise add validation logic
    final char[] chars = new char[10];
    date.getChars(0, 5, chars, 5); // MM/dd
    date.getChars(6, 10, chars, 0); // yyyy
    chars[4] = chars[7] = '-';
    return new String(chars);
}
3 голосов
/ 12 марта 2012

Вы можете просто использовать String # split следующим образом:

String str = "03/12/2012";
String arr[] = str.split("/");
String newDate = arr[2] + '-' + arr[0] + '-' + arr[1];
3 голосов
/ 12 марта 2012

Вы могли бы просто сделать это с изменением строки - но лично я бы проанализировал некоторое представление даты / времени, а затем снова отформатировал.

Для стандартных библиотек вы можете использовать для этого SimpleDateFormat. Лично я бы использовал Joda Time и проанализировал LocalDate с DateFormatter (затем отформатировал с другим). Вы создали бы DateTimeFormatter экземпляров с DateTimeFormat. Обратите внимание, что классы формата Joda Time являются поточно-ориентированными; стандартная библиотека Java - нет.

1 голос
/ 12 марта 2012

Из-за «У меня есть текстовое поле, в котором отображаются строки даты», вы просто должны использовать обычный DateFormat. Маловероятно, что вы заметите какую-либо ощутимую разницу в производительности вашего приложения, оптимизировав форматирование даты. Так что просто перейдите к чему-то вроде (и, возможно, повторно используйте парсер и форматер, пока вы находитесь в одном потоке):

SimpleDateFormat parser = new SimpleDateFormat("MM/dd/yyyy");
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String date = "03/12/2012";
Date d = parser.parse(date);
String result = formatter.format(d);

Если вы когда-нибудь сталкивались с ситуацией, когда производительность этого действительно имеет значение, то вы можете пойти на этот вид реализации (не так много экземпляров String, созданных с использованием подходов subtring):

String date = "03/12/2012";
char[] cc = date.toCharArray();
char[] converted = {cc[6], cc[7], cc[8], cc[9], '-', 
                    cc[0], cc[1], '-', cc[3],cc[4]};
String result = new String(converted);
1 голос
/ 12 марта 2012

Вы можете найти хороший пример того, что вы хотите там:

SimpleDateFormat Converting

Вам просто нужно использовать SimpleDateFormat, чтобы сделать это.

0 голосов
/ 29 октября 2016

java.time

Быстрое написание:

LocalDate.parse( 
    "03/12/2012" ,
    DateTimeFormatter.ofPattern( "MM/dd/uuuu" ) 
).toString()

Ваш желаемый результат соответствует ISO 8601 стандарт для форматирования строк даты и времени.Классы java.time используют эти стандартные форматы при разборе и генерации строк, представляющих их значение.

Класс java.time.LocalDate встроен в Java 8 и более поздние версии и представляет значение только для датыбез времени суток и без часового пояса.

Большая часть функциональности java.time перенесена на Java 6 & 7 в ThreeTen-Backport и дополнительно адаптирована для Android в ThreeTenABP .

Быстрее всего выполнить?

Если мы кешируем DateTimeFormatter, стоимость каждого разбора строки для генерации-a-string занимает треть микросекунды, 300-400 наносекунд, при работе в NetBeans 8.2 под Java 8 Update 111 на MacBook Pro (Retina, 15-дюймовый, конец 2013 г.) (процессор Intel Core i7 с частотой 2,3 ГГц) (16GB 1600 МГц DDR3) (macOS El Capitan).

DateTimeFormatter f = DateTimeFormatter.ofPattern ( "MM/dd/uuuu" );
int limit = 100_000_000; // Number of iterations of parsing a string to generate a string.
long start = System.nanoTime ();
for ( int i = 0 ; i < limit ; i ++ ) {
    String s = LocalDate.parse ( "03/12/2012" , f ).toString ();
}
long stop = System.nanoTime ();
long elapsedNanos = ( stop - start );
long elapsedSeconds = TimeUnit.NANOSECONDS.toSeconds ( elapsedNanos );
long eachNanos = ( elapsedNanos / limit );
System.out.println ( "For limit of " + limit + " took seconds: " + elapsedSeconds + " and each iteration took nanoseconds: " + eachNanos );

Для ограничения 100000000 потребовалось секунд: 33, а каждая итерация занимала наносекунды: 332

Создание экземпляра DateTimeFormatter, кажется, занимает около 200 наносекунд, почти удваиваяВремя выполнения.Измените одну строку кода выше, чтобы заменить аргумент f.

    String s = LocalDate.parse ( "03/12/2012" , DateTimeFormatter.ofPattern ( "MM/dd/uuuu" ) ).toString ();

Для ограничения 100000000 секунд потребовалось: 54, а каждая итерация заняла наносекунды: 542


О java.time

java.time Framework встроен в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые унаследованные классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на java.time.

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Где получить классы java.time?

  • Java SE 8 и SE 9 и более поздних версий
    • Встроенный,
    • Часть стандартного Java API с встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • Большая часть функций java.time перенесена на Java 6 & 7 в ThreeTen-Backport .
  • Android

Проект ThreeTen-Extra расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 12 марта 2012

Если входящий формат гарантирован, то

String inputDate = "12/31/1970"; // for example
String outputDate = inputDate.substring(6, 10) + '-' 
    + inputDate.substring(0, 2) + '-' 
    + inputDate.substring(3, 5);

, вероятно, самый быстрый из выполняемых.

Если входящий формат не гарантирован, я бы проанализировал и отформатировал, используя DateFormat какподсказано другими ответами.

0 голосов
/ 12 марта 2012

Возможно

String date = "MM/dd/yyyy";
String date2 = date.substring(6)+'-'+date.substring(3,5)+'-'+date.substring(0,2);
System.out.println(date2);

печать

yyyy-dd-MM

Он также будет переупорядочивать любую правильную (или неправильную дату)

...