All Downloads are FREE. Search and download functionalities are using the official Maven repository.

tech.harmonysoft.oss.common.time.util.DateTimeHelper.kt Maven / Gradle / Ivy

package tech.harmonysoft.oss.common.time.util

import tech.harmonysoft.oss.common.time.clock.ClockProvider
import java.time.DayOfWeek
import java.time.Instant
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.LocalTime
import java.time.ZoneId
import java.time.format.DateTimeFormatter
import java.util.concurrent.ConcurrentHashMap
import javax.inject.Named

@Named
class DateTimeHelper(
    private val clockProvider: ClockProvider
) {

    private val patterns = ConcurrentHashMap()

    fun formatDate(date: LocalDate): String {
        return getFormatter(DATE_PATTERN).format(date)
    }

    fun formatDate(date: LocalDate, pattern: String): String {
        return getFormatter(pattern).format(date)
    }

    fun formatTime(time: LocalTime): String {
        return getFormatter(TIME_PATTERN).format(time)
    }

    fun formatTime(time: LocalTime, pattern: String): String {
        return getFormatter(pattern).format(time)
    }

    fun formatDateTime(dateTime: LocalDateTime): String {
        return getFormatter(DATE_TIME_PATTERN).format(dateTime)
    }

    fun formatDateTime(dateTime: LocalDateTime, pattern: String): String {
        return getFormatter(pattern).format(dateTime)
    }

    fun isWeekend(time: Instant, timeZone: ZoneId): Boolean {
        val dayOfWeek = DayOfWeek.from(time.atZone(timeZone))
        return dayOfWeek == DayOfWeek.SATURDAY || dayOfWeek == DayOfWeek.SUNDAY
    }

    fun parseTime(raw: String): LocalTime {
        return parseTime(raw, TIME_PATTERN)
    }

    fun parseTime(raw: String, pattern: String): LocalTime {
        return try {
            LocalTime.parse(raw, getFormatter(pattern))
        } catch (e: Exception) {
            throw IllegalArgumentException("failed to parse local time from '$raw' using pattern '$pattern'", e)
        }
    }

    fun parseDate(raw: String): LocalDate {
        return parseDate(raw, DATE_PATTERN)
    }

    fun parseDate(raw: String, pattern: String): LocalDate {
        return try {
            LocalDate.parse(raw, getFormatter(pattern))
        } catch (e: Exception) {
            throw IllegalArgumentException("failed to parse local date from '$raw' using pattern '$pattern'", e)
        }
    }

    fun parseDateTime(raw: String): LocalDateTime {
        return parseDateTime(raw, DATE_TIME_PATTERN)
    }

    fun parseDateTime(raw: String, pattern: String): LocalDateTime {
        return try {
            LocalDateTime.parse(raw, getFormatter(pattern))
        } catch (e: Exception) {
            throw IllegalArgumentException("failed to parse local date time from '$raw' using pattern '$pattern'", e)
        }
    }

    fun getFormatter(pattern: String): DateTimeFormatter {
        return patterns[pattern] ?: patterns.computeIfAbsent(pattern) {
            DateTimeFormatter.ofPattern(pattern)
        }
    }

    companion object {
        const val DATE_PATTERN = "yyyy-MM-dd"
        const val TIME_PATTERN = "HH:mm:ss.SSS"
        const val DATE_TIME_PATTERN = "$DATE_PATTERN $TIME_PATTERN"
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy