Преобразование String в объект Calendar в Java
Я новичок в Java, обычно работаю с PHP.
Я пытаюсь преобразовать эту строку:
Пн Мар 14 16:02:37 GMT 2011
В объект Календарь, чтобы я мог легко вытащить Год и Месяц следующим образом:
String yearAndMonth = cal.get(Calendar.YEAR)+cal.get(Calendar.MONTH);
Было бы плохой идеей разобрать его вручную? Использование метода подстроки?
Любой совет поможет спасибо!
Ответы
Ответ 1
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
в соответствии с вашей средой/требованиями
См. также
Ответ 2
Хорошо, я думаю, что было бы неплохо воспроизвести код, который уже присутствует в классах, таких как SimpleDateFormat
.
С другой стороны, лично я бы предложил избегать Calendar
и Date
полностью, если можно, и используя Joda Time вместо этого, как намного лучше разработанный API даты и времени. Например, вам нужно знать, что SimpleDateFormat
не является потокобезопасным, поэтому вам нужно либо использовать потоковые локали, синхронизацию, либо новый экземпляр каждый раз, когда вы его используете. Анализаторы и форматирование Joda являются потокобезопасными.
Ответ 3
Новый календарь не должен быть создан, 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();
(Я еще не могу прокомментировать, почему я создал новый ответ)
Ответ 4
TL;DR
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]
ym: 2011-03
Живой код
Смотрите этот код работает в IdeOne.com.
Конверсия
Если у вас должен быть объект Calendar
, вы можете преобразовать его в GregorianCalendar
, используя новые методы, добавленные к старым классам.
GregorianCalendar gc = GregorianCalendar.from( zdt );
О java.time
Структура java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date
, Calendar
и SimpleDateFormat
.
Проект Joda-Time, теперь в режиме обслуживания, советует перейти на java.time.
Чтобы узнать больше, см. Учебник Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация 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
и больше.
Ответ 5
SimpleDateFormat
отлично, просто обратите внимание, что HH
отличается от HH
при работе с часами. HH
вернет 24 часа в час и hh вернет часы на 12 часов.
Например, следующее возвращается через 12 часов:
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm aa");
Пока это вернет 24-часовое время:
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
Ответ 6
Да, это была бы плохая практика, чтобы разобрать ее самостоятельно. Посмотрите SimpleDateFormat, он превратит String в Date, и вы можете установить дату в экземпляр календаря.
Ответ 7
Простой метод:
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;
}
Ответ 8
Разберите время с часовым поясом, 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
![введите описание изображения здесь]()
Если мы не установим часовой пояс в шаблоне, например yyyy-MM-dd'T'HH:mm:ss
. SimpleDateFormat
будет использовать часовой пояс, который установлен в Setting