2015-12-23 3 views
1

Вот мой оригинальный код-Разница между чч: мм а и HH: мм в

String dateString = "23 Dec 2015 1:4 PM"; 
Locale locale = new Locale("en_US"); 
SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm a"); 
DateFormat df = new SimpleDateFormat("dd MMM yyyy HH:mm a", locale); 
Date date = null; 

try { 
    date = formatter.parse(dateString); 
} catch (ParseException e) { 
    LOGGER.error(e); 
} 

String newDate = df.format(date); 
System.out.println("oldDate = " + dateString); 
System.out.println("newDate = " + newDate); 

и вот мой output-

oldDate = 23 Dec 2015 1:4 PM 
newDate = 23 Dec 2015 01:04 AM 

Существует разница AM-PM между oldDate и newDate. Теперь я изменил код DateFormat to-

SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy hh:mm a"); 
DateFormat df = new SimpleDateFormat("dd MMM yyyy hh:mm a", locale); 

и я получаю ожидаемый вывод, что это-

oldDate = 23 Dec 2015 1:4 PM 
newDate = 23 Dec 2015 01:04 PM 

Я знаю, что HH означает формат 24 часа и hh означает 12-часовой формат.

Мой вопрос

Если я использую HH:mm a вместо hh:mm a, не это должно быть возвращение времени в 24-часовом формате?

(или)

Если он по умолчанию 12-часовой формат, она не должна возвращать соответствующий AM/PM маркер в зависимости от ввода даты при условии?

Это только для моего понимания.

ответ

7

Обновлено Ответ

Здесь проблема с Program flow

SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm a"); 

этого simple date formatter используется для форматирования строки даты объект Даты создан, здесь является важной частью ответа

Как вы используете HH вместо чча, в SimpleDateFormater считает, что указанная строка даты находится в 24-Hour Format и просто игнорируетAM/PM marker здесь.

даты объекта от построен из этого SimpleDateFormatter передается

DateFormat df = new SimpleDateFormat("dd MMM yyyy HH:mm a", locale); 

Вот почему это печать

newDate = 23 Dec 2015 01:04 AM 

, если вы измените строку

SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm a"); 

с

SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy hh:mm a"); 

Все пойдет гладко, как должно!

Примечание: при создании языкового стандарта вы должны передать код языка в конструктор Locale(). en-us нет en_us.

IMP: Код испытания на Java 8 также. Java(TM) SE Runtime Environment (build 1.8.0_121-b13)

+0

Спасибо @MenoHochschild. Пожалуйста, взгляните на мой ответ еще раз! –

+1

Ну что ж, лучше, но рекомендация 'new Locale (« en-us »)' все еще неверна. –

+0

@MenoHochschild со всем уважением. Я хотел бы знать, что мы можем построить Locale в Java 8 (1.8.0_121) 'из языка, как указано в моем ответе! –

5

Разница между чч: мм чч: мм:

HH:mm => will look like 00:12, 23:00... this has 24 hour format. 

    hh:mm => will look like 01:00Am, 02:00Am,...01:00pm this has 12 hour format. 

И в a в чч: мм а или в HH: мм а является AM/PM маркер для получения дополнительной информации перейдите к link

1

Простой тест - лучший ответ на то, как интерпретируется шаблон «HH: mm a». Сначала давайте исследуем режим печати:

старый формат двигателя SimpleDateFormat:

Calendar cal = new GregorianCalendar(2015, 3, 1, 17, 45); 
SimpleDateFormat sf = new SimpleDateFormat("HH:mm a", Locale.US); 
System.out.println(sf.format(cal.getTime())); // 17:45 PM 

Java-8 (с новым пакетом java.time.format):

LocalTime time = LocalTime.of(17, 59); 
DateTimeFormatter tf = DateTimeFormatter.ofPattern("HH:mm a", Locale.US); 
System.out.println(tf.format(time)); // 17:59 PM 

Здесь мы не наблюдаем никакого переопределения в обоих случаях SES. Я предпочитаю этот подход, потому что использование комбинации «HH» и «a» на мой взгляд скорее является признаком ошибки программирования (пользователь, очевидно, недостаточно думал о значении и официальном описании этих символов шаблонов).

Теперь давайте исследуем режим синтаксического анализа (и мы будем использовать строгий режим, чтобы наблюдать, что на самом деле происходит за сценой):

String dateString = "23 Dec 2015 1:4 PM"; 
SimpleDateFormat df = new SimpleDateFormat("dd MMM yyyy H:m a", Locale.US); 
df.setLenient(false); 
Date date = df.parse(dateString); 
// java.text.ParseException: Unparseable date: "23 Dec 2015 1:4 PM" 

Как это поведение в Java-8? Это то же самое, но с более четким сообщением об ошибке:

DateTimeFormatter tf = DateTimeFormatter.ofPattern("H:m a", Locale.US); 
tf = tf.withResolverStyle(ResolverStyle.STRICT); 
LocalTime.parse("1:4 PM", tf); 
// DateTimeException: Cross check failed: AmPmOfDay 0 vs AmPmOfDay 1 

Это сообщение говорит о том, что разобранный час (! В 24-часовом формате) со значением «1» указывает AM, а ввод текста содержит другой разобранную AM/PM-значение «PM». Эта амбивалентность не может быть решена.

Урок: Мы должны быть осторожны с мягким разбором, где противоречивую информацию можно игнорировать и приводить к ложным предположениям. Принятый ответ от @Arjun совершенно неверен.

Кстати: Пожалуйста, используйте Locale.US или new Locale("en", "US") вместо new Locale("en-US"), потому что языка «en-US» не существует.

+0

Здравствуйте, @MenoHochschild любезно посмотрите на ответ! Спасибо за вашу конструктивную критику! Я хотел бы услышать от вас! –

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