You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android平台如何正确获取农历新年日期?

在Android上正确获取农历新年日期

你遇到的问题是直接设置ChineseCalendar的正月初一后得到错误日期,核心原因是没有指定目标年份——ChineseCalendar.getInstance()默认基于当前系统时间的农历年进行设置,导致获取的是当前农历年的春节,而非你期望的对应公历年的春节。

以下是两种正确的实现方式:

方式一:获取指定公历年对应的农历新年日期

该方法可获取某一公历年范围内的农历新年(比如2023年公历对应的春节是2023年1月22日):

import android.icu.util.ChineseCalendar
import android.icu.util.Calendar

fun getLunarNewYearForGregorianYear(targetGregorianYear: Int): Long {
    val chineseCal = ChineseCalendar.getInstance()
    // 先将日历锚定到目标公历年的1月1日,确保年份基准正确
    val gregorianCal = Calendar.getInstance().apply {
        set(Calendar.YEAR, targetGregorianYear)
        set(Calendar.MONTH, Calendar.JANUARY)
        set(Calendar.DAY_OF_MONTH, 1)
    }
    chineseCal.time = gregorianCal.time
    
    // 调整到农历正月初一
    chineseCal.set(ChineseCalendar.MONTH, ChineseCalendar.JANUARY)
    chineseCal.set(ChineseCalendar.DAY_OF_MONTH, 1)
    
    return chineseCal.timeInMillis
}

方式二:直接获取指定农历年的正月初一

如果你明确知道目标农历年份的数值,可直接设置后获取正月初一:

import android.icu.util.ChineseCalendar

fun getLunarNewYearForLunarYear(targetLunarYear: Int): Long {
    val chineseCal = ChineseCalendar.getInstance()
    chineseCal.set(ChineseCalendar.YEAR, targetLunarYear)
    chineseCal.set(ChineseCalendar.MONTH, ChineseCalendar.JANUARY)
    chineseCal.set(ChineseCalendar.DAY_OF_MONTH, 1)
    return chineseCal.timeInMillis
}

原代码错误原因

原代码未指定目标年份,ChineseCalendar.getInstance()默认使用当前系统时间对应的农历日期,直接设置正月初一只会得到当前系统时间所在农历年的春节。比如你想获取2023年公历对应的春节,但运行代码时系统时间还在2021年农历辛丑年,设置正月初一就会得到辛丑年的春节(2021年2月12日),这就是你遇到的错误。

内容的提问来源于stack exchange,提问作者Demigod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 13:35:18