본문 바로가기

Study/Android

[공유] 안드로이드에서의 시간과 날짜 - 1


날짜나 시간을 가져오기 위해서 어떤 방법이 있는 지 검색해봤다.

 

일단 날짜를 출력하기 위해서는 달력이 어떻게 되어 있는지, 시간이 어떻게 측정(?)되는 지 알아야 할 것 같아서 좀 더 검색을 해봤다.

 

출처 - http://bomber0.byus.net/index.php/2009/02/05/983

 

천체관측을 통해서 1년을 365일 5시간 48분 55초라고 하는데, 보니 365일과 약 1/4일이 1년이라는 이야기다.

 

4년 마다 약 하루씩의 날짜가 더 있기 때문에, 4년마다 윤년을 두고 2월에 하루를 더 추가하지만,  33년 마다 8일이 더 붙어서 100 = 33 * 3 + 1 , 400 = 33 * 3 * 4 + 4 라는 식을 활용한다면, 400년에는 8 * 3* 4 + 1 =97 일 정도가 더 필요해지게 되고, 이 오차를 수정하기 위해서 100년 마다 윤년을 건너뛰고 400년의 배수가 되는 해를 윤년으로 해서 100년간 97번의 윤년을 가지게 된다고 한다.

 

출처 - http://stackoverflow.com/questions/5369682/get-current-time-and-date-on-android

율리우스력 - http://en.wikipedia.org/wiki/Julian_calendar

그레고리력 - http://en.wikipedia.org/wiki/Gregorian_calendar

 

4년마다 율리우스력을 사용하던 방식에서 16세기 그레고리 교황 시기에 이 오차를 수정한 그레고리력을 사용을 시작했고, 댓글을 보니 1582년 10월 4일에서 1582년 10월 15일로 10일을 점프(기존 오차를 보정?)해서 적용했다고 한다.

 

아무튼 그렇다고 하니 그렇다.

 

 

안드로이드에서 시간을 얻는 방법을 좀 검색해보니 방법이 꽤 많다.

 

조 - http://developer.android.com/reference/android/os/SystemClock.html

 

우선 안드로이드의 시스템 시간을 얻어오는 방법들을 알아봤다.

 

안드로이드 시스템 시계는 android.os.SystemClock 클래스를 통해서 이용할 수 있는데, 몇 가지 특성이 있다.

 

1) System.currentTimeMillis()

System.currentTimeMillis()는 표준적인 시계로, 특정 시점(1970년 1월 1일 00:00:00.000)을 기준으로 현재의 시간을 밀리 초로 표시하는 시계로 데이터 타입은 long 이다. 

 

UTC(협정 세계시) 기준으로 사용자가 직접 시스템 시간을 설정하거나 네트워크 시간 받아오기를 선택함으로써 해당 시간을 시스템의 현재 시간으로 인지한다. (따라서 사용자가 현재와 다른 시간을 수동으로 설정하거나 장시간 네트워크가 끊어짐으로 오차가 발생할 여지는 있을 것 같다.)

 

이 시계는 캘린더 알람과 같은 앱에서 사용될 때 실제 시간과 일치하여 사용되기도 하고, 타임스탬프와 같은 항목에 적용할 수 있다고 한다. (음, 캘린더나 알람 등 실제 생활과 연결이 되는 앱을 만들때에는 현재의 시간이 네트워크를 통하여 동기화되어 있나를 체크해보는 것이 필요할 것이라는 생각이 든다.)

 

사실 별 생각없이 사용했는데, 그렇구나 하는 게 있다.

 

 

2) uptimeMillis()

uptimeMillis()는 시스템이 부팅된 이후의 시간을 밀리초로 표시하는 시계로, SystemClock.uptimeMillis()와 같이 사용되며 데이터 타입은 long 이다.

 

요 녀석의 특징은 시스템이 잠들면 시간이 멈춘다는 점이 특징이다. 잠든다고 표현한 항목들은 CPU의 off 상태, 화면이 꺼져서 검게된 상태, 그리고 외부 입력으로 인하여 시스템이 대기중인 상태 등이다. 그 외에 전력을 아끼기 위해서 화면이 어두워지거나 하는 등의 절전 상태에서는 이 시계는 잠들지 않는다.

 

이런 특징을 가지고 있기 때문에 앱이 실행 중인 상태에서 실행 시간 등을 체크하는 데 사용하면 될 것 같다. 예를 들면 게임에서 플레이 타임을 체크할 때 유용하지 않을까 생각이 든다.

 

 

 

3) elapsedRealtime(), elapsedRealtimeNanos()

이 녀석들은 시스템 부팅 이후 앱이나 시스템의 대기상태 등에 영향을 받지 않고 계속 시간을 체크하며, long 타입을 반환한다.

 

uptimeMillis()가 상태에 따른 시간의 흐름이 단절되는데 반해서 시스템 부팅 이후의 시간을 계속 체크하므로, 일반적인 목적의 시간 간격을 체크하는 기반으로 사용되면 좋다고 한다.

 

 

그 외에도 좀 읽을 거리가 많이 있기 때문에 위의 구글 주소에 들어가서 한 번 읽어보면 좋을 것 같다.



출처: https://limts28.tistory.com/468 [꿜리의 블로그]