2014-12-12 3 views
1

Ниже мой код времениКак форматировать время Java правильно

 
public class FormatTime { 

    public static void main(String[] args) throws Exception { 
     FormatTime ft = new FormatTime(); 
     System.out.println(ft.evaluate("12/01/2014 05:30:15 PM","MM/dd/yyyy hh:mm:ss aa", "yyyy-MM-dd HH:mm:ss")); 
    } 

    public String evaluate(String time,String iFormat ,String f) throws ParseException { 
     SimpleDateFormat format = new SimpleDateFormat(f); 
     SimpleDateFormat inFormat = new SimpleDateFormat(iFormat); 

     Date date=inFormat.parse(time); 
     String fechaNueva = format.format(date); 
     return fechaNueva; 
    } 

} 

Out положить этой программы форматирования, как и ожидалось, что он дает 2014-12-01 17:30:15.
Но когда я заменяю hh на HH в iFormat (то же, что и в outputformat), то он дает выход в формате 12 out 2014-12-01 05:30:15
То же самое происходит, если я конвертирую как в нижнем регистре, так и hh. Почему возникает такая непоследовательность?

+2

Если вы замените hh на HH в iFormat, тогда время 05:30:15 будет считаться 24-часовым часом, а PM игнорируется ... – beny23

+0

@agarwal_achhnera делает это [это] (http: // stackoverflow. com/questions/17341214/difference-between-java-hhmm-and-hhmm-on-simpledateformat) help –

+1

Я не уверен, почему этот вопрос был отклонен. Возможно, иллюстратор может объяснить свои причины? Конечно, в коде есть ошибка, но это вопрос вопросов о stackoverflow. Ошибка приводит к вопросу, и наша коллективная мудрость помогает решить эту проблему. Per ardua ad astra. Возможно, этот вопрос показал недостаточную исследовательскую работу (что касается всех вопросов, или они будут решены до перехода на stackoverflow), но это не показало никаких исследований. Я голосую, потому что это полезный, ясный вопрос. –

ответ

3

Я не думаю, что это противоречиво. Когда вы оцениваете время с использованием HH, он будет игнорировать бит aa, так как он оценивает ввод как 24-часовой период, а бит aa не имеет смысла. Однако, когда вы запустите его с hh, он будет читать 05:30:15 PM как «половину пяти часов дня», и его запись будет давать 2014-12-01 17:30:15. Чтение 05:30:15 PM в качестве 24-часового времени прочитает его как «половину пяти утра», выбросив PM.

Имея оба формата с hh, вы оба читаете и записываете в 12-часовом формате. Для того, чтобы иметь смысл, вам нужно будет добавить бит aa в выходной формат.

Я надеюсь, что ответ на ваш вопрос таким образом, что имеет смысл :)

+0

вы хотите перевести время с 12 часов до 24 часов. Мне нужно просто дать hh до HH. –

+1

Да, это так.'hh' - это« 12-часовой формат »и« HH »-« 23-часовой формат », как описано в документации, в которой кто-то связан с комментарием (который они затем удалили): http://docs.oracle.com/javase /7/docs/api/java/text/SimpleDateFormat.html –

-1

ТЛ; Др

LocalDateTime.parse(   // Parse as a date-time lacking time zone or offset-from-UTC. 
    "12/01/2014 05:30:15 PM" , // Define a formatting pattern to match input. Case-sensitive formatting code. Use `h` lowercase for 12-hour clock, 0-12. Use uppercase `H` for 24-hour clock, 0-23. 
    DateTimeFormatter.ofPattern("MM/dd/uuuu hh:mm:ss a" , Locale.US) 
).format(      // Generate a String in specific format. Generally better to let java.time localize automatically. 
    DateTimeFormatter.ofPattern("MM/dd/uuuu hh:mm:ss a" , Locale.US) 
) 

java.time

Современный подход использует java.time классы, которые вытеснили неприятные старые классы времени.

Получить текущий момент в UTC. Класс Instant представляет собой момент на временной шкале в UTC с разрешением nanoseconds (до девяти (9) цифр десятичной дроби).

Instant instant = Instant.now() ; 

Чтобы увидеть тот же самый момент, через призму времени, на стену часов, используемых людьми определенного региона (зоны), применить ZoneId получить ZonedDateTime.

Указать proper time zone name в формате continent/region, такие как America/Montreal, Africa/Casablanca или Pacific/Auckland. Никогда не используйте аббревиатуру 3-4 буквы, такую ​​как EST или IST, так как они не настоящие часовые пояса, не стандартизированные, и даже не уникальные (!).

ZoneId z = ZoneId.of("Africa/Tunis") ; 
ZonedDateTime zdt = instant.atZone(z) ; 

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

Если вы хотите использовать другие форматы, используйте классы DateTimeFormatter или DateTimeFormatterBuilder. Вы можете указать шаблон форматирования, но проще разрешить java.time автоматически локализовать.

Для локализации, указать:

  • FormatStyle, чтобы определить, как долго или сокращенно должна быть строка.
  • Locale, чтобы определить (а) человеческий язык для перевода имени дня, названия месяца и т. Д., И (b) культурные нормы, решающие вопросы аббревиатуры, капитализации, пунктуации, разделители и т. Д.

Пример:

Locale l = Locale.FRENCH ; 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).withLocale(l); 
String output = zdt.format(f); 

MERCREDI 14 Février 2018 à 00:59:07 Heure Normale d'Europe Центральный

Или Locale.US & FormatStyle.SHORT.

2/14/18, 1:01 утра

Ваш пользовательский формат для ввода является:

String input = "12/01/2014 05:30:15 PM" ; 
DateTimeFormatter f = DateTimeFormatter.ofPattern("MM/dd/uuuu hh:mm:ss a" , Locale.US) ; 

, что входная строка отсутствует какой-либо индикатор часового пояса или offset- из-UTC. Таким образом, это не a moment, не определенный момент на шкале времени. Он представляет собой смутное представление о потенциале моментов в диапазоне около 26-27 часов. Таким образом, мы анализируем этот ввод в LocalDateTime, лишенном какой-либо концепции зоны/смещения.

LocalDateTime ldt = LocalDateTime.parse(input , f) ; 

ldt.toString(): 2014-12-01T17: 30: 15

Сформировать строку в этом формате.

String output = ldt.format(f) ; 

12/01/2014 05:30:15 PM

Как объяснено другие, коды форматирования чувствительны к регистру. Если вы хотите 24-часовое время, используйте прописные буквы H. Для 12-часового использования используйте строчные буквы h.

Отметьте, что коды форматирования: java.time близки к наследию SimpleDateFormat, но не совсем то же самое. Изучите документацию и найдите «Переполнение стека» для многих примеров.

При обмене значениями даты и времени в тексте придерживайтесь стандартных форматов ISO 8601.


О java.time

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

Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.

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

Использование JDBC driver соответствует JDBC 4.2 или более поздней версии, вы можете обменять java.time объекты непосредственно с базой данных. Нет необходимости в строках или классах java.sql. *.

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

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

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

+0

Уважаемый Даун-Избиратель: Пожалуйста, оставляйте критику, когда вы голосуете. –

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