Альтернативы SimpleDateFormat для разбора даты - PullRequest
3 голосов
/ 23 февраля 2012

Мне действительно нужна альтернатива SimpleDateFormat, я конвертирую много-много дат Стрига (> 100k) из JST в GMT. У меня проблема в том, что мой код генерирует путь ко многим символам [], как я заметил во время профилирования. Для 150k дат я получаю постоянную 150 МБ используемой памяти, и это не совсем вариант. Спасибо.

    SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
    sdf.setTimeZone(tz);
    try {
        Date theResult = sdf.parse(dateToConvert);
        SimpleDateFormat rdf = new SimpleDateFormat(resultDateFormat);
        rdf.setTimeZone(resultTz);
        return rdf.format(theResult);
    } catch (ParseException e) {
        e.printStackTrace();
    }

Я не могу использовать время Йода, так что это не вариант для меня. (

Ответы [ 5 ]

9 голосов
/ 23 февраля 2012

использовать Joda-Time

org.joda.time.format.DateTimeFormatter dtf = 
         org.joda.time.format.DateTimeFormat.forPattern("yyyy-MM-dd");  
    org.joda.time.DateTime date = dtf.parseDateTime(yourDate); // String like 2000-12-12
    date.withZone(yourZone); // org.joda.time.DateTimeZone
4 голосов
/ 23 февраля 2012

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

3 голосов
/ 23 февраля 2012

Да, у joda time действительно хороший API, но user1143825 забывают установить timeZone для ввода.И я не могу сказать о производительности памяти, вам нужно протестировать ее и сравнить результаты.

Это должно работать:

DateTimeFormatter sdf = DateTimeFormat.forPattern(dateFormat).withZone(tz);
try {
  DateTime theResult = sdf.parseDateTime(dateToConvert).withZone(resultTz)
  return theResult;
} catch (IllegalArgumentException e) {
  e.printStackTrace();
}
2 голосов
/ 19 июля 2013

с использованием Java

            sample time format //31/Mar/2013:16:59:30 -0700 
            Date date = new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss Z").parse(yourTIME);
            String time= new SimpleDateFormat("dd/MMM/yyyy, HH:mm").format(date);

Использование преобразования времени библиотеки joda

         org.joda.time.format.DateTimeFormatter tf=org.joda.time.format.DateTimeFormat.forPattern("dd/MMM/yyyy:HH:mm:ss Z");
         org.joda.time.DateTime date = dtf.parseDateTime(time);
         String time=date.toString("dd/MMM/yyyy, HH:mm"));

в этой библиотеке улучшено быстродействие моего кода

с использованием кода Java 14991 мс с использованием библиотеки joda 1668 мс

0 голосов
/ 23 февраля 2012

Есть ли у вас особые основания полагать, что SimpleDateFormat неэффективен при разборе дат?Если ваши даты не имеют очень специфической характеристики, которая поддается определенной оптимизации, я бы подумал, что класс JDK выполнит разумную работу.

Тем не менее, наПредполагая, что ваши даты не все различны (маловероятно, что с 100 КБ), вы можете посмотреть на кеширование - заполните карту с передачей String и выходом Date.Это, вероятно, значительно сократит количество необходимых разборов;это может или не может привести к заметному ускорению / увеличению памяти в зависимости от существующих характеристик.

Кроме того, создание двух новых SimpleDateFormat каждый раз может быть очень неэффективным.Почему бы не создать эти экземпляры один раз при загрузке класса (если формат не изменяется по строке)?Это само по себе может решить вашу проблему, если внутренняя часть SDF такова, что при первом запуске она занимает много места char[].(Помните, что причудливые форматы дат не поддерживают многопотоковое исполнение, поэтому вам может потребоваться ThreadLocal<DateFormat>, если ваш класс синтаксического анализа используется одновременно).

...