获取法定节假日

首先添加依赖

plugins {
    kotlin("jvm") version "1.9.22"
    id("org.jetbrains.kotlin.plugin.serialization") version "1.9.22"
}

implementation("net.java.dev.jna:jna:5.15.0")
implementation("net.java.dev.jna:jna-platform:5.15.0")
implementation("com.squareup.okhttp3:okhttp:4.12.0")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.2")
class HolidayManager {

    // 荣耀云日历规则
    private val holidayRulesUrl =
        "https://configserver-drcn.platform.hihonorcloud.com/servicesupport/updateserver/data/com.hihonor.configplatform_calendar_holidayInfo"
    private val cacheFile = File("holiday${LocalDate.now().year}.json")
    val rules: Holiday

    init {
        val holidayJson = if (cacheFile.exists()) {
            cacheFile.readText()
        } else {
            OkHttpClient.Builder()
                .proxy(queryRegProxy())
                .build()
                .newCall(Request.Builder().url(holidayRulesUrl).build())
                .execute().use { it.body.string() }.also {
                    cacheFile.writeText(it)
                }
        }
        rules = Json.decodeFromString<Holiday>(holidayJson)
    }

    // 牛魔规则第一天是0
    fun LocalDate.isWork(): Boolean {
        val day = this.dayOfYear - 1
        if (day in rules.freeday) return false
        if (day in rules.workday) return true
        return this.dayOfWeek !in listOf(DayOfWeek.SATURDAY, DayOfWeek.SUNDAY)
    }

    fun LocalDate.nextWork(): LocalDate {
        var target = this.plusDays(1)
        while (!target.isWork()) {
            target = target.plusDays(1)
        }
        return target
    }

    private fun queryRegProxy(): Proxy {
        val key = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"
        val proxy = Advapi32Util.registryGetStringValue(WinReg.HKEY_CURRENT_USER, key, "ProxyServer")
        val host = proxy.substringBefore(':')
        val port = proxy.substringAfter(':').toInt()
        return Proxy(Proxy.Type.HTTP, InetSocketAddress(host, port))
    }

    @Serializable
    data class Holiday(
        val year: Int,
        val version: String,
        val workday: List<Int>,
        val freeday: List<Int>
    )
}