현재 날짜와 시간을 구하는 가장 쉬운 방법은 System의 다음 정적 메소드를 사용하는 것이다.
static long currentTimeMillis()
이 메소드는 현재 시간값을 정수 하나로 리턴하는데 이 값은 1970년 1월 1일 자정을 기준으로 한 1/1000초 단위 경과시간이다. 에폭 타임 이라고도 한다.
그리고 자바에서 날짜를 구하는 방법은 Date 클래스를 이용하는 방법인데 날짜끼리의 계산하는 기능이 없어서 사용이 권장되지 않는다.
Date(int year, int month, int day [, int hour, int minute, int second])
Date(long milliseconds)
실제 프로젝트는 Caldendar 클래스의 서브클래스인 GregorianCalendar를 사용한다. 이 클래스는 윤년에 대한 정교한 규칙이 추가되어 있으며 전세계적으로 공인된 태양력을 표현한다.
GregorianCalendar(int year, int month, int day, int hour, int minute, int second)
GregorianCalendar(TimeZone timezone, Locale locale)
그리고 자유로운 형태로 포맷팅을 하려면 날짜 포맷 클래스를 사용한다.
SimpleDateFormat(String pattern)
String format(Date date)
다음은 안드로이드의 날짜 지원 클래스인 SystemClock을 보면
static long elapsedRealtime()
static long uptimeMillis()
static long currentThreadTimeMillis()
elapsedRealtime은 부팅 후에 경과한 시간을 리턴한다. 절대 시간은 아니지만 작업 경과 시간 등을 계산할 때 편리하게 사용할 수 있다.
uptimeMillis은 부팅 후 경과한 시간을 리턴하지만 장비가 슬립되었을때 시간을 제외한다.
currentThreadTimeMillis는 현재 스레드에서 소비한 시간을 조사한다.
실제 사용예제를 봅시다.
xml은 간단히 버튼 한 개와 텍스트뷰 한 개로 구성되어 있습니다.
activity_date_time_test.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<Button
android:id="@+id/btnrefresh"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="mOnClick"
android:text="Refresh"
/>
<TextView
android:id="@+id/result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:text=""
/>
</LinearLayout>
DateTimeTest.Java 파일
package com.example.ch13_datetimetest;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import android.app.Activity;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.widget.TextView;
public class DateTimeTest extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_date_time_test);
Refresh();
}
public void mOnClick(View v){
switch(v.getId()){
case R.id.btnrefresh:
Refresh();
break;
}
}
void Refresh(){
StringBuilder time = new StringBuilder();
//에폭타임 구하기
long epoch = System.currentTimeMillis();
time.append("epoch = " + epoch + "\n");
//GregorianCalender를 이용해서 현재 시간 날짜 구하기
Calendar cal = new GregorianCalendar();
time.append("now = " + String.format("%d년 %d월 %d일 %d시 %d분\n",
cal.get(Calendar.YEAR),
cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH),
cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE)));
//Date 클래스를 이용한 현재 시간 구하기
Date now = new Date();
//SimpleDateFormat 클래스를 사용해서 표시하는 포맷을 바꿔준다.
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd hh:mm:ss");
time.append("now = " + sdf.format(now) + "\n");
Calendar tom = new GregorianCalendar();
tom.add(Calendar.DAY_OF_MONTH, 1);//내일날짜를 위해 1일을 더한다.
Date tomdate = tom.getTime();
//포맷을 바꿔주고
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy.MM.dd");
//표시해준다.
time.append("tomorrow = " + sdf2.format(tomdate) + "\n");
//부팅후 경과한시간
time.append("boot = " + UpTime(SystemClock.elapsedRealtime()));
//부팅후 경과한시간 슬립시간 제외
time.append("run = " + UpTime(SystemClock.uptimeMillis()));
//현재 쓰레드 사용 시간
time.append("thread = " + UpTime(SystemClock.currentThreadTimeMillis()));
TextView result = (TextView)findViewById(R.id.result);
result.setText(time.toString());
}
//msec를 날짜 형식으로 바꿔주는 메소드
String UpTime(long msec){
long sec = msec / 1000;
String result;
//날짜 형식으로 변환해준다.
result = String.format("%d일 %d시 %d분 %d초\n", sec /86400, sec / 3600 % 24,
sec / 60 % 60, sec % 60);
return result;
}
}
출력 화면
'프로그래밍 > 안드로이드' 카테고리의 다른 글
안드로이드 - 크로노미터를 이용한 스톱와치 만들기 (0) | 2015.08.09 |
---|---|
안드로이드 - 날짜 대화상자 시간 대화상자 만들기 (0) | 2015.08.09 |
안드로이드 - DatePicker 위젯을 이용한 날짜 입력 받기 (1) | 2015.08.08 |
안드로이드 - 시간을 더욱 세련되게 표현하는 시계 위젯 만들기 (0) | 2015.08.08 |
안드로이드 - 프로그래스바의 확장형 시크바 (SeekBar) 만들기 (0) | 2015.08.08 |
안드로이다 - 실행 중에 메뉴를 교체하기 (0) | 2015.08.08 |
안드로이드 - 실행 중에 메뉴 편집 (0) | 2015.08.08 |
안드로이드 - 프로그래스바(ProgressBar) 만들기 (0) | 2015.08.07 |