2017-10-25 13 views
3

아래의 함수를 사용하여 마이크로 초 형식 시간 문자열을 ZoneDateTime으로 변환하므로 나중에 비교할 수 있습니다.다른 시간 문자열에 대해 동일한 ZonedDateTime 수신

public static ZonedDateTime createTimeFromString(String inputTime) { 
    ZonedDateTime time; 
    try { 

     System.out.printf("Input time %s%n", inputTime); 
     DateTimeFormatter formatter = 
       DateTimeFormatter.ofPattern("yyyyMMdd-HH:mm:ss.SSSSSS"); 
     LocalDate date = LocalDate.parse(inputTime, formatter); 
     time = date.atStartOfDay(ZoneId.systemDefault()); 

     System.out.printf("Formated time %s%n", time); 
     return time; 
    } 
    catch (DateTimeParseException exc) { 
     System.out.printf("%s is not parsable!%n", inputTime); 
     throw exc;  // Rethrow the exception. 
    } 
} 

그러나 함수에 전달되는 모든 시간 문자열은 동일한 출력을 얻습니다.

예 : 난 당신이 내가 잘못 뭘하는지 명확히 주시겠습니까

자바 (8)을 사용하고

Input time 20171025-10:58:24.062151 
Formated time 2017-10-25T00:00+05:30[Asia/Colombo] 

Input time 20171025-10:58:25.446862 
Formated time 2017-10-25T00:00+05:30[Asia/Colombo] 

?

답변

3

LocalDate.parse으로 전화하면 날짜 부분 (일, 월 및 연도)이되고 나머지는 폐기됩니다. LocalDate에는 시간 필드 (시, 분, 초 및 초 단위)가 없으므로 단순히 삭제되고 손실됩니다.

atStartOfDay(ZoneId.systemDefault())을 호출하면 자정 인이 JVM 기본 시간대로 설정됩니다.

모든 항목 (날짜 및 시간)을 유지하려면 모든 날짜 및 시간 필드가 포함 된 클래스 인 LocalDateTime으로 구문 분석하십시오. 그런 다음 당신은 ZonedDateTime로 변환하는 atZone 메소드를 호출

String inputTime = "20171025-10:58:24.062151"; 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd-HH:mm:ss.SSSSSS"); 
// parse to a LocalDateTime (keeping all date and time fields) 
LocalDateTime date = LocalDateTime.parse(inputTime, formatter); 
// convert to ZonedDateTime 
ZonedDateTime z = date.atZone(ZoneId.systemDefault()); 

PS :ZoneId.systemDefault() 반환 JVM의 기본 시간대하지만 항상 명시 적으로 만들기 위해 더 나은 그래서,이 can be changed without notice, even at runtime 것을 명심 어느 쪽을 사용하고 있는지.

IANA timezones names (항상 Region/City의 형식, 예 : Asia/Colombo 또는 Europe/Berlin)을 사용합니다. ambiguous and not standard이기 때문에 3 글자 약어 (예 : IST 또는 CET)를 사용하지 마십시오.

ZoneId.getAvailableZoneIds()을 호출하여 사용 가능한 시간대 목록을 가져올 수 있습니다 (그리고 가장 잘 맞는 시스템을 선택하십시오). 그런 다음 다음과 같이 영역 이름을 사용하여 ZoneId.of() 메소드를 호출합니다.

// using specific timezone instead of JVM's default 
ZonedDateTime z = date.atZone(ZoneId.of("Asia/Colombo"));