2011-09-16 6 views
14

나는 SQL 선택의 시작 날짜와 종료 날짜의 경계로 Timestamp를 사용하는 앱을 가지고 있는데, 올해의 첫 월요일부터 값과 주 번호로 해시 맵을 채우기를 원한다. 열쇠. 시간 스탬프로 작업하는 것이 정말 힘들어서 하루를 늘리기 위해 86,400,000 초를 추가하는 것에 대해 기분이별로 들지 않습니다. 이는 윤일,시, 초를 고려하지 않기 때문입니다.java.sql.Timestamp를 14 일 동안 어떻게 증분합니까?

23 시간, 59 분 59 초를 13 일 추가하여 일주일 기준으로지도의 시작 날짜를 키로 검색 한 다음 종료일을 얻으려고합니다.

그래서 나는 이런 식으로 뭔가를 얻으려고 찾고 있어요 :지도 및 마지막의 처음 두 열

Week startDate    endDate 
1  2011-01-03 00:00:00 2011-01-16 23:59:59 
2  2011-01-17 00:00:00 2011-01-30 23:59:59 

이 그것을보고 후 계산된다. 어떻게하면 안전하게 java.sql.Timestamp를 증가시킬 수 있습니까?

+0

자바, 그 한 번 몇 년에 한 번씩. 1970 년 이래로 프로그램이 실행 중이라면 총 24 초가 걸릴 것입니다. 86.4M 초 추가 계획은 완벽하게 실행 가능합니다. – corsiKa

+0

Calendar 또는 Joda를 사용하는 것은 어떻습니까? http://joda-time.sourceforge.net/ –

+0

나는 진짜 질문이 ... 당신이 이것을 당신의 앱을위한 차단제로 파악한 것 같습니까? 그렇지 않다면 그냥 같이 가십시오. 그것이 문제라면, 그것은 스스로를 제시 할 것이고 당신은 그 문제를 해결할 수 있습니다. – corsiKa

답변

7

14 일이 항상 14 * 24 * 3600 초인 것은 아닙니다. 일광 절약 시간제를 사용하면 시간이 더 짧아 지거나 길어질 수 있습니다. 역사적으로 그보다 훨씬 더 복잡 할 수 있습니다.

대신 JodaTime 또는 Calendar를 사용하여 시간대 종속 계산을 수행 할 것을 제안합니다.

+1

그래도 문제가 되겠습니까? UTC를 사용하는 한이 문제가 발생하지 않습니다. – corsiKa

+1

SQL은 대부분 UTC를 사용하지 않습니다. 특히 명시 적으로 metntion하지 않으면. –

+0

그리니치 표준시 또는 일광 절약 시간제가없는 시간대를 사용하는 경우 문제가되지 않습니다. 나는 14 일 동안 하루 24 시간을 포함하지 않을 수도 있음을 알리고 싶었습니다. Java는 GMT와 같은 윤초를 지원하지 않지만 UTC는 그렇습니다. ;) –

36
java.sql.Timestamp ts = ... 
Calendar cal = Calendar.getInstance(); 
cal.setTime(ts); 
cal.add(Calendar.DAY_OF_WEEK, 14); 
ts.setTime(cal.getTime().getTime()); // or 
ts = new Timestamp(cal.getTime().getTime()); 

이렇게하면 기본 시간대의 일광 절약 시간 전환에 맞을 것입니다. 필요한 경우 Calendar 클래스에 다른 Timezone을 사용하도록 알릴 수 있습니다.

+0

VM에 업데이트 된 목록이있는 경우 일광 절약 시간 만 올바르게 계산됩니다. JodaTime은 이것을 위해 표준 소스를 사용할 수 있습니다. 아마도이 VM 업데이트는 역사적으로 느립니다. –

+1

느린 업데이트의 한 가지 이유는 "enterprisy"사용자가 적어도 10 년 이상 된 jvms에 머물러 있다는 것입니다. 반면에 대부분의 OS는 모든 정보가있는 시간대 정보 목록을 유지 관리합니다 필요합니다. jre는 실제로 그것을 사용해야합니다. 제 리눅스 노트북에서는 2499 년까지 설치가 된 것 같습니다 ... – KarlP

2
private Long dayToMiliseconds(int days){ 
    Long result = Long.valueOf(days * 24 * 60 * 60 * 1000); 
    return result; 
} 

public Timestamp addDays(int days, Timestamp t1) throws Exception{ 
    if(days < 0){ 
     throw new Exception("Day in wrong format."); 
    } 
    Long miliseconds = dayToMiliseconds(days); 
    return new Timestamp(t1.getTime() + miliseconds); 
} 
1

당신이 걱정해야 할 것이다 유일한 문제는 윤초 8

Timestamp old; 
ZonedDateTime zonedDateTime = old.toInstant().atZone(ZoneId.of("UTC")); 
Timestamp new = Timestamp.from(zonedDateTime.plus(14, ChronoUnit.DAYS).toInstant()); 
관련 문제