2009-09-23 2 views
16

Date 객체를 구문 분석 할 수있는 읽을 수있는 문자열 (예 : 22/10/2009 21:13:14)에 Date 객체를 저장하려고합니다.Java에서 사람이 읽고 구문 분석 할 수있는 날짜 형식

나는 많은 것을 시도해 왔으며, 파싱 및 포매팅에 DateFormater를 사용하는 것이 가장 좋았지 만 좌절감이있다. 날짜를 형식화하면 초 정보가 손실됩니다. 나는 형식을 지정하고 초를 표시하는 옵션이 있는지 찾으려고 노력했다. (심지어 Date 객체가 가질 수있는 해상도이기 때문에 밀리 세컨드 레벨이 더 좋을 것이다.)하지만 짧은 것이었다.

아이디어가 있으십니까?

답변

37

는 초, 심지어 밀리 초를 포함하는 매우 간단한 패턴 시스템을 기반으로 날짜를 포맷하고 분석 할 수 java.text.SimpleDateFormat

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss.SSS"); 
Date dt = new Date(); 
String S = sdf.format(dt); // formats to 09/23/2009 13:53:28.238 
Date dt2 = sdf.parse(S); // parses back 
+0

,'SimpleDateFormat'은 우리가이 목적을 위해 가지고있는 것입니다. 번거롭지 않게 다행스럽게도 2014 년에'java.time', 현대 자바 날짜와 시간 API,'DateTimeFormatter' 클래스로 대체되었습니다. 결코'SimpleDateFormat'을 다시 사용하지 말 것을 권한다. –

4

SimpleDateFormat를 살펴 보자.

+1

@Unihedron 링크를 업데이트했습니다. 리뷰 작성자는 이것이 링크 전용 답변이 아니라는 점에 유의하십시오. 응답은 여전히 ​​링크가 없으면 의미가 있으며, 링크 자체는 공식 문서에 대한 것입니다. –

2

약간의 주제는 아니지만, 항상 사람들에게 DateFormat과 SimpleDateFormat이 스레드로부터 안전하다는 것을 상기시켜야 할 필요성을 느끼고 있습니다. Sun의 설명서에이 내용이 명확하게 나와 있지만 사람들이 정적으로 SimpleDateFormat을 사용하는 곳에서 코드를 찾아내는 중입니다 ...

+0

그래서 모두가 Joda Time을 대신 사용해야하고 두통을 덜어 야합니다. – Nick

+0

전적으로 동의합니다. 다른 한편으로는 썬이이 클래스들을 고치기를 원한다. 그래서 만약에 다른 것이 없다면, 나는 그들에 대해 사람들에게 경고하는 또 다른 "동시성 교훈"- 세션을 통해 앉아있을 필요가 없다. (오, 아이러니 ... 방금 StackOverflow에서 똑같은 일을했습니다 .-)) –

4

다른 답변은 모두 좋습니다.

그러나 것은 의이 종류의 일을 할 때종류가 제대로 문자열 .... "YYYY/MM/DD HH : MM : SS"로 코딩하는 형식을 선택하십시오 괜찮습니다. 소프트웨어 엔지니어가 명백하고 편리한 방식으로 정렬하지 않는 날짜 형식을 선택하면 항상 놀라게됩니다.

+0

"yyyy/dd/MM"은 올바르게 정렬되지 않습니다. 2015/21/10, 2015/20/11 및 2015/22/11이 2015/20/11, 2015/21/10, 2015/22/11으로 정렬 된 것으로 간주합니다. –

+2

죄송합니다. 나는 yyyy/MM/dd를 의미합니다. 결정된. – mikera

1

ISO 8601

사용 ISO 8601 형식 :-) 좋은 카르마 그것의 생각 -

당신은 미래의 먼 지점에서 다른 개발자 고통을 많이 절약 할 수 있습니다.

  • 그것은 어떤이있는 경우는 초 두 번째의 부분을 포함하고, 유연,하지만 당신은 그들이 0
  • 그것은 표준의를하는 경우 그래서 점점 더 많은 도구 형식을 생략하고 분석 할 수 있습니다. 스토리지 또는 데이터 교환을위한 직렬화에 적합합니다.
  • 마치 2009-10-22T21:13:14처럼 보이지만, 꽤 인간이 읽을 수 있다고 말해야합니다. (중간 부분에있는 T은 처음에는 이상하게 느껴질 수도 있습니다.)
  • 문자열 제대로 정렬, another answer에서 요청 mikera로 한 년 1000에서 9999
  • 을 통해 네 자리 범위에있는 것처럼 java.time의 클래스, 현대 자바 날짜 및 시간 API뿐만 아니라, Joda Time의 사람들은 ISO 8601을 기본으로, 즉 명시적인 포맷터없이 구문 분석하고 toString 메소드에서 동일한 형식을 생성합니다.

java.time를 사용하는 겸손한 데모 :

LocalDateTime dateTime = LocalDateTime.of(2009, 10, 22, 21, 13, 14); 
String readableString = dateTime.toString(); 
System.out.println(readableString); 
LocalDateTime parsedBack = LocalDateTime.parse(readableString); 
System.out.println(parsedBack); 

이 두 개의 동일한 라인 출력 :

2009-10-22T21:13:14 
2009-10-22T21:13:14 

후자 System.out.println() 호출이 암시 toString() 한 번 더 전화를, 그래서 이것은 놀라게해서는 안됩니다. 당신이 좀 더 간단 할, 그리고 대부분의 다른 답변이 포함 자신의 DateFormat의 제작에서 절약 할 수 원하는 경우

0

, 당신은 java.time.Instant의 기본 형식을 활용할 수 있습니다 :이 답변은 2009 년에 기록 된

(new Date()).toInstant.toString();