lunar-java icon indicating copy to clipboard operation
lunar-java copied to clipboard

代码中的一个疑问

Open Felis-nigripes opened this issue 1 year ago • 2 comments

首先非常感谢您提供了这么好的一个库,我有个疑问: 在 Solar 的构造方法中,为什么将 MILLISECOND 清除呢,是会有什么隐藏问题吗?

public Solar(Calendar calendar) { calendar.set(Calendar.MILLISECOND, 0); ...... }

其次想请问下,在Lunar类中考虑增加 nextYear() 和 nextMonth() 方法吗? 非常感谢

Felis-nigripes avatar Jul 03 '24 01:07 Felis-nigripes

第一个问题,因为日历用不到毫秒级别,只需要到秒精度就足够了。 第二个问题,精力有限,lunar自认为设计不合理,以后只修复bug,不会再新增功能了,以后主要维护tyme。当然,lunar已经没什么显而易见的bug了。

6tail avatar Jul 04 '24 15:07 6tail

非常感谢您的回复 我写了一段代码,主要功能是在一个时间戳基础上加n个农历年,然后返回增加后的结果日期的时间戳 但是我对农历方面的知识很欠缺,想请您帮忙看看这段代码是否存在什么问题,非常感谢您! 代码如下:

// 代码是Koltin写的,我尽量保持其一些写法与Java一致
fun addYear(milli: Long, amount: Int = 0): Long {
        val calendar = Calendar.getInstance()
        calendar.setTimeInMillis(milli)

        val solar = Solar.fromCalendar(calendar)
        val lunar = solar.getLunar()
        // 增加年份
        val amountLunarYear = LunarYear.fromYear(lunar.getYear() + amount)
        // 处理月份,在增加年份后,判断原来的月份在新的年份中是否存在
        val amountLunarYearMonths: List<Int> = amountLunarYear.getMonthsInYear().map { lunarMonth ->
            lunarMonth.getMonth() 
        }
        val validMonth = if (lunar.getMonth() in amountLunarYearMonths) {
            lunar.getMonth()
        } else if (-lunar.getMonth() in amountLunarYearMonths) {
            -lunar.getMonth()
        } else {
            amountLunarYearMonths[0]
        }
        val amountLunarMonth = LunarMonth.fromYm(amountLunarYear.getYear(), validMonth)
        // 处理日子,在处理完月份后,判断原来的Day是否在新的月份范围内
        val amountLunarMonthDayCount = amountLunarMonth.getDayCount()
        val validDay = if (lunar.getDay() > amountLunarMonthDayCount) {
            amountLunarMonthDayCount
        } else {
            lunar.getDay()
        }
        val newLunar = Lunar.fromYmd(amountLunarMonth.getYear(), amountLunarMonth.getMonth(), validDay)
        val amountSolar = newLunar.getSolar()

        calendar.set(Calendar.YEAR, amountSolar.getYear())
        calendar.set(Calendar.MONTH, amountSolar.getMonth() - 1)
        calendar.set(Calendar.DATE, amountSolar.getDay())
        return calendar.getTimeInMillis()
}

Felis-nigripes avatar Jul 04 '24 16:07 Felis-nigripes