Преобразование строки в объект календаря в Java

Я новичок в Java, обычно работаю с PHP.

Я 9X_datetime пытаюсь преобразовать эту строку:

Пн, 14 9X_calender марта, 16:02:37 GMT 2011

В объект календаря, чтобы 9X_datetime я мог легко вытащить год и месяц следующим 9X_datetime-manipulation образом:

String yearAndMonth = cal.get(Calendar.YEAR)+cal.get(Calendar.MONTH); 

Не стоит ли разбирать его вручную? Используете 9X_java метод подстроки?

Любой совет поможет, спасибо!

203
0
8
Общее количество ответов: 8

Ответ #1

Ответ на вопрос: Преобразование строки в объект календаря в Java

Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH); cal.setTime(sdf.parse("Mon Mar 14 16:02:37 GMT 2011"));// all done 
примечание: установите Locale в соответствии с 9X_datetime-functions вашей средой / требованиями


См. также
  • Javadoc

              
449
1

  • Обратите внимание, что при этом теряется информация о часовом поясе. Объект Calendar будет им ...

Ответ #2

Ответ на вопрос: Преобразование строки в объект календаря в Java

tl; dr

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

YearMonth.from( ZonedDateTime.parse( "Mon Mar 14 16:02:37 GMT 2011" , DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" ) ) ).toString() 

2011-03

Избегайте устаревших классов даты и времени

Современный 9X_jre подход - это классы java.time. Старые классы 9X_java даты и времени, такие как Calendar, оказались плохо 9X_date-of-birth спроектированными, запутанными и неудобными.

Определите 9X_date-of-birth настраиваемое средство форматирования в 9X_datetime-manipulation соответствии с вводимой вами строкой.

String input = "Mon Mar 14 16:02:37 GMT 2011"; DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" ); 

Анализировать 9X_datetime-manipulation как ZonedDateTime.

ZonedDateTime zdt = ZonedDateTime.parse( input , f ); 

Вас интересуют год и месяц. Для этой 9X_date цели классы java.time включают в себя класс 9X_datetime-operation YearMonth.

YearMonth ym = YearMonth.from( zdt ); 

При необходимости вы можете запросить номер 9X_calendar года и месяца.

int year = ym.getYear(); int month = ym.getMonthValue(); 

Но метод toString генерирует строку 9X_jdk в стандартном формате ISO 8601.

String output = ym.toString(); 

Собери все вместе.

String input = "Mon Mar 14 16:02:37 GMT 2011"; DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" ); ZonedDateTime zdt = ZonedDateTime.parse( input , f ); YearMonth ym = YearMonth.from( zdt ); int year = ym.getYear(); int month = ym.getMonthValue(); 

Выгрузить 9X_datetime-manipulation в консоль

System.out.println( "input: " + input ); System.out.println( "zdt: " + zdt ); System.out.println( "ym: " + ym ); 

ввод: 14 марта, понедельник, 16:02:37 9X_java-date по Гринвичу, 2011 г.

zdt: 2011-03-14T16: 02: 37Z 9X_date-of-birth [GMT]

гм: 2011-03

Живой код

См. this code running in IdeOne.com.

Конверсия

Если у вас должен быть объект 9X_jre Calendar, вы можете преобразовать его в GregorianCalendar, используя 9X_datetime-operation новые методы, добавленные к старым классам.

GregorianCalendar gc = GregorianCalendar.from( zdt ); 

О java.time

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

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

Проект Joda-Time, который 9X_java-date теперь находится в maintenance mode, рекомендует перейти 9X_java-date на классы java.time.

Вы можете обмениваться объектами 9X_simpledateformat java.time непосредственно с вашей базой данных. Используйте 9X_calendar JDBC driver, совместимый с JDBC 4.2 или более поздней версии. Нет 9X_java-date необходимости в строках, нет необходимости 9X_datetime-operation в классах java.sql.*. Hibernate 5 и JPA 2.2 поддерживают 9X_dates java.time.

Где взять классы java.time?

  • Java SE 8, Java SE 9, Java SE 10, Java SE 11 и более поздние версии - часть стандартного API Java со встроенной реализацией.
    • В Java 9 внесены некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функций java.time перенесена на Java 6 и 7 в ThreeTen-Backport.
  • Android
    • Более поздние версии Android (26+) объединяют реализации классов java.time.
    • Для более ранних версий Android (<26) процесс API desugaring обеспечивает функциональность subset of the java.time, изначально не встроенную в Android.
      • Если обессахаривание не дает того, что вам нужно, проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше) к Android. См. How to use ThreeTenABP….
26
0

Ответ #3

Ответ на вопрос: Преобразование строки в объект календаря в Java

Что ж, я думаю, было бы плохой идеей копировать 9X_jdk код, который уже присутствует в таких классах, как 9X_openjdk SimpleDateFormat.

С другой стороны, лично я бы посоветовал 9X_openjdk полностью избегать Calendar и Date, если можете, и вместо 9X_datetime-manipulation этого использовать Joda Time в качестве гораздо лучше 9X_java разработанного API даты и времени. Например, вам 9X_calender нужно знать, что SimpleDateFormat не потокобезопасен, поэтому 9X_openjdk вам нужны локальные переменные потока, синхронизация 9X_simpledateformat или новый экземпляр каждый раз, когда вы 9X_datetime-operation его используете. Синтаксические анализаторы 9X_datetime и средства форматирования Joda потокобезопасны.

14
1

  • @Scolytus: Самый верхний (и принятый) ответ набрал 332 голоса по сравнению с 10 за этот. Я думаю, что если вы будете отклонять каждый ответ 7 + -летней давности, у которого теперь есть лучшее решение, у ...

Ответ #4

Ответ на вопрос: Преобразование строки в объект календаря в Java

Создавать новый календарь не нужно, SimpleDateFormat 9X_datetime уже использует календарь под ним.

SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.EN_US); Date date = sdf.parse("Mon Mar 14 16:02:37 GMT 2011"));// all done Calendar cal = sdf.getCalendar(); 

(пока не 9X_datetime-operation могу комментировать, поэтому создал новый 9X_java-date ответ)

10
1

  • Ваше решение выглядит элегантно, но имеет два недостатка: 1. JavaDoc не гар ...

Ответ #5

Ответ на вопрос: Преобразование строки в объект календаря в Java

SimpleDateFormat великолепен, просто обратите внимание, что 9X_date-of-birth HH отличается от hh при работе с часами. HH вернет 9X_jdk 24 часа, а hh - 12 часов.

Например, следующее 9X_java-date будет возвращать 12-часовое время:

SimpleDateFormat sdf = new SimpleDateFormat("hh:mm aa"); 

Пока это 9X_date-of-birth вернет 24-часовое время:

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); 

6
0

Ответ #6

Ответ на вопрос: Преобразование строки в объект календаря в Java

Анализировать время с часовым поясом, Z в 9X_java-date шаблоне соответствует часовому поясу

String aTime = "2017-10-25T11:39:00+09:00"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.getDefault()); try { Calendar cal = Calendar.getInstance(); cal.setTime(sdf.parse(aTime)); Log.i(TAG, "time = " + cal.getTimeInMillis()); } catch (ParseException e) { e.printStackTrace(); } 

Вывод: он 9X_openjdk вернет время в формате UTC

1508899140000 

9X_Преобразование строки в объект календаря в Java_simpledateformat

Если мы не установим 9X_java-date часовой пояс в шаблоне, например yyyy-MM-dd'T'HH:mm:ss. SimpleDateFormat будет 9X_datetime-functions использовать часовой пояс, установленный 9X_dates в Setting

5
0

Ответ #7

Ответ на вопрос: Преобразование строки в объект календаря в Java

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

3
0

Ответ #8

Ответ на вопрос: Преобразование строки в объект календаря в Java

Простой способ:

public Calendar stringToCalendar(String date, String pattern) throws ParseException { String DEFAULT_LOCALE_NAME = "pt"; String DEFAULT_COUNTRY = "BR"; Locale DEFAULT_LOCALE = new Locale(DEFAULT_LOCALE_NAME, DEFAULT_COUNTRY); SimpleDateFormat format = new SimpleDateFormat(pattern, LocaleUtils.DEFAULT_LOCALE); Date d = format.parse(date); Calendar c = getCalendar(); c.setTime(d); return c; } 

9X_simpledateformat

1
0