글
날짜 정규화
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 |