728x90
블로그 이사했습니다!
👇 블로그 이전 공지 👇
👇 새 블로그에서 글 보기 👇
[Android] 디데이 계산기 — 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 일 때 코드
}
완성 화면
전체 코드
참고자료
자바의 정석 - 날짜와 시간(Calendar와 Date, java.time패키지) | Integerous DevLog (ryan-han.com)
Java - 현재 시간, 날짜를 원하는 형식으로 출력 (codechacha.com)
Android 안드로이드 - 디데이 예제 (tistory.com)
[java] long-> date, date->long 시간 변환 : 네이버 블로그 (naver.com)
공부하며 정리한 글입니다. 내용에 대한 피드백은 언제나 환영입니다.
'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 |
댓글