문제

저는 웹 서비스를 사용하여 XMLGregorianCalendar 유형의 타임스탬프 값을 반환하는 레코드를 삽입하고 있습니다.java.sql.Timestamp 값으로 변환해야 해서 이런 함수를 사용합니다.

public static java.sql.Timestamp getSqlTimeStamp(XMLGregorianCalendar xgc) {
    if (xgc == null) {
        return null;
    } else {
        return new Timestamp(xgc.toGregorianCalendar().getTime().getTime());
    }
}
Timestamp timestamp=getSqlTimeStamp(ExitInXMLGregor.getTimestamp());

내 문제는 서버에서 레코드를 삽입할 때 타임스탬프 값이 다음과 같다는 것입니다.10/03/2012 19:23:22

그러나 유형 변환을 수행하면 다음과 같은 타임스탬프 값을 얻습니다.10/03/2012 17:23:22

웹 서비스가 있는 서버의 시간은 내 로케일보다 2시간 더 길며 어떤 이유로 변환 후 삽입 로케일 시간을 얻습니다.문제는 서버 시간을 꼭 얻어야 한다는 것입니다. DB에서 타임스탬프 값이 서버 값과 일치하고 타임스탬프 값이 다르기 때문에 업데이트 작업에 문제가 있기 때문입니다.

어떤 종류의 도움이라도 주시면 감사하겠습니다.감사해요!

편집하다:해결책을 찾았지만 꼭 필요한 것은 아닙니다.java.sql.Timestamp 형식의 타임스탬프를 XMLGregorian으로 변환할 때 서버의 timeZone을 설정합니다(setTimeZone(TimeZone.getTimeZone("GMT+02:00"))).이것은 실제로 작동하지만 이상적인 솔루션과는 거리가 멀습니다. (시간대나 서버가 변경될 수도 있습니다.) 이 시점에서 서버의 timeZone을 동적으로 알면 좋을 것 같지만 어떻게 해야 할지 모르겠습니다. .

public static XMLGregorianCalendar getXMLGregorianCalendar(Timestamp timestamp)
        throws BaseException {
    try {
        GregorianCalendar gc = new GregorianCalendar();
        gc.setTimeZone(TimeZone.getTimeZone("GMT+02:00"));
        gc.setTimeInMillis(timestamp.getTime());
        return DatatypeFactory.newInstance().newXMLGregorianCalendar(gc);
    } catch (DatatypeConfigurationException ex) {
        throw new BaseException(ex);
    }
}
도움이 되었습니까?

해결책

타임 스탬프가 올바른 시간을 지정하고 적절한 시간대로 표시되지 않습니다. 2012-10-03T17 : 23 : 22.342는 2012-10-03T19 : 23 : 22.342 + 02 : 00과 동일합니다. 이전의 (숨겨진) 시간대가 +00 : 00입니다.

다른 팁

tl;dr

  • 두 문자열 모두 동일한 순간을 나타내며 단순히 시간대에 맞게 조정되었지만 시간을 기록하지 못했습니다. UTC로부터의 오프셋.
  • 이러한 문자열에 항상 오프셋 및 영역 정보를 포함하여 이러한 혼란을 피하십시오.
  • 현대적인 사용 java.time 번거로운 레거시 클래스를 대체하는 클래스입니다.(Instant, 아니다 Timestamp)

예제 코드.

myPreparedStatement.setObject( 
    … , 
    myXMLGregorianCalendar  // If forced to work with a `javax.xml.datatype.XMLGregorianCalendar` object rather than a modern java.time class…
    .toGregorianCalendar()  // …convert to a `java.util.GregorianCalendar`, and then…
    .toZonedDateTime()      // …convert to modern `java.time.ZonedDateTime` class.
    .toInstant()            // Adjust to UTC by extracting an `Instant` object.
)

JDBC 4.2 이상부터 데이터베이스에서 검색합니다.

Instant instant = myResultSet.getObject( … , Instant.class ) ;

java.time

다음과 같이 Robert Tupelo-Schneck의 올바른 답변 즉, 두 문자열이 모두 동일한 순간을 나타내지만 UTC와의 오프셋이 다른 다른 시간대로 조정된다는 점에서 모든 것이 잘 된 것 같습니다.문제는 두 문자열 중 하나에 UTC로부터의 오프셋 표시가 없다는 것입니다.

이러한 생략은 혼란을 야기하므로 나쁜 습관입니다.컨텍스트가 오프셋/구역을 명확하게 만드는 것이 절대적으로 확실하지 않은 한 항상 UTC로부터의 오프셋을 포함합니다.

UTC로 작업

UTC로 작업하면 이러한 혼란을 피할 수 있습니다.일반적으로 날짜-시간 값을 UTC로 작업, 저장 및 교환하는 것이 가장 좋습니다.사용자에게 표시하거나 비즈니스 논리에 필요한 경우에만 UTC에서 시간대로 조정합니다.

또한 현재는 java.time 클래스.변환하세요 XMLGregorianCalendar 에게 java.time.ZonedDateTime.

ZonedDateTime zdt = myXMLGregorianCalendar.toGregorianCalendar().toZonedDateTime() ;

추출하여 UTC로 조정합니다. Instant 물체.

Instant instant = zdt.toInstant() ;

JDBC 4.2 이상부터는 직접 교환이 가능합니다. java.time 데이터베이스와 개체.레거시를 사용할 필요가 없습니다. java.sql.Timestamp 다시 수업.

myPreparedStatement.setObject( … , instant ) ;

검색:

Instant instant = myResultSet.getObject( … , Instant.class ) ;

특정 지역의 사람들이 사용하는 벽시계 시간을 사용하여 동일한 순간을 보려면 UTC에서 특정 시간대로 조정하십시오.

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

전환하다

필요한 일부 이전 코드와 인터페이스해야 하는 경우 java.sql.Timestamp, 다음을 사용하여 앞뒤로 변환할 수 있습니다. java.time.Instant.이전 클래스에 추가된 새 변환 메서드를 호출합니다.

java.sql.Timestamp ts = java.sql.Timestamp.from( instant ) ;

다른 방향으로 갑니다.

Instant instant = ts.toInstant() ;

또한보십시오 내 답변 비슷한 질문에.


에 대한 java.time

그만큼 java.time 프레임워크는 Java 8 이상에 내장되어 있습니다.이 클래스는 번거로운 기존 클래스를 대체합니다. 유산 다음과 같은 날짜-시간 수업 java.util.Date, Calendar, & SimpleDateFormat.

그만큼 조다타임 프로젝트, 지금 유지 관리 모드, 다음으로 마이그레이션을 권장합니다. java.time 클래스.

자세한 내용은 다음을 참조하세요. 오라클 튜토리얼.그리고 Stack Overflow를 검색해 많은 예와 설명을 알아보세요.사양은 JSR 310.

교환할 수도 있습니다 java.time 데이터베이스와 직접 개체를 연결합니다.사용 JDBC 드라이버 준수 JDBC 4.2 또는 나중에.문자열도 필요 없고 java.sql.* 클래스.

java.time 클래스는 어디서 구할 수 있나요?

그만큼 쓰리텐-엑스트라 프로젝트는 추가 클래스로 java.time을 확장합니다.이 프로젝트는 java.time에 향후 추가될 수 있는 기능을 입증하는 기반입니다.여기에서 다음과 같은 유용한 클래스를 찾을 수 있습니다. Interval, YearWeek, YearQuarter, 그리고 .

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top