날짜 정규화

Android 2017. 5. 2. 16:04

MPAndroidChart 차트 라이브러리를 사용하면서 일별 데이터를 출력해야했는데

데이터베이스에 System.currentTimeMillis()로 얻어지는 UTC(세계 협정시)를 그대로 저장했기에

x축으로 그대로 사용할 수 없었고 간격이 1일이 되는 날짜로 정규화할 필요성이 있었다


(별도의 정규화가 필요한 이유는 20170517 과 같은 단순히 년/월/일을 직접 조합한 값을 사용하게 되면 년과 월의 경계에서 숫자가 크게 변하게 되어 이 값을 일정한 간격으로 증가해야하는 차트의 x축 값으로 사용하기에 적절하지 않기 때문이다)


처음엔 당연한듯 하루의 밀리초에 해당되는 (1000 * 60 * 60 * 24)로 나누어 정규화했지만

오차가 발생하였고 웹서칭으로 알아보니 지역별 TimeZone을 고려하지 않았서 생긴 문제였다


1
2
3
4
5
long t1 = 1493548835119// 2017-04-30 19:40:35.119
long t2 = 1493548835119// 2017-05-01 00:39:56.124
 
System.printf("" + (t1 / (1000 * 60 * 60 * 24)); // 17286 = 2017-04-30
System.printf("" + (t2 / (1000 * 60 * 60 * 24)); // 17286 = 2017-04-30
cs


결론적으로 한국은 UTC/GMT +9 이고

하루의 시간으로 나누어 시간 부분을 잘라내기전에 +9시간을 더해주어야 한다


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
long utcToDates(long timeMillis) {
    // utc를 입력 받아서 날수를 계산
    // TimeZone을 고려하지 않고 그냥 하루의 시간으로 나누게 되면 지역별 시간차에 의해 최대 1일의 오차가 발생
    return (timeMillis + Calendar.getInstance().get(Calendar.ZONE_OFFSET)) / (1000 * 60 * 60 * 24);
}
 
long datesToUtc(long dates) {
    return dates * (1000 * 60 * 60 * 24);
}
 
public String getFormattedDate(long value) {
    String strDate;
    Date mDate = new Date();
    Canendar mCalendar = Calendar.getInstance();
 
     mDate.setTime(datesToUtc(value));
     mCalendar.setTime(mDate);
 
     strDate = "" + mCalendar.get(Calendar.YEAR) +
                    "-" + (mCalendar.get(Calendar.MONTH) + 1+
                    "-" + mCalendar.get(Calendar.DATE);
 
     return strDate;
}        
cs




'Android' 카테고리의 다른 글

뷰 스와이프 영역 겹침 문제  (0) 2017.04.28
GPS 설정 액티비티 호출  (0) 2017.04.28

설정

트랙백

댓글