2017-12-26 20 views
1

1413225446.92000과 같은 기원을 java에서 ZonedDateTime으로 변환하는 방법?자바에서 ZonedDateTime으로 에포크를 변환하는 방법

주어진 코드는 길이가 값이므로 예상 한 값은 NumberFormatException입니다.

ZonedDateTime.ofInstant(Instant.ofEpochMilli(Long.parseLong(dateInMillis)), ZoneId.of(TIME_ZONE_PST)); 
+0

PST 시간대? 세 가지 (및 네 개의) 문자 시간대 약어를주의하십시오. 모호하고 종종 실제 시간대가 아닙니다. 필리핀 표준시, 태평양 표준시 또는 핏 케언 표준시? 대신 미국/밴쿠버와 같은 시간대를 지정하십시오. 즉, * 지역/도시 *입니다. –

+0

나는 @Ole에 동의한다. 내 코드에서 TIME_ZONE_PST는 America/Los_Angeles를 가리 킵니다 –

+0

Surendran Sajan이 좋습니다. 나는 로스 앤젤레스가 태평양 표준시가 아니라 태평양 표준시에 있기 때문에 이름 바꾸기를 제안합니다. –

답변

1

분할 64 비트 정수 (Long)의 한 쌍으로 수 : UTC

  • 나노초의 번호를 1970의 첫 순간의 신기원 참조 날짜 이후 전체 초

    • 번호 소수 둘째

    은 팩토리 메소드 Instant.ofEpochSecond​(long epochSecond, long nanoAdjustment)

    에 그 숫자 전달

    Instant을 준비하고있는 경우 시간대를 지정하여 ZonedDateTime이되도록하십시오.

    ZoneId z = ZoneId.of("America/Los_Angeles") ; 
    ZonedDateTime zdt = instant.atZone(z) ; 
    
  • +0

    감사합니다. @Basil Bourque. 이 작업을 –

    0

    Basil Bourque’s answer이 좋습니다. 분수 부분에서 나노초를 정수로 변환하는 것은 함정 또는 2를 수반 할 수 있습니다. 내가 제안 :

    String dateInMillis = "1413225446.92000"; 
        String[] secondsAndFraction = dateInMillis.split("\\."); 
        int nanos = 0; 
        if (secondsAndFraction.length > 1) { // there’s a fractional part 
         // extend fractional part to 9 digits to obtain nanoseconds 
         String nanosecondsString 
           = (secondsAndFraction[1] + "000000000").substring(0, 9); 
         nanos = Integer.parseInt(nanosecondsString); 
         // if the double number was negative, the nanos must be too 
         if (dateInMillis.startsWith("-")) { 
          nanos = -nanos; 
         } 
        } 
        ZonedDateTime zdt = Instant 
          .ofEpochSecond(Long.parseLong(secondsAndFraction[0]), nanos) 
          .atZone(ZoneId.of("Asia/Manila")); 
        System.out.println(zdt); 
    

    2014-10-14T02:37:26.920+08:00[Asia/Manila] 
    

    우리는 나노초 64 비트가 필요하지 않습니다를 인쇄, 그래서 난 그냥 int을 사용하고 있습니다.

    에포크 시간이 과학 표기법 (1.41322544692E9)으로 제공되는 경우 위의 사항은 작동하지 않습니다. 아시아/마닐라로 발생하지 않은 경우

    는 예를 들어 미국/밴쿠버, 미국/로스 엔젤레스 또는 태평양/핏 케언를 들어, 지역/도시 형식으로 원하는 시간대를 대체하십시오. PST와 같은 세 문자 약어를 사용하지 마십시오. 모호하고 종종 실제 시간대가 아닙니다.

    +0

    고마워요 @Ole V.V. –

    +0

    nanos에는 64 비트 long 코드를 사용할 수도 있습니다. 'Instant.ofEpochSecond'의 인수는 그대로 전달됩니다. –