[java] Java에서 문자열을 달력 객체로 변환

저는 Java를 처음 사용하는데 보통 PHP로 작업합니다.

이 문자열을 변환하려고합니다.

월요일 3 월 14 일 16:02:37 GMT 2011

다음과 같이 Year와 Month를 쉽게 가져올 수 있도록 Calendar 객체로

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

수동으로 구문 분석하는 것이 좋지 않습니까? 부분 문자열 방법을 사용하십니까?

어떤 조언이라도 감사 할 것입니다!



답변

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환경 / 요구 사항에 따라 설정


또한보십시오


답변

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

레거시 날짜-시간 수업 피하기

현대적인 방법은 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 );

입력 : 월요일 3 월 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의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 까다로운 기존에 대신 기존 과 같은 날짜 – 시간의 수업을 java.util.Date, Calendar, SimpleDateFormat.

Joda 타임 프로젝트는 현재의 유지 관리 모드 , java.time로 마이그레이션을 조언한다.

자세한 내용은 Oracle Tutorial을 참조하십시오 . 많은 예제와 설명을 보려면 스택 오버플로를 검색하십시오. 사양은 JSR 310 입니다.

java.time 클래스는 어디서 구할 수 있습니까?

ThreeTen – 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 입증 된 근거입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval, YearWeek, YearQuarter, 그리고 .


답변

글쎄, 나는 이미 클래스에 존재하는 코드를 복제하는 것은 나쁜 생각이라고 생각한다 SimpleDateFormat.

반면에, 개인적으로는 피하는 게 좋을 것 Calendar하고 Date완전히 당신이 할 수있는 경우와 사용 Joda 시간을 훨씬 더 나은 설계 날짜와 시간 API로 대신. 예를 들어, 당신은 알 필요가 SimpleDateFormat있다 없다 , 스레드 안전 당신 때문에 하나 필요 스레드 – 지역 주민, 동기화, 또는 새로운 인스턴스 당신이 그것을 사용할 때마다. Joda 파서 및 포맷터 스레드로부터 안전합니다.


답변

새 캘린더를 만들 필요가 없으며 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();

(아직 댓글을 달 수 없기 때문에 새로운 답변을 만들었습니다)


답변

SimpleDateFormat큰 단지 참고 인 HH다른 hh시간과 작업 할 때입니다. HH24 시간 기준 시간을 반환하고 hh는 12 시간 기준 시간을 반환합니다.

예를 들어 다음은 12 시간을 반환합니다.

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

24 시간이 반환되지만

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


답변

시간대를 기준 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


답변

그렇습니다. 직접 파싱하는 것은 좋지 않습니다. SimpleDateFormat을 살펴보면 String이 Date로 바뀌고 Date를 Calendar 인스턴스로 설정할 수 있습니다.