2017-02-23 4 views
2

자바 8 날짜/시간 프레임 워크가 어떻게 작동하는지 이해하려고합니다.SimpleDateFormat to java.time

new SimpleDateFormat("yyyyMMddHHmmssSSS").parse(builder.toString()).getTime(); 

가 자바 8의 새로운 클래스로 무엇을 될 것입니다 :
나는 실제로 문자열을 주어진 밀리 초를 반환하는이 방법하여 SimpleDateFormat을 사용하고 있습니다?

+1

원하는 형식이 표준 [ISO 8601] (https://en.wikipedia.org/wiki/ISO_8601) 형식에 가깝습니다. 나 자신의 발명보다는 표준 포맷을 고집하는 것이 좋습니다. 표준은 모호함을 피하기 위해 현명하게 설계되었습니다. 그리고 이것들은 기본적으로 java.time 클래스에서 문자열 파싱/생성을 위해 사용됩니다. 형식이 "기본"버전에 가깝기 때문에 구분 기호 사용이 최소화됩니다. (a) 년 - 월 - 일과시 - 분 - 초 부분 사이에 'T'를 삽입하고, (b) 분수 초 앞에 쉼표 (바람직하게) 또는 완전 정지 (마침표)를 삽입하십시오 . –

답변

2

패턴 자바-8에서 작동하지 않을 수 있습니다. 문제는 겉으로보기에는 백 포트가없는 fixed in Java-9이지만 Java-9는 아직 릴리스되지 않았습니다. 자바-8에 대한

가능한 해결 방법 중 하나는 어색 문자열 전처리, 즉 분수 부분 전에 소수 구분 기호를 삽입하거나 파서 아마 자바-9에있어서보다 여전히 빠른 곳 (다른 제 3 자-라이브러리를 다운로드 포함) 내 관측 :

문자열 전처리

String mydate = "20130812214600025"; 
String adjustedInput = new StringBuilder(mydate).insert(14, '.').toString(); 
ZonedDateTime date = 
    ZonedDateTime.parse(
     adjustedInput, 
     DateTimeFormatter.ofPattern("yyyyMMddHHmmss.SSS").withZone(ZoneOffset.systemDefault())); 
System.out.println(date); // 2013-08-12T21:46:00.025+02:00[Europe/Berlin] 
System.out.println(date.toInstant().toEpochMilli()); // 1376336760025 

Joda 타임 :

,
String mydate = "20130812214600025"; 
DateTime date = 
    DateTime.parse(
     mydate, 
     DateTimeFormat.forPattern("yyyyMMddHHmmssSSS")); 
System.out.println(date); // 2013-08-12T21:46:00.025+02:00 
System.out.println(date.toInstant().getMillis()); // 1376336760025 

내 라이브러리 Time4J

당신의 내용
long millisSinceUnix = 
    ChronoFormatter.ofPattern(
     "yyyyMMddHHmmssSSS", 
     PatternType.CLDR, 
     Locale.ROOT, 
     Moment.axis(TemporalType.MILLIS_SINCE_UNIX) 
    ).with(Timezone.ofSystem()).parse(mydate).longValue(); 
System.out.println(millisSinceUnix); // 1376336760025 

: 시간대는 우리가 글로벌 순간에 년, 월, 일, 시간 등과 같은 지역 정보를 변환하기 때문에 필요한 있지만 귀하의 입력은 포함되지 않습니다 모든 존 또는 오프셋 정보. 따라서 포맷터에 영역 또는 오프셋을 제공해야합니다.

보시다시피, SimpleDateFormat과 Joda-Time은 시스템 시간대를 기본적으로 (암시 적으로) 사용합니다. 그러나 java.time -API 및 Time4J는 명시 적으로 시간대를 지정해야합니다 (더 선명한 디자인이 아닌 경우).

1

당신은 사용할 수 있습니다 : 지정한

ZonedDateTime date = ZonedDateTime.parse("mydate",DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS")); 
System.out.println(date.toInstant().toEpochMilli()); 
+1

줘이 : 텍스트 '20140920111703000'을 (를) 인덱스 0에서 파싱 할 수 없습니다. – LppEdd