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


175

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

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

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

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

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

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

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


답변:


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


또한보십시오


onlineconversion.com/unix_time.htm . 온라인 타임 스탬프 변환기입니다. Java 코드와이 온라인 변환으로 계산 된 값이 다릅니다. 왜?? pls는 이것을 통해 갈 수 있습니까? 감사합니다 :)
Sachin J

6
이렇게하면 시간대 정보가 느슨해집니다. Calendar 객체는 구문 분석되지 않은 시스템 기본 TimeZone을 갖습니다.
크리스티안 브라 비

더 이상 최상위 / 허용되는 답변이되어서는 안됩니다. Java 8은 이미 4 년 이상 사용되지 않았으므로 이에 대한 답변을 업데이트해야합니다 java.time. 이 Q / A는 Google에서 상당히 두드러집니다.
Scolytus

18

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, 그리고 .


14

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

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


귀하의 의견에 감사드립니다. 앞으로 Joda를 사용하는 방법을 모색 할 것입니다. 매우 유용 할 것 같습니다
Doug Molineux

@ Jon Skeet Joda는 Android에서 직렬화 해제하지 않습니다. 날짜와 시간을 절약 할 필요가 없으면 Joda는 가치가 없습니다.
Frank Zappa

@ FrankZappa : 동의하지 않습니다-Joda Time에서 모든 날짜 / 시간 계산 을 수행 할 수 있지만 직렬화 목적으로 다른 유형 (단순화를 위해 문자열 일 수도 있음)으로 변환 할 수 있습니다.
Jon Skeet

죄송합니다. 공감해야했습니다. 답변이 너무 오래되었습니다. 가장 높은 순위의 답변이되기 위해 구식입니다. java.timeBasil Bourque는 오늘 갈 길입니다.
Scolytus

2
@Scolytus :이 답변에서 10 개에 비해 상위 (및 수락 된) 답변은 332 표입니다. 더 나은 해결책이있는 7 세 이상의 답을 모두 하향 조정하면 하향 조정이 소진 될 것입니다 ... (바질의 답변이 좋고 동의한다고 생각합니다.)
Jon Skeet

10

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

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


1
솔루션은 우아해 보이지만 다음 두 가지 단점이 있습니다. 1. JavaDoc은 예상대로 동작이 보장되지 않습니다. 2. 적어도 Java 6의 경우 달력 개체가 복제되는 1353 행에 경로가 있습니다. 그런 다음! date.equals (cal.getTime ()).
niels

5

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

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

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

24 시간이 반환되지만

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

4

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


3

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


1

간단한 방법 :

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;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.