Joda Time 라이브러리를 사용하여 날짜 문자열을 DateTime 객체로 변환


246

다음 형식의 문자열로 날짜가 있습니다 "04/02/2011 20:27:05". Joda-Time 라이브러리를 사용하고 있으며 DateTime객체 로 변환하고 싶습니다 . 나는했다 :

DateTime dt = new DateTime("04/02/2011 20:27:05")

하지만 다음과 같은 오류가 발생합니다.

Invalid format: "04/02/2011 14:42:17" is malformed at "/02/2011 14:42:17"

위의 날짜를 DateTime객체 로 변환하는 방법은 무엇입니까?


2
사용하여 날짜 문자열을 구문 분석하는 방법을 찾고 여기에 도착 누군가를 위해 java.time자바 8 패키지를 사용하여 시도 LocalDateTime.parse하거나 Instant.parse.
— heenenee

1
참고로 Joda-Time 프로젝트는 이제 유지 관리 모드 에 있으며 팀은 java.time 클래스 로의 마이그레이션을 조언합니다 . Oracle의 Tutorial을 참조하십시오 .
— 바질 부르 키

답변:


477

사용 DateTimeFormat:

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
DateTime dt = formatter.parseDateTime(string);

2
안녕, 포맷터가 시간대를 허용하지 않을 수 있습니까? toString함수를 적용 할 때 "zz"는 "MEZ"를 반환 하지만 구문 분석 할 수 없습니다 Invalid format: "31. Januar 2013 06:38:08 MEZ" is malformed at "MEZ". 이것은 알려진 문제입니까? 어떻게 피할 수 있습니까? 문안 인사.
— Danyel

2
@Danyel :이 DateTimeFormat.forPattern ( "yyyy-MM-dd'T'HH : mm : ss.SSS'Z '") .withLocale (Locale.ROOT) .withChronology (ISOChronology.getInstanceUTC ())와 같은 시간대를 추가 할 수 있습니다. ;
— Hyque

2
잘못된 형식이 표시됩니다. "2014-11-04T17 : 41 : 52.000 + 01 : 00"형식이 다음 형식으로 "+01 : 00"에서 형식이 잘못되었습니다. private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormat.forPattern ( "yyyy-MM- dd'T'HH : mm : ss.SSS'ZZ ' "); joda-time 2.2의 DATE_TIME_FORMATTER.parseDateTime ((String) customSoftware.get (header [3]))
— Stephane

2
ZZ 주위의 작은 따옴표를 제거한 후 작동했습니다. 이 작은 따옴표가 무엇을 의미하는지 궁금합니다.
— Stephane

2
@StephaneEybert (또는 다른 사람) 작은 따옴표는 문자열에서 예상되는 문자 그대로 문자의 일부이며 패턴의 일부로 간주되지 않음을 의미합니다. 예를 들어, 어떤 이유로 날짜가 "2015-08-dd30"으로 표시되면 "yyyy-MM-'dd'dd"를 지정하여 첫 번째 dd가 문자열에서 예상되는 문자 부분임을 나타냅니다. 두 번째 dd (아포스트로피 외부)는 구문 분석해야하는 실제 날짜입니다. 따라서 이전의 경우 실제 시간대 대신 수신 날짜 시간 문자열의 끝에 "ZZ"를 넣은 경우 작동했을 것입니다.
— SadBunny

62

나는 이것이 오래된 질문이라는 것을 알고 있지만 JodaTime 2.0부터 하나의 라이너 로이 작업을 수행 할 수 있다고 덧붙이고 싶습니다.

DateTime date = DateTime.parse("04/02/2011 20:27:05", 
                  DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss"));

3
수입 섹션에 무엇을 넣어야합니까?
— Dmitry

20
DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss").parseDateTime("04/02/2011 20:27:05");

7
다음과 같아야합니다. DateTimeFormat.forPattern ( "dd / MM / yyyy HH : mm : ss"). parseDateTime ( "04/02/2011 20:27:05")
— sufinawaz

16

의견에서 나는 TimeZone을 추가하고 같은 답변을 선택했습니다.

String dateTime = "2015-07-18T13:32:56.971-0400";

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZZ")
        .withLocale(Locale.ROOT)
        .withChronology(ISOChronology.getInstanceUTC());

DateTime dt = formatter.parseDateTime(dateTime);

13

형식이 예상 ISO 형식이 아닙니다. 시도해야합니다

DateTimeFormatter format = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
DateTime time = format.parseDateTime("04/02/2011 20:27:05");

5

다음 과 같이 SimpleDateFormat 을 사용할 수도 있습니다 .DateTimeFormat

Date startDate = null;
Date endDate = null;
try {
    if (validDateStart!= null) startDate = new SimpleDateFormat("MM/dd/yyyy HH:mm", Locale.ENGLISH).parse(validDateStart + " " + validDateStartTime);
    if (validDateEnd!= null) endDate = new SimpleDateFormat("MM/dd/yyyy HH:mm", Locale.ENGLISH).parse(validDateEnd + " " + validDateEndTime);
} catch (ParseException e) {
    e.printStackTrace();
}

3
kirlisakal은이 경우에 스레드가 안전하지 않으므로 SimpleDateFormat의 공유 인스턴스를 만들지 마십시오. 그렇게하면 디버그하는 것은 악몽입니다.
— dannrob

2
참고로, 같은 귀찮은 된 날짜 - 시간 수업 java.util.Date, java.util.Calendar그리고 java.text.SimpleDateFormat지금 기존 에 의해 대체, java.time의 자바 8 자바 9 페이지에 내장 된 클래스 오라클 튜토리얼 . 그리고 java.time 클래스는 레거시 클래스와 달리 스레드로부터 안전합니다.
— 바질 부르 키

3

사용중인 형식에 적합한 DateTimeFormatter 가 필요합니다 . 문서를 작성하는 방법에 대한 지침은 문서를 살펴보십시오.

팔목에서 나는 네가 필요한 것 같아 format = DateTimeFormat.forPattern("M/d/y H:m:s")


3

tl; dr

java.time.LocalDateTime.parse( 
    "04/02/2011 20:27:05" , 
    DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss" )
)

java.time

현대적인 접근 방식은 훌륭한 Joda-Time 을 대체하는 java.time 클래스를 사용합니다. 프로젝트 .

LocalDateTime입력에 시간대 또는 UTC로부터의 오프셋 표시가 없기 때문에 로 구문 분석 하십시오.

String input = "04/02/2011 20:27:05" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss" ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;

ldt.toString () : 2011-02-04T20 : 27 : 05

팁 : 가능 하면 날짜-시간 값을 여기에 표시된 형식이 아닌 텍스트로 교환 할 때 표준 ISO 8601 형식을 사용 하십시오. 편리하게 java.time 클래스는 문자열을 구문 분석 / 생성 할 때 표준 형식을 사용합니다.


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


2

간단한 방법 :

public static DateTime transfStringToDateTime(String dateParam, Session session) throws NotesException {
    DateTime dateRetour;
    dateRetour = session.createDateTime(dateParam);                 

    return dateRetour;
}

0

거기 두 가지 방법 이 될 수 달성은 .

DateTimeFormat

DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss").parseDateTime("04/02/2011 20:27:05");

SimpleDateFormat

        String dateValue = "04/02/2011 20:27:05";
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); //  04/02/2011 20:27:05

        Date date = sdf.parse(dateValue); // returns date object
        System.out.println(date); // outputs: Fri Feb 04 20:27:05 IST 2011

둘 다 구식입니다. 현대적인 방법도 있습니다. 그것은 년의 바질 우르 큐에 의해 대답 . 또한 아직 다른 답변에 포함되지 않은 내용은 제공하지 않습니다. 그리고 Joda-Time이 요구 될 때, 더 오래되고 악명 높은 문제 SimpleDateFormat는 내 정직한 의견으로 는 나쁘다 는 것을 암시합니다 .
— Ole VV
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.