코딩스토리

[Android/안드로이드] 현재시간부터 특정시간까지 카운트다운 세기 본문

Android/유용한 기술

[Android/안드로이드] 현재시간부터 특정시간까지 카운트다운 세기

라크라꾸 2020. 9. 8. 23:13

쇼핑몰이나 게임을 할 때 보면 "이벤트기간까지 00시00분00초 남았습니다." 이런 형식으로 카운트다운을 세는 레이아웃을 구성해야 할 때가 있습니다. 

이번 포스팅에서는 CountDownTimer을 사용해서 현재시간부터 이벤트기간 날짜를 지정해서 그 사이의 시간을 카운트다운 해보는 코드를 작성해보겠습니다.

 

		
        countDownTimer = new CountDownTimer(200000,1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                tv_timer.setText(getTime());
            }

            @Override
            public void onFinish() {

            }
        };
        

CountDownTimer 객체를 생성해줍니다. 여기서 넘겨주는 파라미터는 millislnFuture, countDownIntercal을 넘겨줘야하는데 첫번째 파라미터는 제한시간을 뜻합니다. 이 타이머는 200000밀리초(200초)동안만 작동을 하도록 설정되어있습니다. 두번째 파라미터는 몇초마다 타이머가 작동할것가에 대한 것입니다. 여기서는 1초단위로 타이머가 작동되도록 설정하였습니다. 

 

    
    private String getTime(){
        Date date = new Date();
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH);
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        int c_hour = calendar.get(Calendar.HOUR_OF_DAY);
        int c_min = calendar.get(Calendar.MINUTE);
        int c_sec = calendar.get(Calendar.SECOND);

        Calendar baseCal = new GregorianCalendar(year,month,day,c_hour,c_min,c_sec);
        Calendar targetCal = new GregorianCalendar(year,month,day+2,0,0,0);  //비교대상날짜

        long diffSec = (targetCal.getTimeInMillis() - baseCal.getTimeInMillis()) / 1000;
        long diffDays = diffSec / (24*60*60);

        targetCal.add(Calendar.DAY_OF_MONTH, (int)(-diffDays));

        int hourTime = (int)Math.floor((double)(diffSec/3600));
        int minTime = (int)Math.floor((double)(((diffSec - (3600 * hourTime)) / 60)));
        int secTime = (int)Math.floor((double)(((diffSec - (3600 * hourTime)) - (60 * minTime))));

        String hour = String.format("%02d", hourTime);
        String min = String.format("%02d", minTime);
        String sec = String.format("%02d", secTime);

        return year+"년"+month+"월"+ (day+2)+"일 까지 " + hour + " 시간 " +min + " 분 "+ sec + "초 남았습니다.";

    }
    

getTime함수에서는 이제 이벤트 마감까지 얼마나 남았는지에 대한 text를 가져오는 함수입니다.

baseCal은 현재날짜를 가지고있는 객체이고, targetCal은 비교대상날짜, 즉 이벤트 마감일을 가지고 있는 객체입니다.(현재 코드는 언제나 작동할 수 있도록 현재날짜+2일을 한 상태입니다. 그러니 말일쯤에는 작동하지 않을 수 있으니 주의하시기 바랍니다. 예외처리하기 복잡스..

 

	
    countDownTimer.start();
    

마지막으로 타이머를 작동할 수 있도록 start를 해주면 완성됩니다.

 

 

전체코드입니다.

 

MainActivity.java

	
    package com.lakue.timersample;
	
	import androidx.appcompat.app.AppCompatActivity;
	
	import android.os.Bundle;
	import android.os.CountDownTimer;
	import android.widget.TextView;
	
	import java.util.Calendar;
	import java.util.Date;
	import java.util.GregorianCalendar;
	
	public class MainActivity extends AppCompatActivity {
	
	    CountDownTimer countDownTimer;
	    TextView tv_timer;
	
	    @Override
	    protected void onCreate(Bundle savedInstanceState) {
	        super.onCreate(savedInstanceState);
	        setContentView(R.layout.activity_main);
	
	        tv_timer = findViewById(R.id.tv_timer);
	
	        countDownTimer = new CountDownTimer(200000,1000) {
	            @Override
	            public void onTick(long millisUntilFinished) {
	                tv_timer.setText(getTime());
	            }
	
	            @Override
	            public void onFinish() {
	
	            }
	        };
	        countDownTimer.start();
	    }
	
	    private String getTime(){
	        Date date = new Date();
	        Calendar calendar = new GregorianCalendar();
	        calendar.setTime(date);
	        int year = calendar.get(Calendar.YEAR);
	        int month = calendar.get(Calendar.MONTH);
	        int day = calendar.get(Calendar.DAY_OF_MONTH);
	        int c_hour = calendar.get(Calendar.HOUR_OF_DAY);
	        int c_min = calendar.get(Calendar.MINUTE);
	        int c_sec = calendar.get(Calendar.SECOND);
	
	        Calendar baseCal = new GregorianCalendar(year,month,day,c_hour,c_min,c_sec);
	        Calendar targetCal = new GregorianCalendar(year,month,day+2,0,0,0);  //비교대상날짜
	
	        long diffSec = (targetCal.getTimeInMillis() - baseCal.getTimeInMillis()) / 1000;
	        long diffDays = diffSec / (24*60*60);
	
	        targetCal.add(Calendar.DAY_OF_MONTH, (int)(-diffDays));
	
	        int hourTime = (int)Math.floor((double)(diffSec/3600));
	        int minTime = (int)Math.floor((double)(((diffSec - (3600 * hourTime)) / 60)));
	        int secTime = (int)Math.floor((double)(((diffSec - (3600 * hourTime)) - (60 * minTime))));
	
	        String hour = String.format("%02d", hourTime);
	        String min = String.format("%02d", minTime);
	        String sec = String.format("%02d", secTime);
	
	        return year+"년"+month+"월"+ (day+2)+"일 까지 " + hour + " 시간 " +min + " 분 "+ sec + "초 남았습니다.";
	
	    }
	}
	

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv_timer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

잘 안되시는 분은 다음 github를 참고해주세요.

github.com/lakue119/CountDownSample

 

lakue119/CountDownSample

Contribute to lakue119/CountDownSample development by creating an account on GitHub.

github.com

 

Comments