2012-11-06 3 views
26

데이터베이스에서 타임 스탬프 값을 가져 와서 달력으로 변환하고 타임 스탬프로 다시 변환하려하지만 정밀도가 떨어집니다.정밀도를 잃지 않고 java.sql.Timestamp를 java.util.Calendar로 변환

는 여기에 문제 여기

import java.sql.Timestamp; 
import java.util.Calendar; 

public class Test { 
    public static void main(String[] args) 
    { 
     Timestamp timestamp = new Timestamp(112, 10, 5, 15, 39, 11, 801000000); 
     System.out.println("BEFORE "+timestamp.toString()); 
     Calendar calendar = Calendar.getInstance(); 
     calendar.setTimeInMillis(timestamp.getTime()); 
     timestamp = new Timestamp(calendar.getTimeInMillis()); 
     System.out.println("AFTER "+timestamp.toString()); 
    } 
} 

변환

BEFORE 2012-10-18 14:30:13.362001 
AFTER 2012-10-18 14:30:13.362 

그것은 정밀도 손실의 샘플 결과가를 재현하는 코드입니다. 10 진수 값을 그대로 유지하려면 어떻게해야합니까?

+0

내 ide에서 이것을 시도했지만 같은 결과를 얻지 못했습니다. 인쇄 할 때마다 같은 결과가 나타납니다. 'Calendar calendar = Calendar.getInstance(); \t \t Timestamp timestamp = new Timestamp (새 날짜(). getTime()); \t \t System.out.println ("1 ->"+ timestamp); // \t \t Thread.currentThread(). sleep (1000); \t \t calendar.setTimeInMillis (timestamp.getTime()); \t \t timestamp = new Timestamp (calendar.getTimeInMillis()); \t \t System.out.println ("2 ->"+ 타임 스탬프); ' –

+0

더 많은 컨텍스트를 제공 할 수 있습니까? 이 타임 스탬프는 어디서 얻습니까? 어떻게 출력합니까? – axtavt

+0

예를 업데이트했는데, 잘못하기 전에 미안합니다. 내 잘못이었습니다. – William

답변

25

당신은 밀리 초의 시간을 설정하고 있지만, 물론 당신이 밀리 초보다 정밀 미세한을 잃어가는 귀하의 입력 정밀도, 마이크로입니다.

달력은 밀리 초보다 미세한 입도를 지원하지 않습니다. 해결 방법이 없습니다.

+0

그럼 해결 방법은 무엇입니까? – William

+2

@ 윌리엄 거기 없다. 편집 된 답변을 참조하십시오. – Bohemian

+0

대체 클래스도 없습니까? – William

8

java.time

자바 8에서

나중에 우리가 지금 해결책이 : 새로운 java.time 프레임 워크에 내장되어 JSR 310 정의, Joda-Time 영감의 ThreeTen-Extra 사업 확장을..

이 새 프레임 워크에는 nanosecond 해상도가 있습니다. 이제까지 나온 java.util.Date 값 인 Joda-Time 값을 처리 할 수 ​​있습니다. 둘 다 milliseconds입니다. Postgres과 같이 일부 데이터베이스에서 사용하는 microseconds을 처리하면 충분합니다. H2과 같은 일부 데이터베이스는 나노초를 사용합니다. 그래서 java.time은 모든 것을 처리 할 수 ​​있거나 적어도 모든 주류 상황을 처리 할 수 ​​있습니다. 유일한 예외는 틈새 과학 또는 엔지니어링 상황입니다. 자바 8

Image

는, 기존의 클래스는 java.time로/변환하기위한 새로운 방법을 얻었다. java.sql.TimestamptoInstantfromInstant 메쏘드를 새로 사용하십시오. Instant 클래스에는 1970 UTC의 최초 순간부터의 나노초 수가 포함됩니다 (기본적으로 클래스 doc을 참조하십시오).

Instant에서 ZonedDateTime 개체를 얻을 수 있습니다.

java.sql.Timestamp ts = myResultSet.getTimestamp(1); 
Instant instant = ts.toInstant(); 
ZoneId zoneId = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = instant.atZone(zoneId); 
관련 문제