2016-01-06 6 views
0

Не удается преобразовать строку в Joda LocalTime с DefaultFormattingConversionService.Невозможно преобразовать из строки в Joda LocalTime с DefaultFormattingConversionService

Если я передаю время как «12:00», это говорит о том, что время слишком короткое, но если я передам его как «12:00:00», он говорит, что он искажен.

import org.joda.time.LocalTime; 
import org.springframework.format.support.DefaultFormattingConversionService; 

public class SpringLocalTimeFormatterTry { 

    public static void main(String[] args) { 

     DefaultFormattingConversionService service = new DefaultFormattingConversionService(); 
     try { 
     System.out.println(service.convert("12:00", LocalTime.class)); 
     } 
     catch (Exception e) { 
     System.out.println(e.getMessage()); 
     } 
     try { 
     System.out.println(service.convert("12:00:00", LocalTime.class)); 
     } 
     catch (Exception e) { 
     System.out.println(e.getMessage()); 
     } 


    } 
} 

Как использовать его правильно или исправить?

+0

Если вы предоставите некоторые из кода, было бы легче увидеть, что проблема является. Вы используете конструктор для «LocalTime» или используете какой-то парсер? Трудно сказать. – mohammedkhan

+0

Почему вы используете 'DefaultFormattingConversionService'? Будет ли «LocalTime.parse» («12:00»), 'недостаточно? – mohammedkhan

+0

@mohammedkhan код над ним - SSCCE. Я использую 'DefaultFormattingConversionService', потому что это предпосылка. –

ответ

2

Настройки ваниль из DefaultFormattingConversionService использования платформы по умолчанию локали, который, я полагаю от ошибки, такие же, как у меня, то есть. Английский. Это означает, что на время вам нужно добавить индикатор AM/PM. Это работает для меня:

System.out.println(service.convert("10:12 am", LocalTime.class)); 

>> 10:12:00.000 

Чтобы обработать нужный формат времени, вы можете добавить дополнительный нейтрализатор:

service.addConverter(new Converter<String, LocalTime>() { 
    @Override 
    public LocalTime convert(String source) { 
     return LocalTime.parse(source); 
    } 
}); 

Затем оба примера проходят:

System.out.println(service.convert("12:00", LocalTime.class)); 
>> 12:00:00.000 
System.out.println(service.convert("12:00:00", LocalTime.class)); 
>> 12:00:00.000 

Вы можете пропустить регистрацию преобразователи по умолчанию, создав услугу с помощью

new DefaultFormattingConversionService(false); 

Наконец, я предполагаю, что в производстве код, который вы фактически получаете в ConversionService от ConversionServiceFactoryBean, так что вы можете настроить, что следующим образом:

@Bean 
public ConversionServiceFactoryBean conversionService() { 
    ConversionServiceFactoryBean conversionServiceFactoryBean = new ConversionServiceFactoryBean(); 
    Set<Converter<?, ?>> myConverters = new HashSet<>(); 
    myConverters.add(new Converter<String, LocalTime>() { 
     @Override 
     public LocalTime convert(String source) { 
      return LocalTime.parse(source); 
     } 
    }); 
    conversionServiceFactoryBean.setConverters(myConverters); 
    return conversionServiceFactoryBean; 
} 
0

Попробуйте это:

DateTimeFormatter dtf = DateTimeFormat.forPattern("HH:mm:ss"); 
LocalTime localTime = dtf.parseLocalTime("12:00:00"); 
System.out.println("Time"+localTime); 
+0

В этом случае она пытается анализировать только время, а не дату, поэтому 'DateTime' не подходит для использования здесь. – mohammedkhan

Смежные вопросы