2013-03-31 1 views
31

내가 YYYY-MM-dd'T'HH의 날짜 형식을 시도하고있다 : mm : ss.SSS 형식을 yyyy-mm-dd HH : mm : ss로 바꾸는 것이 쉽지만 쉽지는 않습니다. 2012-10-01T09 : 45 :자바 형식 YYYY-MM-dd'T'HH : mm : mm : YYYY-MM-DD HH에 ss.SSSz SS

해석되어야하는 날짜는 형태 인 00.000은 + 02 : 00
는 이제 포맷이 단순한 일자 포맷을 사용

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSz", Locale.FRANCE); 

그래도 2012-10-01T09 : 45 : 00.000UTC + 00 : 00과 비슷한 결과를 얻을 수 있습니다.

또한 "yyyy-MM-dd'T'HH : mm : ss.SSSZ"를 패턴으로 사용하고 "yyyy-MM-ddHH : mm : ss"를 사용하려고했습니다. 후자는 2012-10-01T09 : 45 : 00의 형식으로 날짜를 반환하지만 닫기는 아직 없습니다.

T away 부분 문자열링이 약간 지저분하고 아무런 이유없이 오버 헤드가 발생하는 것으로 생각하여이 날짜 형식을 지정하는 적절한 방법은 무엇입니까? 내가 2012-10-01T09 변환하고자하는 설명하기 위해

: 45 : 00.000 + 02 : 00 9시 45분 0초

건배 2012년 10월 1일에! 이 프로젝트에 Joda 시간을 사용하는 것이 가능 Gooye 경우 ​​

+0

Substringing 훨씬 빠르다 ISO 8601 자바이 될 수있는 용도에 따라 디스크립터가 시간대에 대한 지원을 추가/Date 객체들로 /로부터 변환하는보다 간단. 원본을 두 개의 하위 문자열 (고정 오프셋)으로 분리 한 다음 그 사이의 공백을 함께 연결하면됩니다. –

+0

왜 이런가요? 한 번에 100 개 이상의 날짜를 파싱 할 수 있습니다. – Gooey

+0

하드 코딩 된 오프셋과 두 개의 결합 연산이있는 두 개의 하위 문자열 연산이 두 개의 날짜 포맷터를 생성하고 실행하는 것보다 빠르다고 생각하지 않습니까? –

답변

57
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 
SimpleDateFormat output = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
Date d = sdf.parse(time); 
String formattedTime = output.format(d); 

이 작동합니다. 입력 용으로 하나, 출력용으로 두 개의 SimpleDateFormats를 사용해야하지만, 원하는 것을 제공 할 것입니다.

+0

그것은 시작시 12를 추가합니다 ... 나는 2014 년 2 월 5 일을 예상하지만 그것은 나에게 준다 122/05/2017 – VVB

6

다음이 코드는 나를 위해 작동 :

String dateStr = "2012-10-01T09:45:00.000+02:00"; 
String customFormat = "yyyy-MM-dd HH:mm:ss"; 

DateTimeFormatter dtf = ISODateTimeFormat.dateTime(); 
LocalDateTime parsedDate = dtf.parseLocalDateTime(dateStr); 

String dateWithCustomFormat = parsedDate.toString(DateTimeFormat.forPattern(customFormat)); 
System.out.println(dateWithCustomFormat); 
+2

더 많은 의존성을 추가합니다. 그것은 JDK에 존재, 크리스 Tate 대답 – Aubin

+0

난 자바 7에서 작동하지 않을 것입니다, 자바 7 이하에서 작동합니다. –

+0

@Sam, joda-time 라이브러리를 사용하기 때문에 모든 자바 버전에서 작동합니다. 프로젝트로 가져 와서 필요한 의존성을 가져옵니다. – moleksyuk

1

당신은 정말 꼭 (나는 당신이 생각하지 않는 것이) 빨리 경우 : 내가 JSON 응답에서 수신 된 날짜 문자열의 형식을 시도하고 있었다

char[] chars = sourceDate.toCharArray(); 
chars[10] = ' '; 
String targetDate = new String(chars, 0, 19); 
1

예를 들어, 2016-03-09T04 : yyyy-MM-dd에 50 : 00-0800. 그래서 여기 내가 시도한 것이고 그것은 작동했고, 포맷 된 날짜 문자열에 달력 위젯을 할당하는 것을 도왔습니다.

String DATE_FORMAT_I = "yyyy-MM-dd'T'HH:mm:ss"; 
String DATE_FORMAT_O = "yyyy-MM-dd"; 


SimpleDateFormat formatInput = new SimpleDateFormat(DATE_FORMAT_I); 
SimpleDateFormat formatOutput = new SimpleDateFormat(DATE_FORMAT_O); 

Date date = formatInput.parse(member.getString("date")); 
String dateString = formatOutput.format(date); 

이것은 효과가 있습니다. 감사. 나중에 자바 8에 내장 된 java.time 프레임 워크 :

+0

이 답변은 질문의 세부 사항을 다루지 않습니다. 그리고 그것은 [3 세 수용 응답] (http://stackoverflow.com/a/15730771/642706)의 아이디어를 복제합니다. 그래서 어떤 가치도 추가되지는 않습니다. 스택 오버플로에 참여하고 싶습니다. 그러나 귀하의 답변은 질문의 세부 사항을 설명해야하며 중복이 아니어야합니다. –

4

java.time는

우리는이 문제에 대한 새로운 기술을 가지고있다.

입력 문자열이 표준 ISO 8601 형식입니다. 이 표준은 java.time 클래스에서 날짜/시간 값의 텍스트 표현을 구문 분석/생성하기 위해 기본적으로 사용됩니다.

OffsetDateTime odt = OffsetDateTime.parse("2012-10-01T09:45:00.000+02:00"); 

귀하의 질문에 전체 초로 자르고 싶다고 나와 있습니다.

OffsetDateTime odtTruncatedToWholeSecond = odt.truncatedTo(ChronoUnit.SECONDS); 

오프셋 및 표준 시간대 정보를 생략하고 싶습니다. 사전 정의 된 포맷터 DateTimeFormatter.ISO_LOCAL_DATE_TIME이 해당됩니다.

그리고 분명히 표준 T 대신 중간에 공백을 사용하고 싶습니다. 당신은이에 대한 자신의 포맷을 정의 할 수 있지만, 난 그냥 공백으로 T을 대체 할 문자열 조작을 할 것입니다.

String output = odtTruncatedToWholeSecond.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME).replace("T" , " "); 

은 간단하게 질문에 댓글

문자열 노는 엄격하게 당신이 문자열 만 작업 및 날짜 - 시간 객체로 변환하지 않음으로써 당신의 목표를 달성 할 수 말하기, 제안한다. 하지만이 날짜 - 시간 값을 사용하여 작업 할 다른 비즈니스 로직이 있다고 가정 할 때이 Answer를 제공합니다.


소개 java.time은

java.time 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이러한 클래스는 java.util.Date, Calendar, & SimpleDateFormat과 같이 번거로운 이전 legacy 날짜 - 시간 클래스를 대체합니다.

maintenance mode에있는 Joda-Time 프로젝트는 java.time 클래스로의 마이그레이션을 권장합니다.

자세히 알아 보려면 Oracle Tutorial을 참조하십시오. 그리고 많은 예제와 설명을 위해 스택 오버플로를 검색하십시오. 사양은 JSR 310입니다.

java.time 개체를 데이터베이스와 직접 교환 할 수 있습니다. JDBC 4.2 이상을 준수하는 JDBC driver을 사용하십시오. 문자열이 필요 없으며 java.sql.* 클래스가 필요하지 않습니다.

어디에서 java.time 클래스를 얻을 수 있습니까?

  • Java SE 8, Java SE 9, 나중에
    • 내장한다.
    • 번들로 구현 된 표준 Java API의 일부입니다.
    • Java 9에는 몇 가지 사소한 기능과 수정 사항이 추가되었습니다.
  • Java SE 6 및 java.time 기능의 대부분
  • Android

ThreeTen-Extra 프로젝트는 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 가능성을 입증합니다. 여기에 Interval, YearWeek, YearQuartermore과 같은 유용한 클래스가 있습니다.

+0

(자바 8 이상에만 해당) –

+1

@Sangram 실제로 Java 8뿐만 아니라 아니요. java.time 기능의 대부분은 [ThreeTen-Backport] (http : // www. threeten.org/threetenbp/) 프로젝트에 참여하고 [ThreeTenABP] (https://github.com/JakeWharton/ThreeTenABP) 프로젝트에서 Android에 추가로 적용했습니다. –

0
String dateStr = "2016-09-17T08:14:03+00:00"; 
String s = dateStr.replace("Z", "+00:00"); 
s = s.substring(0, 22) + s.substring(23); 
Date date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse(s); 
Timestamp createdOn = new Timestamp(date.getTime()); 
mcList.setCreated_on(createdOn); 

자바 7 7

관련 문제