728x90
java 버전은 https://stickode.tistory.com/236 를 확인해주세요.
안녕하세요!
오늘은 스틱 코드를 이용하여 수업 종료 날짜를 계산해 보겠습니다.
예를 들어,
주 1회,
총 수업 횟수 20번,
수업 시작일이 '2021-07-04' 에 시작한다 가정해 보았을 때
수업이 언제 끝나고 오늘로부터 얼마나 남았는지, 무슨 요일인지 계산을 해보도록 하겠습니다.
* 계산된 예시
앱을 실행하여 계산을 하면 다음과 같은 결과를 얻을 수 있습니다.
1. 목표 일 계산
먼저 시작일 포함 총 20회 수업을 들었을 때 마지막 수업 일을 구하는 메소드를 만들어 보도록 할게요.
companion object {
var dateFormat = "yyyy-MM-dd" // 전역 변수
}
// startDateStr : 시작일(String), week : 회차
fun getDate(startDateStr: String?, week: Int): String {
val cal: Calendar = Calendar.getInstance()
val df = SimpleDateFormat(dateFormat)
var startDate = Date()
try {
startDate = df.parse(startDateStr)
} catch (e: ParseException) {
e.printStackTrace()
}
// '(회차-1) * 7'일 구하기 -> 수업일로 부터 며칠 뒤 인지 계산
val dateCount = (week - 1) * 7
// cal 변수에 시작일을 대입
// -> dateCount 만큼의 일 수 더하기
cal.time = startDate
cal.add(Calendar.DATE, dateCount)
// 더해진 날짜를
val afterDate: Date = cal.getTime()
return df.format(afterDate)
}
코드 중 (week - 1 ) 부분은 시작일을 수업 시작일로 계산하기 때문에 한주 마이너스 하였습니다.
2. 오늘부터 수업 종료까지 남은 일 수 구하기
다음으로 오늘 날짜로부터 수업 종료일까지 며칠 남았는지 계산을 해보도록 할게요
fun getDue(endDate: String?): String {
val calToday: Calendar = Calendar.getInstance()
val calDDay: Calendar = Calendar.getInstance()
val df = SimpleDateFormat(dateFormat)
var dDay = Date()
try {
dDay = df.parse(endDate)
} catch (e: ParseException) {
e.printStackTrace()
}
// D-Day -> calDay 적용
calDDay.time = dDay
// 날짜 -> 밀리세컨트로 변환 -> 하루 단위로 계산
val lToday: Long = calToday.timeInMillis / (24 * 60 * 60 * 1000)
val lDDay: Long = calDDay.timeInMillis / (24 * 60 * 60 * 1000)
// D-Day - 오늘
val calculate = lDDay - lToday
// long -> String
return calculate.toString()
}
수업 종료일과 오늘을 일 단위로 변경하여 두 날짜의 차이 계산을 계산 합니다.
3. 수업 마지막 날 요일 구하기
수업 마지막 날은 무슨 요일인지 확인해보는 코드 입니다.
fun getDOW(endDate: String?): String {
val cal: Calendar = Calendar.getInstance()
val df = SimpleDateFormat(dateFormat)
var dDay = Date()
try {
dDay = df.parse(endDate)
} catch (e: ParseException) {
e.printStackTrace()
}
cal.time = dDay
return cal.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.KOREAN)
}
4. 전체 코드
위에서 만든 메소드를 버튼 클릭 시 작동하도록 코드를 작성합니다.
MainActvitiy.java
class MainActivity : AppCompatActivity() {
var convertBtn: Button? = null
var writeDate: EditText? = null
var writeWeek: EditText? = null
var dayTv: TextView? = null
var dueTv: TextView? = null
var dowTv: TextView? = null
var getStartDate: String? = null
var getWeek = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init()
convertBtn?.setOnClickListener {
getStartDate = writeDate!!.text.toString()
getWeek = writeWeek!!.text.toString().toInt()
val endDate = getDate(getStartDate, getWeek)
dayTv!!.text = endDate
val dDay = getDue(endDate)
dueTv!!.text = dDay
val dayOfWeek = getDOW(endDate)
dowTv!!.text = dayOfWeek
}
}
private fun init() {
convertBtn = findViewById(R.id.convertButton)
writeDate = findViewById(R.id.dateEditText)
writeWeek = findViewById(R.id.timeEditText)
dayTv = findViewById(R.id.dayTextView)
dueTv = findViewById(R.id.dueTextView)
dowTv = findViewById(R.id.dayofweekTextView)
}
companion object {
var dateFormat = "yyyy-MM-dd" // 전역 변수
}
// startDateStr : 시작일(String), week : 회차
fun getDate(startDateStr: String?, week: Int): String {
val cal: Calendar = Calendar.getInstance()
val df = SimpleDateFormat(dateFormat)
var startDate = Date()
try {
startDate = df.parse(startDateStr)
} catch (e: ParseException) {
e.printStackTrace()
}
// '(회차-1) * 7'일 구하기 -> 수업일로 부터 며칠 뒤 인지 계산
val dateCount = (week - 1) * 7
// cal 변수에 시작일을 대입
// -> dateCount 만큼의 일 수 더하기
cal.time = startDate
cal.add(Calendar.DATE, dateCount)
// 더해진 날짜를
val afterDate: Date = cal.getTime()
return df.format(afterDate)
}
fun getDue(endDate: String?): String {
val calToday: Calendar = Calendar.getInstance()
val calDDay: Calendar = Calendar.getInstance()
val df = SimpleDateFormat(dateFormat)
var dDay = Date()
try {
dDay = df.parse(endDate)
} catch (e: ParseException) {
e.printStackTrace()
}
// D-Day -> calDay 적용
calDDay.time = dDay
// 날짜 -> 밀리세컨트로 변환 -> 하루 단위로 계산
val lToday: Long = calToday.timeInMillis / (24 * 60 * 60 * 1000)
val lDDay: Long = calDDay.timeInMillis / (24 * 60 * 60 * 1000)
// D-Day - 오늘
val calculate = lDDay - lToday
// long -> String
return calculate.toString()
}
fun getDOW(endDate: String?): String {
val cal: Calendar = Calendar.getInstance()
val df = SimpleDateFormat(dateFormat)
var dDay = Date()
try {
dDay = df.parse(endDate)
} catch (e: ParseException) {
e.printStackTrace()
}
cal.time = dDay
return cal.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.KOREAN)
}
}
레이아웃
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"
android:padding="8dp"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/startDateTextView"
android:text="시작 일"
app:layout_constraintStart_toStartOf="parent"
android:textSize="32sp"
app:layout_constraintTop_toTopOf="parent"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/timeTextView"
android:text="회차"
app:layout_constraintStart_toStartOf="@id/startDateTextView"
app:layout_constraintTop_toBottomOf="@id/startDateTextView"
android:textSize="32sp"
/>
<EditText
android:id="@+id/dateEditText"
android:hint="연-월-일 ex)2021-12-17"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/startDateTextView"
app:layout_constraintTop_toTopOf="@id/startDateTextView"
app:layout_constraintBottom_toBottomOf="@id/startDateTextView"
android:layout_marginStart="32sp"
/>
<EditText
android:id="@+id/timeEditText"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/startDateTextView"
app:layout_constraintTop_toTopOf="@id/timeTextView"
app:layout_constraintBottom_toBottomOf="@id/timeTextView"
android:layout_marginStart="32sp"
/>
<Button
android:id="@+id/convertButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/timeEditText"
android:text="변환"
android:textSize="16sp"
android:layout_marginTop="16dp"
/>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/convertButton"
android:layout_marginTop="32dp"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="목표 일"
android:textSize="32sp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="남은 일수"
android:textSize="32sp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="32sp"
android:text="요일"
/>
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="wrap_content"
app:layout_constraintTop_toBottomOf="@id/convertButton"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
android:orientation="vertical"
android:layout_marginTop="32dp"
android:gravity="end"
>
<TextView
android:id="@+id/dayTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="32sp"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/dueTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="32sp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="일"
android:textSize="32sp"
/>
</LinearLayout>
<TextView
android:id="@+id/dayofweekTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="32sp"
/>
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.constraintlayout.widget.ConstraintLayout>
5. 실행
'안드로이드 코틀린' 카테고리의 다른 글
[Kotlin][Android] 스피너 만들기 (0) | 2022.05.13 |
---|---|
[Kotlin][Android] setOnItemSelectedListener 을 이용한 Bottom Navigation (0) | 2022.05.07 |
[Kotlin][Android] 쉐어드 프리퍼런스 사용하기 (0) | 2022.05.01 |
[Kotlin][Android] 안드로이드 코루틴(Coroutine) 으로 타이머 기능 만들기 (0) | 2022.04.25 |
[Android][Kotlin]BackPressed시, 중첩된 Fragment 순서대로 종료하기 (0) | 2022.04.23 |