1
0
mirror of synced 2026-10-10 16:57:39 +08:00

Compare commits

...

7 Commits

6 changed files with 210 additions and 20 deletions

View File

@@ -16,7 +16,7 @@ lunar是一款无第三方依赖的公历(阳历)和农历(阴历、老黄历)
<dependency>
<groupId>cn.6tail</groupId>
<artifactId>lunar</artifactId>
<version>1.1.2</version>
<version>1.1.4</version>
</dependency>
```

View File

@@ -12,7 +12,7 @@ lunar is a calendar library for Solar and Chinese Lunar.
<dependency>
<groupId>cn.6tail</groupId>
<artifactId>lunar</artifactId>
<version>1.1.2</version>
<version>1.1.4</version>
</dependency>
```

View File

@@ -7,7 +7,7 @@
<groupId>cn.6tail</groupId>
<artifactId>lunar</artifactId>
<packaging>jar</packaging>
<version>1.1.2</version>
<version>1.1.4</version>
<name>${project.groupId}:${project.artifactId}</name>
<url>https://github.com/6tail/lunar-java</url>
<description>a calendar library for Solar and Chinese Lunar</description>

View File

@@ -1,5 +1,7 @@
package com.nlf.calendar;
import com.nlf.calendar.util.LunarUtil;
/**
* 节气
*
@@ -13,11 +15,22 @@ public class JieQi {
/** 阳历日期 */
private Solar solar;
/** 是否节令 */
private boolean jie;
/** 是否气令 */
private boolean qi;
public JieQi() {
}
/**
* 初始化
* @param name 名称
* @param solar 阳历日期
*/
public JieQi(String name, Solar solar) {
this.name = name;
setName(name);
this.solar = solar;
}
@@ -35,6 +48,18 @@ public class JieQi {
*/
public void setName(String name) {
this.name = name;
for(String key: LunarUtil.JIE){
if(key.equals(name)){
this.jie = true;
return;
}
}
for(String key: LunarUtil.QI){
if(key.equals(name)){
this.qi = true;
return;
}
}
}
/**
@@ -53,4 +78,24 @@ public class JieQi {
this.solar = solar;
}
/**
* 是否节令
* @return true/false
*/
public boolean isJie(){
return jie;
}
/**
* 是否气令
* @return true/false
*/
public boolean isQi() {
return qi;
}
@Override
public String toString(){
return name;
}
}

View File

@@ -12,6 +12,14 @@ import com.nlf.calendar.util.SolarUtil;
*
*/
public class Lunar{
/** 节气表头部追加农历上年末的节气名(节令:大雪),以示区分 */
public static final String JIE_QI_PREPEND = "DA_XUE";
/** 节气表尾部追加农历下年初的节气名(气令:冬至),以示区分 */
public static final String JIE_QI_APPEND = "DONG_ZHI";
/** 农历年初节气名(气令:冬至) */
public static final String JIE_QI_FIRST = "冬至";
/** 农历年末节气名(节令:大雪) */
public static final String JIE_QI_LAST = "大雪";
/** 1弧度对应的角秒 */
private static final double SECOND_PER_RAD = 180 * 3600 / Math.PI;
/** 节气表,国标以冬至为首个节气 */
@@ -389,14 +397,17 @@ public class Lunar{
if (calcJieQi(w) > jd){
w -= 365.2422;
}
//追加上一农历年末的大雪
double q = calcJieQi(w - 15.2184);
jieQi.put(JIE_QI_PREPEND, Solar.fromJulianDay(qiAccurate2(q) + Solar.J2000));
int size = JIE_QI.length;
for (int i=0;i<size;i++) {
double q = calcJieQi(w + 15.2184 * i);
q = calcJieQi(w + 15.2184 * i);
jieQi.put(JIE_QI[i], Solar.fromJulianDay(qiAccurate2(q) + Solar.J2000));
}
//追加下一农历年的冬至
double q = calcJieQi(w + 15.2184 * size);
jieQi.put("DONG_ZHI", Solar.fromJulianDay(qiAccurate2(q) + Solar.J2000));
//追加下一农历年初的冬至
q = calcJieQi(w + 15.2184 * size);
jieQi.put(JIE_QI_APPEND, Solar.fromJulianDay(qiAccurate2(q) + Solar.J2000));
}
/**
@@ -926,9 +937,9 @@ public class Lunar{
}
/**
* 获取节
* 获取节令
*
* @return 节
* @return 节令
*/
public String getJie(){
for(String jie:LunarUtil.JIE){
@@ -937,13 +948,18 @@ public class Lunar{
return jie;
}
}
// 追加的节令:大雪
Solar d = jieQi.get(JIE_QI_PREPEND);
if(d.getYear()==solar.getYear()&&d.getMonth()==solar.getMonth()&&d.getDay()==solar.getDay()){
return JIE_QI_LAST;
}
return "";
}
/**
* 获取气
* 获取气令
*
* @return 气
* @return 气令
*/
public String getQi(){
for(String qi:LunarUtil.QI){
@@ -952,9 +968,10 @@ public class Lunar{
return qi;
}
}
Solar d = jieQi.get("DONG_ZHI");
// 追加的气令:冬至
Solar d = jieQi.get(JIE_QI_APPEND);
if(d.getYear()==solar.getYear()&&d.getMonth()==solar.getMonth()&&d.getDay()==solar.getDay()){
return "冬至";
return JIE_QI_FIRST;
}
return "";
}
@@ -1846,6 +1863,7 @@ public class Lunar{
public NineStar getDayNineStar(){
//顺逆
String solarYmd = solar.toYmd();
String dongZhi = jieQi.get("冬至").toYmd();
String yuShui = jieQi.get("雨水").toYmd();
String guYu = jieQi.get("谷雨").toYmd();
String xiaZhi = jieQi.get("夏至").toYmd();
@@ -1854,7 +1872,7 @@ public class Lunar{
int start = 6;
boolean asc = false;
if(solarYmd.compareTo(jieQi.get("冬至").toYmd())>=0 && solarYmd.compareTo(yuShui)<0){
if(solarYmd.compareTo(dongZhi)>=0 && solarYmd.compareTo(yuShui)<0){
asc = true;
start = 1;
} else if(solarYmd.compareTo(yuShui)>=0 && solarYmd.compareTo(guYu)<0){
@@ -1916,7 +1934,7 @@ public class Lunar{
}
/**
* 获取下一节(顺推的第一个节)
* 获取下一节令(顺推的第一个节令)
* @return 节气
*/
public JieQi getNextJie(){
@@ -1924,13 +1942,29 @@ public class Lunar{
}
/**
* 获取上一节(逆推的第一个节)
* 获取上一节令(逆推的第一个节令)
* @return 节气
*/
public JieQi getPrevJie(){
return getNearJieQi(false,LunarUtil.JIE);
}
/**
* 获取下一气令(顺推的第一个气令)
* @return 节气
*/
public JieQi getNextQi(){
return getNearJieQi(true,LunarUtil.QI);
}
/**
* 获取上一气令(逆推的第一个气令)
* @return 节气
*/
public JieQi getPrevQi(){
return getNearJieQi(false,LunarUtil.QI);
}
/**
* 获取下一节气(顺推的第一个节气)
* @return 节气
@@ -1964,8 +1998,11 @@ public class Lunar{
String today = solar.toYmdHms();
for(Map.Entry<String,Solar> entry:jieQi.entrySet()){
String jq = entry.getKey();
if("DONG_ZHI".equals(jq)){
jq = "冬至";
if(JIE_QI_APPEND.equals(jq)){
jq = JIE_QI_FIRST;
}
if(JIE_QI_PREPEND.equals(jq)){
jq = JIE_QI_LAST;
}
if(filter){
if(!filters.contains(jq)){
@@ -1998,6 +2035,54 @@ public class Lunar{
return new JieQi(name, near);
}
/**
* 获取节气名称,如果无节气,返回空字符串
* @return 节气名称
*/
public String getJieQi(){
String name = "";
for(Map.Entry<String,Solar> jq:jieQi.entrySet()){
Solar d = jq.getValue();
if(d.getYear()==solar.getYear()&&d.getMonth()==solar.getMonth()&&d.getDay()==solar.getDay()){
name = jq.getKey();
break;
}
}
if(JIE_QI_APPEND.equals(name)){
name = JIE_QI_FIRST;
}else if(JIE_QI_PREPEND.equals(name)){
name = JIE_QI_LAST;
}
return name;
}
/**
* 获取当天节气对象,如果无节气,返回null
* @return 节气对象
*/
public JieQi getCurrentJieQi(){
String name = getJieQi();
return name.length()>0 ? new JieQi(name,solar) : null;
}
/**
* 获取当天节令对象,如果无节令,返回null
* @return 节气对象
*/
public JieQi getCurrentJie(){
String name = getJie();
return name.length()>0 ? new JieQi(name,solar) : null;
}
/**
* 获取当天气令对象,如果无气令,返回null
* @return 节气对象
*/
public JieQi getCurrentQi(){
String name = getQi();
return name.length()>0 ? new JieQi(name,solar) : null;
}
public String toFullString(){
StringBuilder s = new StringBuilder();
s.append(toString());
@@ -2037,7 +2122,7 @@ public class Lunar{
s.append(f);
s.append(")");
}
String jq = getJie()+getQi();
String jq = getJieQi();
if(jq.length()>0){
s.append(" [");
s.append(jq);

View File

@@ -1,5 +1,6 @@
package test;
import com.nlf.calendar.Lunar;
import com.nlf.calendar.Solar;
import org.junit.Assert;
import org.junit.Test;
@@ -95,4 +96,63 @@ public class JieQiTest {
Assert.assertEquals(name, entry.getValue(), result.get(name).toYmdHms());
}
}
@Test
public void test() {
Solar solar = Solar.fromYmd(1986,1,5);
Lunar lunar = solar.getLunar();
Assert.assertEquals("小寒", lunar.getJie());
Assert.assertEquals("小寒", lunar.getJieQi());
Assert.assertEquals("小寒", lunar.getCurrentJieQi().getName());
Assert.assertEquals("小寒", lunar.getCurrentJie().getName());
Assert.assertNull(lunar.getCurrentQi());
Assert.assertEquals("", lunar.getQi());
Assert.assertEquals("大雪", lunar.getPrevJie().getName());
Assert.assertEquals("冬至", lunar.getPrevQi().getName());
Assert.assertEquals("冬至", lunar.getPrevJieQi().getName());
solar = Solar.fromYmdHms(1986,1,20,17,0,0);
lunar = solar.getLunar();
Assert.assertEquals("大寒", lunar.getQi());
Assert.assertEquals("大寒", lunar.getJieQi());
Assert.assertEquals("大寒", lunar.getCurrentJieQi().getName());
Assert.assertEquals("大寒", lunar.getCurrentQi().getName());
Assert.assertNull(lunar.getCurrentJie());
Assert.assertEquals("", lunar.getJie());
Assert.assertEquals("立春", lunar.getNextJie().getName());
Assert.assertEquals("雨水", lunar.getNextQi().getName());
Assert.assertEquals("立春", lunar.getNextJieQi().getName());
solar = Solar.fromYmdHms(1986,1,20,14,0,0);
lunar = solar.getLunar();
Assert.assertEquals("小寒", lunar.getPrevJie().getName());
Assert.assertEquals("冬至", lunar.getPrevQi().getName());
Assert.assertEquals("小寒", lunar.getPrevJieQi().getName());
solar = Solar.fromYmd(1986,12,7);
lunar = solar.getLunar();
Assert.assertEquals("大雪", lunar.getJie());
Assert.assertEquals("大雪", lunar.getJieQi());
Assert.assertEquals("大雪", lunar.getCurrentJieQi().getName());
Assert.assertEquals("大雪", lunar.getCurrentJie().getName());
Assert.assertNull(lunar.getCurrentQi());
Assert.assertEquals("", lunar.getQi());
Assert.assertEquals("大雪", lunar.getNextJie().getName());
Assert.assertEquals("冬至", lunar.getNextQi().getName());
Assert.assertEquals("大雪", lunar.getNextJieQi().getName());
solar = Solar.fromYmd(1986,1,1);
lunar = solar.getLunar();
Assert.assertEquals("", lunar.getJie());
Assert.assertEquals("", lunar.getQi());
Assert.assertEquals("", lunar.getJieQi());
Assert.assertNull(lunar.getCurrentJieQi());
Assert.assertNull(lunar.getCurrentJie());
Assert.assertNull(lunar.getCurrentQi());
Assert.assertEquals("大雪", lunar.getPrevJie().getName());
Assert.assertEquals("冬至", lunar.getPrevQi().getName());
Assert.assertEquals("冬至", lunar.getPrevJieQi().getName());
Assert.assertEquals("小寒", lunar.getNextJie().getName());
Assert.assertEquals("大寒", lunar.getNextQi().getName());
Assert.assertEquals("小寒", lunar.getNextJieQi().getName());
}
}