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



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



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




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




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



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


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



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

733   8  

8 ответов:

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

Примечание: set Locale согласно вашим окружающей среде / требованию


См. Также

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

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

Не нужно создавать новый календарь, 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();

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

tl; dr

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

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

определение пользовательского форматирования, чтобы соответствовать вашей строке ввода.

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

разбор как a ZonedDateTime.

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

вас интересует год и месяц. Ява.занятия включают в себя 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 );

о Ява.время

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

The Joda-Time, теперь режим обслуживания, советует миграцию на java.время.

дополнительные сведения см. В разделе элемент Oracle Tutorial. Поиск переполнения стека для многих примеров и объяснений. Спецификация является JSR 310.

где получить java.время занятий?

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

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

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

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

в то время как это вернется 24 часа времени:

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

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

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

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

разбирать время с часовым поясом,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

Comments

    Ничего не найдено.