Kotlin LocalDateTime 주말 제외하기

이지훈·2023년 2월 7일
0

[Android]

목록 보기
7/8
post-custom-banner

LocalDateTime 클래스와 주식 api 를 활용하여 날짜별로 데이터를 가져와서 화면에 뿌리려고 하는데 가져오는 날짜에 주말이 껴있는 경우 데이터가 들어오지 않는 이슈가 발생하였다.

따라서 가져오는 날짜 중에 주말(토요일, 일요일)을 제외하는 코드가 필요하였는데 내가 작성한 코드는 다음과 같다.

    @RequiresApi(Build.VERSION_CODES.O)
    fun isWeekend(localDateTime: LocalDateTime): Boolean {
        return localDateTime.dayOfWeek == DayOfWeek.SATURDAY ||
                localDateTime.dayOfWeek == DayOfWeek.SUNDAY
    }

dayofMonth(1~31) 로만 조작을 해보려고 해서 헛짓거리를 좀 많이 하엿는데 dayOfWeek 을 통해 요일까지 간편하게 판별할 수 있었다.

활용 코드는 다음과 같다.

package com.example.stockmarketapp.data.csv

import android.os.Build
import androidx.annotation.RequiresApi
import com.example.stockmarketapp.data.mapper.toIntradayInfo
import com.example.stockmarketapp.data.remote.dto.IntradayInfoDto
import com.example.stockmarketapp.domain.model.IntradayInfo
import com.opencsv.CSVReader
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.io.InputStream
import java.io.InputStreamReader
import java.time.DayOfWeek
import java.time.LocalDate
import java.time.LocalDateTime
import javax.inject.Inject
import javax.inject.Singleton

// csv 파일에서 데이터 파싱 해오기
@Singleton
class IntradayInfoParser @Inject constructor() : CSVParser<IntradayInfo> {

    @RequiresApi(Build.VERSION_CODES.O)
    override suspend fun parse(stream: InputStream): List<IntradayInfo> {
        val csvReader = CSVReader(InputStreamReader(stream))
        return withContext(Dispatchers.IO) {
            csvReader
                .readAll()
                // 첫번째 원소 제거
                .drop(1)
                .mapNotNull { line ->
                    val timestamp = line.getOrNull(0) ?: return@mapNotNull null
                    val close = line.getOrNull(4) ?: return@mapNotNull null
                    val dto = IntradayInfoDto(timestamp, close.toDouble())
                    dto.toIntradayInfo()
                }
                .filter { intradayInfo ->
                // 주말인 경우 제외 (
                    intradayInfo.date.dayOfWeek != DayOfWeek.SATURDAY ||
                            intradayInfo.date.dayOfWeek != DayOfWeek.SUNDAY

                }
                .sortedBy { intradayInfo ->
                    intradayInfo.date.hour
                }
                .also {
                    csvReader.close()
                }
        }
    }
}
profile
실력은 고통의 총합이다. Android Developer
post-custom-banner

0개의 댓글