본문 바로가기
android

디데이 계산기

by 윈 Win 2021. 1. 11.
728x90

블로그 이사했습니다!

 

👇 블로그 이전 공지 👇

블로그 이전 안내 (tistory.com)

 

 

👇 새 블로그에서 글 보기 👇

[Android] 디데이 계산기 — Win Record (tistory.com)

 

[Android] 디데이 계산기

⚠️ 2021.01.11에 작성된 글입니다 ⚠️ (update 01/13 2021) - 저장한 날짜로 계산 시 하루 밀리는 경우 디데이 계산기 만들기 - activity_main.xml <?xml version="1.0" encoding="utf-8"?> - MainActivity.ja..

win-record.tistory.com

 

 


 

(update 01/13 2021) - 저장한 날짜로 계산 시 하루 밀리는 경우

디데이 계산기 만들기

- activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="25sp" />

    <TextView
        android:id="@+id/tv_dday"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:textSize="25sp" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="클릭해 디데이 계산하기"
        android:textSize="20sp" />
</LinearLayout>

 

 

 

- MainActivity.java

public class MainActivity extends AppCompatActivity {
    Button button;
    TextView tvDate, tvDDay;

    final long ONE_DAY = 1000 * 60 * 60 * 24; // 하루
    final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("MM월 dd일 yyyy년", Locale.KOREA); // 날짜 형식

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = findViewById(R.id.button);
        tvDate = findViewById(R.id.tv_date);
        tvDDay = findViewById(R.id.tv_dday);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                DatePickerDialog datePickerDialog = new DatePickerDialog(MainActivity.this);
//                최소 선택 가능 날짜 설정
                datePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis());
                datePickerDialog.setOnDateSetListener(new DatePickerDialog.OnDateSetListener() {
                    @Override
                    public void onDateSet(DatePicker datePicker, int year, int month, int date) {
                        Calendar calendar = Calendar.getInstance(); // 날짜에 관한 추상 클래스
                        calendar.set(year, month, date); // datePicker 에서 선택한 날짜로 세팅
                        Date date1 = calendar.getTime();
                        tvDate.setText(DATE_FORMAT.format(date1)); // 날짜 형식대로 텍스트뷰 세팅

                        long selectDate = date1.getTime() / ONE_DAY; // 선택한 날짜 일수
                        long nowDate = System.currentTimeMillis() / ONE_DAY; // 현재 날짜 일수

                        long gap = selectDate - nowDate; // 선택 날짜와 현재 차이
                        tvDDay.setText(String.format(Locale.KOREA, "D-%d", gap));
                    }
                });
                datePickerDialog.show();
            }
        });
    }
}

 

Date는 날짜에 관한 객체이며 지역간 시간차 문제로 대부분의 메소드가 현재 사용 불가하다.

Calendar는 Date 보다 업그레이드된 날짜 객체이다.

 

 

 

 


(update 01/13 2021)

저장한 날짜로 계산 시 하루 밀리는 경우

날짜를 저장한 뒤 그 저장한 값을 불러와 d-day를 계산할 때 오늘, 내일, 모레가 d+1, d-day, d-1로 계산되는 경우 발생

현 시각을 기준으로 24시 내외일 때 내일이 d-day가 되기도 하고 오늘이 d+1이 되던 것

 

따라서 현 시각도 정한 날짜 포멧으로 바꾸고, 이를 다시 Date객체로 만들어 해결

 

 

- 수정 또는 추가 코드

String date = "" // 저장한 날짜 문자열

Date today = DATE_FORMAT.parse(DATE_FORMAT.format(new Date())); // 지금 날짜
Date date1 = DATE_FORMAT.parse(date); // 아이템 날짜

long selectDate = date1.getTime() / ONE_DAY; // 선택한 날짜 일수
long nowDate = today.getTime() / ONE_DAY; // 현재 날짜 일수

long dDay = selectDate - nowDate; // 선택날짜 기준 선택 날짜와 현재 차이, 오늘로부터 며칠 남았는지


if (dDay == 0) {
		// D-DAY 일 때 코드
} else if (dDay > 0) {
		// D-n 일 때 코드
} else {
		// D+n 일 때 코드
}

 

 

 


완성 화면

디데이 계산 완성화면

 

 

 


전체 코드

D-DAY Calculator

 

 

 

 


참고자료

자바의 정석 - 날짜와 시간(Calendar와 Date, java.time패키지) | Integerous DevLog (ryan-han.com)

Java - 현재 시간, 날짜를 원하는 형식으로 출력 (codechacha.com)

Android 안드로이드 - 디데이 예제 (tistory.com)

[java] long-> date, date->long 시간 변환 : 네이버 블로그 (naver.com)

Java 현재 시간 구하기 코드 성능 비교

 

 

 

공부하며 정리한 글입니다. 내용에 대한 피드백은 언제나 환영입니다.

 

 

'android' 카테고리의 다른 글

이미지 가져오기 - 카메라, 갤러리 이용  (1) 2021.01.14
Firebase와 안드로이드 프로젝트 연결하기  (0) 2021.01.11
WebView 웹뷰  (0) 2021.01.10
RecyclerView CRUD  (0) 2021.01.07
RecyclerView 기본 사용  (0) 2021.01.07

댓글