Преобразовать строку в объект календаря в Java - PullRequest
153 голосов
/ 14 марта 2011

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

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

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

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

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

Было бы плохой идеей проанализировать его вручную?Использование метода подстроки?

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

Ответы [ 8 ]

362 голосов
/ 14 марта 2011
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 в соответствии с вашей средой / требованием


См. Также

14 голосов
/ 14 марта 2011

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

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

13 голосов
/ 02 ноября 2016

ТЛ; др

Современный подход использует классы 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

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

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

Определите пользовательский форматер, соответствующий вашему вводу строки.

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

Разобрать как ZonedDateTime.

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

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

YearMonth ym = YearMonth.from( zdt );

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

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

Но метод toString генерирует строку в стандартном формате 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();

Дамп на консоль.

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

ввод: пн 14 марта 16:02:37 GMT 2011

zdt: 2011-03-14T16: 02: 37Z [GMT]

гм: 2011-03

Живой код

См. этот код работает в IdeOne.com .

Преобразование

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

GregorianCalendar gc = GregorianCalendar.from( zdt );

О java.time

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

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на java.time.

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

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

  • Java SE 8 и SE 9 и более поздние
    • Встроенный.
    • Часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport .
  • Android

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

9 голосов
/ 18 ноября 2015

Нет необходимости создавать новый календарь, SimpleDateFormat уже использует календарь внизу.

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();

(я пока не могу комментировать, поэтому я создал новый ответ)

5 голосов
/ 25 июня 2013

SimpleDateFormat отлично, просто обратите внимание, что HH отличается от hh при работе с часами. HH вернет 24-часовые часы, а чч вернет 12-часовые часы.

Например, следующий код вернется через 12 часов:

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

Хотя это вернется через 24 часа:

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
3 голосов
/ 14 марта 2011

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

1 голос
/ 25 октября 2017

Разобрать время с часовым поясом, Z в шаблоне для часового пояса

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();
}

Вывод: будет возвращено время UTC

1508899140000

enter image description here

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

0 голосов
/ 01 ноября 2016

Простой метод:

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;
}
...