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.