2017-05-19 4 views
0

최근 프로젝트에서 시간대 문제가 발생하지 않도록 Calendar에서 LocalTime을 joda로 전환했습니다 (시간대가 필요 없음). 타임 스탬프에 LOCALDATE를 변환 한 후, 그 결과는 전날 23:00까지 다시 떨어질 내가 알아낼 수없는 이유LocalDate를 Timestamp로 변환 할 때 전날 23:00에 도착

class DateTimeUtils{ 
    static Timestamp getDeadline(LocalDate localDate, int daysToAdd){ 
     localDate = localDate.plusDays(daysToAdd); 
     System.out.println(localDate);//This prints 2017-06-02 
     return new Timestamp(localDate.toDateTimeAtStartOfDay().getMillis());   
    } 
    public static void main(String... args){ 
    LocalDate localDate= new LocalDate(2017,5,31); 
    Timestamp timeStamp=getDeadline(localDate,2); 
    System.out.println(timeStamp);//This prints 2017-06-01 23:00:00.0 
    } 
} 

: 어떤 시점에서 나는 LOCALDATE에서 타임 스탬프를받을 필요가 . 왜 그런가요?

+0

귀하의 코드는 두 가지 방법 모두에서 동일한 출력을 반환합니다 (브라질 출신) '2017-06-02'과'2017-06-02 00 : 00 : 00.0' 어쩌면 현지에서 일광 절약 back to 23:00:00 –

+1

'localDate.toDateTimeAtStartOfDay()'는 시간대 문제를 피하지 않습니다. 그냥 기본 시간대를 사용하고 있습니다. 데이터베이스의 시간대와 JDBC 드라이버가 가정하는 시간대에 여전히 문제가 있습니다. – VGR

+0

@ErickMaia, 내 로컬 컴퓨터에 일광 절약 시간제가 없습니다. 내 컴퓨터에서이 코드를 실행하면 0이됩니다. TimeZone timezone = TimeZone.getDefault(); System.out.println ("DayLight Saving :"+ timezone.getDSTSavings()); –

답변

3

시간대 내 프로젝트 당신은 시간대 문제를 무시할 수

에서 시간대 문제를 방지하기 위해

을 중요. 꿈꾸는 꿈. 용감 해지고, 뿔에 의해 황소를 잡고, 시간대를 다루는 법을 배우십시오. 프로그래밍 작업이 훨씬 쉬워집니다.

toDateTimeAtStartOfDay으로 전화 할 때 DateTimeZone 개체의 시간대 인수를 생략하기로 선택했습니다. 따라서 런타임시 JVM의 현재 기본 시간대가 자동으로 암시 적으로 적용됩니다.

그런 다음 항상 UTC 인 java.sql.Timestamp (패키지에 대해 명시 적으로 명시하지 않았 음)로 변환합니다.

런타임에 현재 기본 표준 시간대를 제공하지 않았으므로 자세한 내용을 알 수 없습니다.

java.time에게

Joda 타임 프로젝트를 사용하여 그 팀이 java.time 클래스로 이동 조언과 함께, 유지 보수 모드에 있습니다. 두 프로젝트 모두 같은 사람 Stephen Colebourne이 주도 했으므로 동일한 개념적 접근 방식을 공유합니다. 끝내기 쉬워.

오늘 날짜를 가져 오려면 시간대를 지정하십시오. 어떤 주어진 순간에, 날짜는 지구에 따라 지역마다 다릅니다.

영역을 atStartOfDay으로 전달하는 방법을 확인하십시오.

ZoneId z = ZoneId.of("America/Montreal") ; 
LocalDate today = LocalDate.now(z); 
LocalDate twoDaysLater = today.plusDays(2) ; 
ZonedDateTime zdt = twoDaysLater.atStartOfDay(z) ; 
Instant instant = zdt.toInstant(); // Instant is always in UTC by definition. 

JDBC 4.2 이상에서는 java.time 유형을 직접 사용할 수 있습니다. PreparedStatement.setObjectResultSet.getObject으로 전화하십시오.

3

새로운 Java 8 Date Time API를 사용해 보셨습니까? java.sql.Timestamp과 같은 레거시 클래스와의 쉬운 상호 운용성을 허용합니다. 다음 코드는 JDK 8 java.time 클래스에서 예상되는 결과를 제공합니다.

public class DateTimeUtils { 
    static Timestamp getDeadline(LocalDate localDate, int daysToAdd) { 
     localDate = localDate.plusDays(daysToAdd); 
     return Timestamp.valueOf(localDate.atStartOfDay()); 
    } 

    public static void main(String... args) { 
     LocalDate localDate = LocalDate.of(2017, 5, 31); 
     Timestamp timestamp = getDeadline(localDate, 2); 
     System.out.println(timestamp);// This prints 2017-06-02 00:00:00.0 
    } 
} 
+0

나는 당신과 같은 결과를 얻는다. 내 컴퓨터가 다른 시간대에 있기 때문에 동일한 타임 스탬프를 얻지 못합니다 (타임 스탬프는 내 컴퓨터가 중부 유럽 서머 타임을 실행하기 때문에 2017-06-01T22 : 00 : 00Z의 순간과 같습니다. 유럽/Oslo 또는 Europe/Hamburg) GMT + 2와 같습니다. –

관련 문제