1
0
mirror of synced 2026-10-09 16:26:10 +08:00

Compare commits

...

12 Commits

24 changed files with 810 additions and 352 deletions

3
.gitignore vendored
View File

@@ -13,4 +13,5 @@ target/
*.cache
*.diff
*.patch
*.tmp
*.tmp
.DS_Store

View File

@@ -16,7 +16,7 @@ lunar是一款无第三方依赖的公历(阳历)、农历(阴历、老黄历)
<dependency>
<groupId>cn.6tail</groupId>
<artifactId>lunar</artifactId>
<version>1.2.23</version>
<version>1.3.2</version>
</dependency>
```
@@ -53,4 +53,4 @@ lunar是一款无第三方依赖的公历(阳历)、农历(阴历、老黄历)
## 文档
请移步至 [http://6tail.cn/calendar/api.html](http://6tail.cn/calendar/api.html "http://6tail.cn/calendar/api.html")
请移步至 [https://6tail.cn/calendar/api.html](https://6tail.cn/calendar/api.html "https://6tail.cn/calendar/api.html")

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.2.23</version>
<version>1.3.2</version>
</dependency>
```
@@ -49,4 +49,4 @@ Output:
## Documentation
Please visit [http://6tail.cn/calendar/api.html](http://6tail.cn/calendar/api.html "http://6tail.cn/calendar/api.html")
Please visit [https://6tail.cn/calendar/api.html](https://6tail.cn/calendar/api.html "https://6tail.cn/calendar/api.html")

14
pom.xml
View File

@@ -7,7 +7,7 @@
<groupId>cn.6tail</groupId>
<artifactId>lunar</artifactId>
<packaging>jar</packaging>
<version>1.2.23</version>
<version>1.3.2</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>
@@ -48,6 +48,7 @@
<sourceEncoding>UTF-8</sourceEncoding>
<source-version>1.5</source-version>
<target-version>1.5</target-version>
<creator>6tail</creator>
<maven-compiler-plugin-version>3.3</maven-compiler-plugin-version>
<maven-surefire-plugin-version>2.5</maven-surefire-plugin-version>
<maven-javadoc-plugin-version>2.9</maven-javadoc-plugin-version>
@@ -60,7 +61,7 @@
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
@@ -104,6 +105,7 @@
</goals>
<configuration>
<additionalparam>-Xdoclint:none</additionalparam>
<source>${source-version}</source>
</configuration>
</execution>
</executions>
@@ -147,13 +149,21 @@
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<finalName>${project.artifactId}-${project.version}</finalName>
<descriptors>
<descriptor>${basedir}/src/assembly/assembly.xml</descriptor>
</descriptors>
<archive>
<manifestEntries>
<Created-By>${creator}</Created-By>
<Built-By>${creator}</Built-By>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>

View File

@@ -1,88 +0,0 @@
package com.nlf.calendar;
import com.nlf.calendar.util.SolarUtil;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
/**
* 精确日期
*
* @author 6tail
*/
public class ExactDate {
/**
* 时区
*/
private static final TimeZone TIME_ZONE = TimeZone.getTimeZone("GMT+8");
@SuppressWarnings("MagicConstant")
public static Calendar fromYmdHms(int year, int month, int day, int hour, int minute, int second) {
Calendar c = Calendar.getInstance(TIME_ZONE);
c.set(year, month - 1, day, hour, minute, second);
c.set(Calendar.MILLISECOND, 0);
if (0 == year) {
c.add(Calendar.YEAR, 1);
}
return c;
}
public static Calendar fromYmd(int year, int month, int day) {
return fromYmdHms(year, month, day, 0, 0, 0);
}
public static Calendar fromDate(Date date) {
Calendar c = Calendar.getInstance(TIME_ZONE);
c.setTime(date);
c.set(Calendar.MILLISECOND, 0);
return c;
}
/**
* 获取两个日期之间相差的天数(如果日期a比日期b小,天数为正,如果日期a比日期b大,天数为负)
*
* @param ay 年a
* @param am 月a
* @param ad 日a
* @param by 年b
* @param bm 月b
* @param bd 日b
* @return 天数
*/
public static int getDaysBetween(int ay, int am, int ad, int by, int bm, int bd) {
int n;
int days;
int i;
if (ay == by) {
n = SolarUtil.getDaysInYear(by, bm, bd) - SolarUtil.getDaysInYear(ay, am, ad);
} else if (ay > by) {
days = SolarUtil.getDaysOfYear(by) - SolarUtil.getDaysInYear(by, bm, bd);
for (i = by + 1; i < ay; i++) {
days += SolarUtil.getDaysOfYear(i);
}
days += SolarUtil.getDaysInYear(ay, am, ad);
n = -days;
} else {
days = SolarUtil.getDaysOfYear(ay) - SolarUtil.getDaysInYear(ay, am, ad);
for (i = ay + 1; i < by; i++) {
days += SolarUtil.getDaysOfYear(i);
}
days += SolarUtil.getDaysInYear(by, bm, bd);
n = days;
}
return n;
}
/**
* 获取两个日期之间相差的天数(如果日期a比日期b小,天数为正,如果日期a比日期b大,天数为负)
*
* @param calendar0 日期a
* @param calendar1 日期b
* @return 天数
*/
public static int getDaysBetween(Calendar calendar0, Calendar calendar1) {
return getDaysBetween(calendar0.get(Calendar.YEAR), calendar0.get(Calendar.MONTH) + 1, calendar0.get(Calendar.DATE), calendar1.get(Calendar.YEAR), calendar1.get(Calendar.MONTH) + 1, calendar1.get(Calendar.DATE));
}
}

View File

@@ -183,24 +183,23 @@ public class Lunar {
this.second = second;
Solar noon = Solar.fromJulianDay(m.getFirstJulianDay() + lunarDay - 1);
this.solar = Solar.fromYmdHms(noon.getYear(), noon.getMonth(), noon.getDay(), hour, minute, second);
if (noon.getYear() != lunarYear) {
y = LunarYear.fromYear(noon.getYear());
}
compute(y);
}
/**
* 通过阳历日期初始化
* 通过阳历初始化
*
* @param date 阳历日期
* @param solar 阳历
*/
public Lunar(Date date) {
solar = new Solar(date);
int currentYear = solar.getYear();
int currentMonth = solar.getMonth();
int currentDay = solar.getDay();
LunarYear ly = LunarYear.fromYear(currentYear);
public Lunar(Solar solar) {
LunarYear ly = LunarYear.fromYear(solar.getYear());
for (LunarMonth m : ly.getMonths()) {
// 初一
Solar firstDay = Solar.fromJulianDay(m.getFirstJulianDay());
int days = ExactDate.getDaysBetween(firstDay.getYear(), firstDay.getMonth(), firstDay.getDay(), currentYear, currentMonth, currentDay);
int days = solar.subtract(firstDay);
if (days < m.getDayCount()) {
year = m.getYear();
month = m.getMonth();
@@ -211,9 +210,19 @@ public class Lunar {
hour = solar.getHour();
minute = solar.getMinute();
second = solar.getSecond();
this.solar = solar;
compute(ly);
}
/**
* 通过阳历日期初始化
*
* @param date 阳历日期
*/
public Lunar(Date date) {
this(Solar.fromDate(date));
}
/**
* 计算节气表
*/
@@ -2046,13 +2055,16 @@ public class Lunar {
}
protected NineStar getYearNineStar(String yearInGanZhi) {
int index = LunarUtil.getJiaZiIndex(yearInGanZhi) + 1;
int yearOffset = 0;
if (index != LunarUtil.getJiaZiIndex(this.getYearInGanZhi()) + 1) {
yearOffset = -1;
int indexExact = LunarUtil.getJiaZiIndex(yearInGanZhi) + 1;
int index = LunarUtil.getJiaZiIndex(this.getYearInGanZhi()) + 1;
int yearOffset = indexExact - index;
if (yearOffset > 1) {
yearOffset -= 60;
} else if (yearOffset < -1) {
yearOffset += 60;
}
int yuan = ((this.year + yearOffset + 2696) / 60) % 3;
int offset = (62 + yuan * 3 - index) % 9;
int offset = (62 + yuan * 3 - indexExact) % 9;
if (0 == offset) {
offset = 9;
}
@@ -2169,13 +2181,13 @@ public class Lunar {
String solarNiZiYmd = solarNiZi.toYmd();
int offset = 0;
if (solarYmd.compareTo(solarShunBaiYmd) >= 0 && solarYmd.compareTo(solarNiZiYmd) < 0) {
offset = ExactDate.getDaysBetween(solarShunBai.getCalendar(), this.getSolar().getCalendar()) % 9;
offset = solar.subtract(solarShunBai) % 9;
} else if (solarYmd.compareTo(solarNiZiYmd) >= 0 && solarYmd.compareTo(solarShunBaiYmd2) < 0) {
offset = 8 - (ExactDate.getDaysBetween(solarNiZi.getCalendar(), this.getSolar().getCalendar()) % 9);
offset = 8 - (solar.subtract(solarNiZi) % 9);
} else if (solarYmd.compareTo(solarShunBaiYmd2) >= 0) {
offset = ExactDate.getDaysBetween(solarShunBai2.getCalendar(), this.getSolar().getCalendar()) % 9;
offset = solar.subtract(solarShunBai2) % 9;
} else if (solarYmd.compareTo(solarShunBaiYmd) < 0) {
offset = (8 + ExactDate.getDaysBetween(this.getSolar().getCalendar(), solarShunBai.getCalendar())) % 9;
offset = (8 + solarShunBai.subtract(solar)) % 9;
}
return NineStar.fromIndex(offset);
}
@@ -2878,23 +2890,23 @@ public class Lunar {
* @return 数九,如果不是数九天,返回null
*/
public ShuJiu getShuJiu() {
Calendar currentCalendar = ExactDate.fromYmd(solar.getYear(), solar.getMonth(), solar.getDay());
Solar current = Solar.fromYmd(solar.getYear(), solar.getMonth(), solar.getDay());
Solar start = jieQi.get("DONG_ZHI");
Calendar startCalendar = ExactDate.fromYmd(start.getYear(), start.getMonth(), start.getDay());
start = Solar.fromYmd(start.getYear(), start.getMonth(), start.getDay());
if (currentCalendar.compareTo(startCalendar) < 0) {
if (current.isBefore(start)) {
start = jieQi.get("冬至");
startCalendar = ExactDate.fromYmd(start.getYear(), start.getMonth(), start.getDay());
start = Solar.fromYmd(start.getYear(), start.getMonth(), start.getDay());
}
Calendar endCalendar = ExactDate.fromYmd(start.getYear(), start.getMonth(), start.getDay());
endCalendar.add(Calendar.DATE, 81);
Solar end = Solar.fromYmd(start.getYear(), start.getMonth(), start.getDay());
end = end.next(81);
if (currentCalendar.compareTo(startCalendar) < 0 || currentCalendar.compareTo(endCalendar) >= 0) {
if (current.isBefore(start) || !current.isBefore(end)) {
return null;
}
int days = ExactDate.getDaysBetween(startCalendar, currentCalendar);
int days = current.subtract(start);
return new ShuJiu(LunarUtil.NUMBER[days / 9 + 1] + "九", days % 9 + 1);
}
@@ -2904,10 +2916,10 @@ public class Lunar {
* @return 三伏,如果不是伏天,返回null
*/
public Fu getFu() {
Calendar currentCalendar = ExactDate.fromYmd(solar.getYear(), solar.getMonth(), solar.getDay());
Solar current = Solar.fromYmd(solar.getYear(), solar.getMonth(), solar.getDay());
Solar xiaZhi = jieQi.get("夏至");
Solar liQiu = jieQi.get("立秋");
Calendar startCalendar = ExactDate.fromYmd(xiaZhi.getYear(), xiaZhi.getMonth(), xiaZhi.getDay());
Solar start = Solar.fromYmd(xiaZhi.getYear(), xiaZhi.getMonth(), xiaZhi.getDay());
// 第1个庚日
int add = 6 - xiaZhi.getLunar().getDayGanIndex();
if (add < 0) {
@@ -2915,34 +2927,31 @@ public class Lunar {
}
// 第3个庚日,即初伏第1天
add += 20;
startCalendar.add(Calendar.DATE, add);
start = start.next(add);
// 初伏以前
if (currentCalendar.compareTo(startCalendar) < 0) {
if (current.isBefore(start)) {
return null;
}
int days = ExactDate.getDaysBetween(startCalendar, currentCalendar);
int days = current.subtract(start);
if (days < 10) {
return new Fu("初伏", days + 1);
}
// 第4个庚日,中伏第1天
startCalendar.add(Calendar.DATE, 10);
days = ExactDate.getDaysBetween(startCalendar, currentCalendar);
start = start.next(10);
days = current.subtract(start);
if (days < 10) {
return new Fu("中伏", days + 1);
}
// 第5个庚日,中伏第11天或末伏第1天
startCalendar.add(Calendar.DATE, 10);
Calendar liQiuCalendar = ExactDate.fromYmd(liQiu.getYear(), liQiu.getMonth(), liQiu.getDay());
days = ExactDate.getDaysBetween(startCalendar, currentCalendar);
start = start.next(10);
days = current.subtract(start);
Solar liQiuSolar = Solar.fromYmd(liQiu.getYear(), liQiu.getMonth(), liQiu.getDay());
// 末伏
if (liQiuCalendar.compareTo(startCalendar) <= 0) {
if (!liQiuSolar.isAfter(start)) {
if (days < 10) {
return new Fu("末伏", days + 1);
}
@@ -2952,8 +2961,8 @@ public class Lunar {
return new Fu("中伏", days + 11);
}
// 末伏第1天
startCalendar.add(Calendar.DATE, 10);
days = ExactDate.getDaysBetween(startCalendar, currentCalendar);
start = start.next(10);
days = current.subtract(start);
if (days < 10) {
return new Fu("末伏", days + 1);
}
@@ -2977,17 +2986,18 @@ public class Lunar {
*/
public String getWuHou() {
JieQi jieQi = getPrevJieQi(true);
String name = jieQi.getName();
int offset = 0;
for (int i = 0, j = JIE_QI.length; i < j; i++) {
if (name.equals(JIE_QI[i])) {
if (jieQi.getName().equals(JIE_QI[i])) {
offset = i;
break;
}
}
Solar startSolar = jieQi.getSolar();
int days = ExactDate.getDaysBetween(startSolar.getYear(), startSolar.getMonth(), startSolar.getDay(), solar.getYear(), solar.getMonth(), solar.getDay());
return LunarUtil.WU_HOU[(offset * 3 + days / 5) % LunarUtil.WU_HOU.length];
int index = solar.subtract(jieQi.getSolar()) / 5;
if (index > 2) {
index = 2;
}
return LunarUtil.WU_HOU[(offset * 3 + index) % LunarUtil.WU_HOU.length];
}
/**
@@ -2997,10 +3007,8 @@ public class Lunar {
*/
public String getHou() {
JieQi jieQi = getPrevJieQi(true);
Solar startSolar = jieQi.getSolar();
int days = ExactDate.getDaysBetween(startSolar.getYear(), startSolar.getMonth(), startSolar.getDay(), solar.getYear(), solar.getMonth(), solar.getDay());
int max = LunarUtil.HOU.length - 1;
int offset = days / 5;
int offset = solar.subtract(jieQi.getSolar()) / 5;
if (offset > max) {
offset = max;
}

View File

@@ -1,9 +1,6 @@
package com.nlf.calendar;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.*;
import com.nlf.calendar.util.HolidayUtil;
import com.nlf.calendar.util.LunarUtil;
@@ -15,6 +12,11 @@ import com.nlf.calendar.util.SolarUtil;
* @author 6tail
*/
public class Solar {
/**
* 时区
*/
public static final TimeZone TIME_ZONE = TimeZone.getTimeZone("GMT+8");
/**
* 2000年儒略日数(2000-1-1 12:00:00 UTC)
*/
@@ -50,11 +52,6 @@ public class Solar {
*/
private final int second;
/**
* 日历
*/
private final Calendar calendar;
/**
* 默认使用当前日期初始化
*/
@@ -84,7 +81,23 @@ public class Solar {
* @param second 秒钟,0到59
*/
public Solar(int year, int month, int day, int hour, int minute, int second) {
calendar = ExactDate.fromYmdHms(year, month, day, hour, minute, second);
if (1582 == year && 10 == month) {
if (day > 4 && day < 15) {
throw new IllegalArgumentException(String.format("wrong solar year %d month %d day %d", year, month, day));
}
}
if (month < 1 || month > 12) {
throw new IllegalArgumentException(String.format("wrong month %d", month));
}
if (day < 1 || day > 31) {
throw new IllegalArgumentException(String.format("wrong day %d", day));
}
if (minute < 0 || minute > 59) {
throw new IllegalArgumentException(String.format("wrong minute %d", minute));
}
if (second < 0 || second > 59) {
throw new IllegalArgumentException(String.format("wrong second %d", second));
}
this.year = year;
this.month = month;
this.day = day;
@@ -99,13 +112,15 @@ public class Solar {
* @param date 日期
*/
public Solar(Date date) {
calendar = ExactDate.fromDate(date);
year = calendar.get(Calendar.YEAR);
month = calendar.get(Calendar.MONTH) + 1;
day = calendar.get(Calendar.DATE);
hour = calendar.get(Calendar.HOUR_OF_DAY);
minute = calendar.get(Calendar.MINUTE);
second = calendar.get(Calendar.SECOND);
Calendar c = Calendar.getInstance(TIME_ZONE);
c.setTime(date);
c.set(Calendar.MILLISECOND, 0);
year = c.get(Calendar.YEAR);
month = c.get(Calendar.MONTH) + 1;
day = c.get(Calendar.DATE);
hour = c.get(Calendar.HOUR_OF_DAY);
minute = c.get(Calendar.MINUTE);
second = c.get(Calendar.SECOND);
}
/**
@@ -115,7 +130,6 @@ public class Solar {
*/
public Solar(Calendar calendar) {
calendar.set(Calendar.MILLISECOND, 0);
this.calendar = calendar;
year = calendar.get(Calendar.YEAR);
month = calendar.get(Calendar.MONTH) + 1;
day = calendar.get(Calendar.DATE);
@@ -169,8 +183,6 @@ public class Solar {
minute -= 60;
hour++;
}
calendar = ExactDate.fromYmdHms(year, month, day, hour, minute, second);
this.year = year;
this.month = month;
this.day = day;
@@ -277,64 +289,42 @@ public class Solar {
public static List<Solar> fromBaZi(String yearGanZhi, String monthGanZhi, String dayGanZhi, String timeGanZhi, int sect, int baseYear) {
sect = (1 == sect) ? 1 : 2;
List<Solar> l = new ArrayList<Solar>();
Solar today = new Solar();
Lunar lunar = today.getLunar();
int offsetYear = LunarUtil.getJiaZiIndex(lunar.getYearInGanZhiExact()) - LunarUtil.getJiaZiIndex(yearGanZhi);
if (offsetYear < 0) {
offsetYear = offsetYear + 60;
List<Integer> years = new ArrayList<Integer>();
Solar today = fromDate(new Date());
int offsetYear = LunarUtil.getJiaZiIndex(today.getLunar().getYearInGanZhiExact())-LunarUtil.getJiaZiIndex(yearGanZhi);
if(offsetYear < 0){
offsetYear += 60;
}
int startYear = today.getYear() - offsetYear - 1;
while (true) {
years.add(startYear);
startYear -= 60;
if (startYear < baseYear) {
years.add(baseYear);
break;
}
}
int startYear = lunar.getYear() - offsetYear;
int hour = 0;
String timeZhi = timeGanZhi.substring(1);
for (int i = 0, j = LunarUtil.ZHI.length; i < j; i++) {
if (LunarUtil.ZHI[i].equals(timeZhi)) {
for(int i = 0, j = LunarUtil.ZHI.length; i < j; i++){
if(LunarUtil.ZHI[i].equals(timeZhi)){
hour = (i - 1) * 2;
}
}
while (startYear >= baseYear) {
int year = startYear - 1;
int counter = 0;
int month = 12;
int day;
boolean found = false;
while (counter < 15) {
if (year >= baseYear) {
day = 1;
Solar solar = new Solar(year, month, day, hour, 0, 0);
lunar = solar.getLunar();
if (lunar.getYearInGanZhiExact().equals(yearGanZhi) && lunar.getMonthInGanZhiExact().equals(monthGanZhi)) {
found = true;
break;
}
}
month++;
if (month > 12) {
month = 1;
year++;
}
counter++;
}
if (found) {
counter = 0;
month--;
if (month < 1) {
month = 12;
year--;
}
day = 1;
Solar solar = new Solar(year, month, day, hour, 0, 0);
while (counter < 61) {
lunar = solar.getLunar();
for (Integer y : years) {
inner: for (int x = 0; x < 3; x++) {
int year = y + x;
Solar solar = fromYmdHms(year, 1, 1, hour, 0, 0);
while (solar.getYear() == year) {
Lunar lunar = solar.getLunar();
String dgz = (2 == sect) ? lunar.getDayInGanZhiExact2() : lunar.getDayInGanZhiExact();
if (lunar.getYearInGanZhiExact().equals(yearGanZhi) && lunar.getMonthInGanZhiExact().equals(monthGanZhi) && dgz.equals(dayGanZhi) && lunar.getTimeInGanZhi().equals(timeGanZhi)) {
l.add(solar);
break;
break inner;
}
solar = solar.next(1);
counter++;
}
}
startYear -= 60;
}
return l;
}
@@ -354,7 +344,26 @@ public class Solar {
* @return 0123456
*/
public int getWeek() {
return calendar.get(Calendar.DAY_OF_WEEK) - 1;
Solar start = fromYmd(1582, 10, 15);
int y = year;
int m = month;
int d = day;
Solar current = fromYmd(y, m, d);
// 蔡勒公式
if (m < 3) {
m += 12;
y--;
}
int c = y / 100;
y = y - c * 100;
int x = y + y / 4 + c / 4 - 2 * c;
int w;
if (current.isBefore(start)) {
w = (x + 13 * (m + 1) / 5 + d + 2) % 7;
} else {
w = (x + 26 * (m + 1) / 10 + d - 1) % 7;
}
return (w + 7) % 7;
}
/**
@@ -513,7 +522,7 @@ public class Solar {
* @return 农历
*/
public Lunar getLunar() {
return new Lunar(calendar.getTime());
return new Lunar(this);
}
/**
@@ -538,15 +547,6 @@ public class Solar {
return (int) (365.25 * (y + 4716)) + (int) (30.6001 * (m + 1)) + d + n - 1524.5;
}
/**
* 获取日历
*
* @return 日历
*/
public Calendar getCalendar() {
return calendar;
}
@Override
public String toString() {
return toYmd();
@@ -586,6 +586,163 @@ public class Solar {
return s.toString();
}
/**
* 阳历日期相减,获得相差天数
* @param solar 阳历
* @return 天数
*/
public int subtract(Solar solar) {
return SolarUtil.getDaysBetween(solar.getYear(), solar.getMonth(), solar.getDay(), year, month, day);
}
/**
* 阳历日期相减,获得相差分钟数
* @param solar 阳历
* @return 分钟数
*/
public int subtractMinute(Solar solar) {
int days = subtract(solar);
int cm = hour * 60 + minute;
int sm = solar.getHour() * 60 + solar.getMinute();
int m = cm - sm;
if (m < 0) {
m += 1440;
days--;
}
m += days * 1440;
return m;
}
/**
* 是否在指定日期之后
* @param solar 阳历
* @return true/false
*/
public boolean isAfter(Solar solar) {
if (year > solar.getYear()) {
return true;
}
if (year < solar.getYear()) {
return false;
}
if (month > solar.getMonth()) {
return true;
}
if (month < solar.getMonth()) {
return false;
}
if (day > solar.getDay()) {
return true;
}
if (day < solar.getDay()) {
return false;
}
if (hour > solar.getHour()) {
return true;
}
if (hour < solar.getHour()) {
return false;
}
if (minute > solar.getMinute()) {
return true;
}
if (minute < solar.getMinute()) {
return false;
}
return second > solar.getSecond();
}
/**
* 是否在指定日期之前
* @param solar 阳历
* @return true/false
*/
public boolean isBefore(Solar solar) {
if (year > solar.getYear()) {
return false;
}
if (year < solar.getYear()) {
return true;
}
if (month > solar.getMonth()) {
return false;
}
if (month < solar.getMonth()) {
return true;
}
if (day > solar.getDay()) {
return false;
}
if (day < solar.getDay()) {
return true;
}
if (hour > solar.getHour()) {
return false;
}
if (hour < solar.getHour()) {
return true;
}
if (minute > solar.getMinute()) {
return false;
}
if (minute < solar.getMinute()) {
return true;
}
return second < solar.getSecond();
}
/**
* 年推移
* @param years 年数
* @return 阳历
*/
public Solar nextYear(int years) {
int y = year + years;
int m = month;
int d = day;
// 2月处理
if (2 == m) {
if (d > 28) {
if (!SolarUtil.isLeapYear(y)) {
d = 28;
}
}
}
if (1582 == y && 10 == m) {
if (d > 4 && d < 15) {
d += 10;
}
}
return fromYmdHms(y, m, d, hour, minute, second);
}
/**
* 月推移
* @param months 月数
* @return 阳历
*/
public Solar nextMonth(int months) {
SolarMonth month = SolarMonth.fromYm(year, this.month);
month = month.next(months);
int y = month.getYear();
int m = month.getMonth();
int d = day;
// 2月处理
if (2 == m) {
if (d > 28) {
if (!SolarUtil.isLeapYear(y)) {
d = 28;
}
}
}
if (1582 == y && 10 == m) {
if (d > 4 && d < 15) {
d += 10;
}
}
return fromYmdHms(y, m, d, hour, minute, second);
}
/**
* 获取往后推几天的阳历日期,如果要往前推,则天数用负数
*
@@ -593,7 +750,43 @@ public class Solar {
* @return 阳历日期
*/
public Solar next(int days) {
return next(days, false);
int y = year;
int m = month;
int d = day;
if (1582 == y && 10 == m) {
if (d > 4) {
d -= 10;
}
}
if (days > 0) {
d += days;
int daysInMonth = SolarUtil.getDaysOfMonth(y, m);
while (d > daysInMonth) {
d -= daysInMonth;
m++;
if (m > 12) {
m = 1;
y++;
}
daysInMonth = SolarUtil.getDaysOfMonth(y, m);
}
} else if (days < 0) {
while (d + days <= 0) {
m--;
if (m < 1) {
m = 12;
y--;
}
d += SolarUtil.getDaysOfMonth(y, m);
}
d += days;
}
if (1582 == y && 10 == m) {
if (d > 4 ) {
d += 10;
}
}
return fromYmdHms(y, m, d, hour, minute, second);
}
/**
@@ -604,32 +797,50 @@ public class Solar {
* @return 阳历日期
*/
public Solar next(int days, boolean onlyWorkday) {
Calendar c = ExactDate.fromYmdHms(year, month, day, hour, minute, second);
if (0 != days) {
if (!onlyWorkday) {
c.add(Calendar.DATE, days);
} else {
int rest = Math.abs(days);
int add = days < 1 ? -1 : 1;
while (rest > 0) {
c.add(Calendar.DATE, add);
boolean work = true;
Holiday holiday = HolidayUtil.getHoliday(c.get(Calendar.YEAR), c.get(Calendar.MONTH) + 1, c.get(Calendar.DAY_OF_MONTH));
if (null == holiday) {
int week = c.get(Calendar.DAY_OF_WEEK);
if (1 == week || 7 == week) {
work = false;
}
} else {
work = holiday.isWork();
}
if (work) {
rest--;
if(!onlyWorkday) {
return next(days);
}
Solar solar = fromYmdHms(year, month, day, hour, minute, second);
if (days != 0) {
int rest = Math.abs(days);
int add = days < 1 ? -1 : 1;
while (rest > 0) {
solar = solar.next(add);
boolean work = true;
Holiday holiday = HolidayUtil.getHoliday(solar.getYear(), solar.getMonth(), solar.getDay());
if (null == holiday) {
int week = solar.getWeek();
if (0 == week || 6 == week) {
work = false;
}
} else {
work = holiday.isWork();
}
if (work) {
rest -= 1;
}
}
}
return new Solar(c);
return solar;
}
/**
* 小时推移
* @param hours 小时数
* @return 阳历
*/
public Solar nextHour(int hours) {
int h = hour + hours;
int n = h < 0 ? -1 : 1;
int hour = Math.abs(h);
int days = hour / 24 * n;
hour = (hour % 24) * n;
if (hour < 0) {
hour += 24;
days--;
}
Solar solar = next(days);
return fromYmdHms(solar.getYear(), solar.getMonth(), solar.getDay(), hour, solar.getMinute(), solar.getSecond());
}
}

View File

@@ -36,14 +36,15 @@ public class SolarHalfYear {
* 通过日期初始化
*/
public SolarHalfYear(Date date) {
Calendar c = ExactDate.fromDate(date);
year = c.get(Calendar.YEAR);
month = c.get(Calendar.MONTH) + 1;
Solar solar = Solar.fromDate(date);
year = solar.getYear();
month = solar.getMonth();
}
/**
* 通过日历初始化
*/
@Deprecated
public SolarHalfYear(Calendar calendar) {
year = calendar.get(Calendar.YEAR);
month = calendar.get(Calendar.MONTH) + 1;
@@ -76,6 +77,7 @@ public class SolarHalfYear {
* @param calendar 日历
* @return 阳历半年
*/
@Deprecated
public static SolarHalfYear fromCalendar(Calendar calendar) {
return new SolarHalfYear(calendar);
}
@@ -125,12 +127,8 @@ public class SolarHalfYear {
* @return 推移后的半年
*/
public SolarHalfYear next(int halfYears) {
if (0 == halfYears) {
return new SolarHalfYear(year, month);
}
Calendar c = ExactDate.fromYmd(year, month, 1);
c.add(Calendar.MONTH, MONTH_COUNT * halfYears);
return new SolarHalfYear(c);
SolarMonth m = SolarMonth.fromYm(year, month).next(MONTH_COUNT * halfYears);
return new SolarHalfYear(m.getYear(), m.getMonth());
}
/**

View File

@@ -33,14 +33,15 @@ public class SolarMonth {
* 通过日期初始化
*/
public SolarMonth(Date date) {
Calendar c = ExactDate.fromDate(date);
year = c.get(Calendar.YEAR);
month = c.get(Calendar.MONTH) + 1;
Solar solar = Solar.fromDate(date);
year = solar.getYear();
month = solar.getMonth();
}
/**
* 通过日历初始化
*/
@Deprecated
public SolarMonth(Calendar calendar) {
year = calendar.get(Calendar.YEAR);
month = calendar.get(Calendar.MONTH) + 1;
@@ -73,6 +74,7 @@ public class SolarMonth {
* @param calendar 日历
* @return 阳历月
*/
@Deprecated
public static SolarMonth fromCalendar(Calendar calendar) {
return new SolarMonth(calendar);
}
@@ -122,6 +124,25 @@ public class SolarMonth {
return l;
}
/**
* 获取本月的阳历周列表
* @param start 星期几作为一周的开始,1234560分别代表星期一至星期天
* @return 周列表
*/
public List<SolarWeek> getWeeks(int start) {
List<SolarWeek> l = new ArrayList<SolarWeek>();
SolarWeek week = SolarWeek.fromYmd(year, month, 1, start);
while (true) {
l.add(week);
week = week.next(1, false);
Solar firstDay = week.getFirstDay();
if (firstDay.getYear() > year || firstDay.getMonth() > month) {
break;
}
}
return l;
}
/**
* 获取往后推几个月的阳历月,如果要往前推,则月数用负数
*
@@ -129,9 +150,18 @@ public class SolarMonth {
* @return 阳历月
*/
public SolarMonth next(int months) {
Calendar c = ExactDate.fromYmd(year, month, 1);
c.add(Calendar.MONTH, months);
return new SolarMonth(c);
int n = months < 0 ? -1 : 1;
int m = Math.abs(months);
int y = year + m / 12 * n;
m = month + m % 12 * n;
if (m > 12) {
m -= 12;
y++;
} else if (m < 1) {
m += 12;
y--;
}
return new SolarMonth(y, m);
}
@Override

View File

@@ -37,14 +37,15 @@ public class SolarSeason {
* 通过日期初始化
*/
public SolarSeason(Date date) {
Calendar c = ExactDate.fromDate(date);
year = c.get(Calendar.YEAR);
month = c.get(Calendar.MONTH) + 1;
Solar solar = Solar.fromDate(date);
year = solar.getYear();
month = solar.getMonth();
}
/**
* 通过日历初始化
*/
@Deprecated
public SolarSeason(Calendar calendar) {
year = calendar.get(Calendar.YEAR);
month = calendar.get(Calendar.MONTH) + 1;
@@ -77,6 +78,7 @@ public class SolarSeason {
* @param calendar 日历
* @return 阳历季度
*/
@Deprecated
public static SolarSeason fromCalendar(Calendar calendar) {
return new SolarSeason(calendar);
}
@@ -126,12 +128,8 @@ public class SolarSeason {
* @return 推移后的季度
*/
public SolarSeason next(int seasons) {
if (0 == seasons) {
return new SolarSeason(year, month);
}
Calendar c = ExactDate.fromYmd(year, month, 1);
c.add(Calendar.MONTH, MONTH_COUNT * seasons);
return new SolarSeason(c);
SolarMonth m = SolarMonth.fromYm(year, month).next(MONTH_COUNT * seasons);
return new SolarSeason(m.getYear(), m.getMonth());
}
/**

View File

@@ -48,10 +48,10 @@ public class SolarWeek {
* @param start 星期几作为一周的开始,1234560分别代表星期一至星期天
*/
public SolarWeek(Date date, int start) {
Calendar c = ExactDate.fromDate(date);
year = c.get(Calendar.YEAR);
month = c.get(Calendar.MONTH) + 1;
day = c.get(Calendar.DATE);
Solar solar = Solar.fromDate(date);
year = solar.getYear();
month = solar.getMonth();
day = solar.getDay();
this.start = start;
}
@@ -60,6 +60,7 @@ public class SolarWeek {
*
* @param start 星期几作为一周的开始,1234560分别代表星期一至星期天
*/
@Deprecated
public SolarWeek(Calendar calendar, int start) {
year = calendar.get(Calendar.YEAR);
month = calendar.get(Calendar.MONTH) + 1;
@@ -100,6 +101,7 @@ public class SolarWeek {
* @param start 星期几作为一周的开始,1234560分别代表星期一至星期天
* @return 阳历周
*/
@Deprecated
public static SolarWeek fromCalendar(Calendar calendar, int start) {
return new SolarWeek(calendar, start);
}
@@ -159,9 +161,7 @@ public class SolarWeek {
* @return 周序号,从1开始
*/
public int getIndex() {
Calendar c = ExactDate.fromYmd(year, month, 1);
int firstDayWeek = c.get(Calendar.DAY_OF_WEEK) - 1;
int offset = firstDayWeek - start;
int offset = Solar.fromYmd(year, month, 1).getWeek() - start;
if(offset < 0) {
offset += 7;
}
@@ -174,9 +174,7 @@ public class SolarWeek {
* @return 周序号,从1开始
*/
public int getIndexInYear() {
Calendar c = ExactDate.fromYmd(year, 1, 1);
int firstDayWeek = c.get(Calendar.DAY_OF_WEEK) - 1;
int offset = firstDayWeek - start;
int offset = Solar.fromYmd(year, 1, 1).getWeek() - start;
if(offset < 0) {
offset += 7;
}
@@ -194,15 +192,15 @@ public class SolarWeek {
if (0 == weeks) {
return new SolarWeek(year, month, day, start);
}
Solar solar = Solar.fromYmd(year, month, day);
if (separateMonth) {
int n = weeks;
Calendar c = ExactDate.fromYmd(year, month, day);
SolarWeek week = new SolarWeek(c, start);
SolarWeek week = new SolarWeek(solar.getYear(), solar.getMonth(), solar.getDay(), start);
int month = this.month;
boolean plus = n > 0;
while (0 != n) {
c.add(Calendar.DATE, plus ? 7 : -7);
week = new SolarWeek(c, start);
solar = solar.next(plus ? 7 : -7);
week = new SolarWeek(solar.getYear(), solar.getMonth(), solar.getDay(), start);
int weekMonth = week.getMonth();
if (month != weekMonth) {
int index = week.getIndex();
@@ -212,8 +210,8 @@ public class SolarWeek {
week = new SolarWeek(firstDay.getYear(), firstDay.getMonth(), firstDay.getDay(), start);
weekMonth = week.getMonth();
} else {
c = ExactDate.fromYmd(week.getYear(), week.getMonth(), 1);
week = new SolarWeek(c, start);
solar = Solar.fromYmd(week.getYear(), week.getMonth(), 1);
week = new SolarWeek(solar.getYear(), solar.getMonth(), solar.getDay(), start);
}
} else {
int size = SolarUtil.getWeeksOfMonth(week.getYear(), week.getMonth(), start);
@@ -223,8 +221,8 @@ public class SolarWeek {
week = new SolarWeek(lastDay.getYear(), lastDay.getMonth(), lastDay.getDay(), start);
weekMonth = week.getMonth();
} else {
c = ExactDate.fromYmd(week.getYear(), week.getMonth(), SolarUtil.getDaysOfMonth(week.getYear(), week.getMonth()));
week = new SolarWeek(c, start);
solar = Solar.fromYmd(week.getYear(), week.getMonth(), SolarUtil.getDaysOfMonth(week.getYear(), week.getMonth()));
week = new SolarWeek(solar.getYear(), solar.getMonth(), solar.getDay(), start);
}
}
month = weekMonth;
@@ -233,9 +231,8 @@ public class SolarWeek {
}
return week;
} else {
Calendar c = ExactDate.fromYmd(year, month, day);
c.add(Calendar.DATE, weeks * 7);
return new SolarWeek(c, start);
solar = solar.next(weeks * 7);
return new SolarWeek(solar.getYear(), solar.getMonth(), solar.getDay(), start);
}
}
@@ -245,14 +242,12 @@ public class SolarWeek {
* @return 本周第一天的阳历日期
*/
public Solar getFirstDay() {
Calendar c = ExactDate.fromYmd(year, month, day);
int week = c.get(Calendar.DAY_OF_WEEK) - 1;
int prev = week - start;
Solar solar = Solar.fromYmd(year, month, day);
int prev = solar.getWeek() - start;
if (prev < 0) {
prev += 7;
}
c.add(Calendar.DATE, -prev);
return new Solar(c);
return solar.next(-prev);
}
/**

View File

@@ -32,13 +32,13 @@ public class SolarYear {
* 通过日期初始化
*/
public SolarYear(Date date) {
Calendar c = ExactDate.fromDate(date);
year = c.get(Calendar.YEAR);
year = Solar.fromDate(date).getYear();
}
/**
* 通过日历初始化
*/
@Deprecated
public SolarYear(Calendar calendar) {
year = calendar.get(Calendar.YEAR);
}
@@ -68,6 +68,7 @@ public class SolarYear {
* @param calendar 日历
* @return 阳历年
*/
@Deprecated
public static SolarYear fromCalendar(Calendar calendar) {
return new SolarYear(calendar);
}
@@ -113,9 +114,7 @@ public class SolarYear {
* @return 阳历年
*/
public SolarYear next(int years) {
Calendar c = ExactDate.fromYmd(year, 1, 1);
c.add(Calendar.YEAR, years);
return new SolarYear(c);
return new SolarYear(year + years);
}
@Override

View File

@@ -1,10 +1,11 @@
package com.nlf.calendar.eightchar;
import com.nlf.calendar.*;
import com.nlf.calendar.EightChar;
import com.nlf.calendar.JieQi;
import com.nlf.calendar.Lunar;
import com.nlf.calendar.Solar;
import com.nlf.calendar.util.LunarUtil;
import java.util.Calendar;
/**
* 运
*
@@ -89,7 +90,7 @@ public class Yun {
int hour = 0;
if (2 == sect) {
long minutes = (end.getCalendar().getTimeInMillis() - start.getCalendar().getTimeInMillis()) / 60000;
long minutes = end.subtractMinute(start);
long y = minutes / 4320;
minutes -= y * 4320;
long m = minutes / 360;
@@ -107,7 +108,7 @@ public class Yun {
// 时辰差
int hourDiff = endTimeZhiIndex - startTimeZhiIndex;
// 天数差
int dayDiff = ExactDate.getDaysBetween(start.getYear(), start.getMonth(), start.getDay(), end.getYear(), end.getMonth(), end.getDay());
int dayDiff = end.subtract(start);
if (hourDiff < 0) {
hourDiff += 12;
dayDiff--;
@@ -188,13 +189,11 @@ public class Yun {
* @return 阳历日期
*/
public Solar getStartSolar() {
Solar birth = lunar.getSolar();
Calendar c = ExactDate.fromYmdHms(birth.getYear(), birth.getMonth(), birth.getDay(), birth.getHour(), birth.getMinute(), birth.getSecond());
c.add(Calendar.YEAR, startYear);
c.add(Calendar.MONTH, startMonth);
c.add(Calendar.DATE, startDay);
c.add(Calendar.HOUR, startHour);
return Solar.fromCalendar(c);
Solar solar = lunar.getSolar();
solar = solar.nextYear(startYear);
solar = solar.nextMonth(startMonth);
solar = solar.next(startDay);
return solar.nextHour(startHour);
}
/**

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
package com.nlf.calendar.util;
import com.nlf.calendar.ExactDate;
import com.nlf.calendar.Solar;
import java.util.*;
@@ -157,6 +157,9 @@ public class SolarUtil {
* @return 天数
*/
public static int getDaysOfYear(int year) {
if (1582 == year) {
return 355;
}
return isLeapYear(year) ? 366 : 365;
}
@@ -193,10 +196,15 @@ public class SolarUtil {
for (int i = 1; i < month; i++) {
days += getDaysOfMonth(year, i);
}
days += day;
if (1582 == year && 10 == month && day >= 15) {
days -= 10;
int d = day;
if (1582 == year && 10 == month) {
if (day >= 15) {
d -= 10;
} else if (day > 4) {
throw new IllegalArgumentException(String.format("wrong solar year %d month %d day %d", year, month, day));
}
}
days += d;
return days;
}
@@ -209,8 +217,42 @@ public class SolarUtil {
* @return 周数
*/
public static int getWeeksOfMonth(int year, int month, int start) {
int days = getDaysOfMonth(year, month);
int week = ExactDate.fromYmd(year, month, 1).get(Calendar.DAY_OF_WEEK) - 1;
return (int) Math.ceil((days + week - start) * 1D / WEEK.length);
return (int) Math.ceil((getDaysOfMonth(year, month) + Solar.fromYmd(year, month, 1).getWeek() - start) * 1D / WEEK.length);
}
/**
* 获取两个日期之间相差的天数(如果日期a比日期b小,天数为正,如果日期a比日期b大,天数为负)
*
* @param ay 年a
* @param am 月a
* @param ad 日a
* @param by 年b
* @param bm 月b
* @param bd 日b
* @return 天数
*/
public static int getDaysBetween(int ay, int am, int ad, int by, int bm, int bd) {
int n;
int days;
int i;
if (ay == by) {
n = getDaysInYear(by, bm, bd) - getDaysInYear(ay, am, ad);
} else if (ay > by) {
days = getDaysOfYear(by) - getDaysInYear(by, bm, bd);
for (i = by + 1; i < ay; i++) {
days += getDaysOfYear(i);
}
days += getDaysInYear(ay, am, ad);
n = -days;
} else {
days = getDaysOfYear(ay) - getDaysInYear(ay, am, ad);
for (i = ay + 1; i < by; i++) {
days += getDaysOfYear(i);
}
days += getDaysInYear(by, bm, bd);
n = days;
}
return n;
}
}

View File

@@ -6,6 +6,7 @@ import com.nlf.calendar.Solar;
import org.junit.Assert;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
/**
@@ -250,12 +251,71 @@ public class BaZiTest {
@Test
public void testBaZi2Solar() {
Solar solar = Solar.fromYmdHms(2027,1,27,12,0,0);
System.out.println(solar.getLunar().getEightChar().toString());
List<Solar> l = Solar.fromBaZi("丙午","辛丑","丙午","甲午");
for(Solar s:l){
System.out.println(s.toFullString());
List<Solar> l = Solar.fromBaZi("丙辰","丁酉","丙子","甲午");
List<String> actual = new ArrayList<String>();
for (Solar solar : l) {
actual.add(solar.toYmdHms());
}
List<String> expected = new ArrayList<String>();
expected.add("1976-09-21 12:00:00");
expected.add("1916-10-06 12:00:00");
Assert.assertEquals(expected, actual);
}
@Test
public void testBaZi2Solar1() {
List<Solar> l = Solar.fromBaZi("壬寅","庚戌","己未","乙亥");
List<String> actual = new ArrayList<String>();
for (Solar solar : l) {
actual.add(solar.toYmdHms());
}
List<String> expected = new ArrayList<String>();
expected.add("2022-11-02 22:00:00");
Assert.assertEquals(expected, actual);
}
@Test
public void testBaZi2Solar2() {
List<Solar> l = Solar.fromBaZi("己卯","辛未","甲戌","壬申");
List<String> actual = new ArrayList<String>();
for (Solar solar : l) {
actual.add(solar.toYmdHms());
}
List<String> expected = new ArrayList<String>();
expected.add("1999-07-21 16:00:00");
expected.add("1939-08-05 16:00:00");
Assert.assertEquals(expected, actual);
}
@Test
public void testBaZi2Solar3() {
List<Solar> l = Solar.fromBaZi("庚子","戊子","己卯","庚午");
List<String> actual = new ArrayList<String>();
for (Solar solar : l) {
actual.add(solar.toYmdHms());
}
List<String> expected = new ArrayList<String>();
expected.add("1960-12-17 12:00:00");
expected.add("1901-01-01 12:00:00");
Assert.assertEquals(expected, actual);
}
@Test
public void testBaZi2Solar4() {
List<Solar> l = Solar.fromBaZi("庚子","癸未","乙丑","丁亥");
List<String> actual = new ArrayList<String>();
for (Solar solar : l) {
actual.add(solar.toYmdHms());
}
List<String> expected = new ArrayList<String>();
expected.add("2020-07-21 22:00:00");
expected.add("1960-08-05 22:00:00");
Assert.assertEquals(expected, actual);
}
@Test
@@ -276,4 +336,33 @@ public class BaZiTest {
Assert.assertEquals("1990-04-15", lunar.getEightChar().getYun(1).getStartSolar().toYmd());
}
@Test
public void test10(){
Lunar lunar = Solar.fromYmdHms(1988, 2, 15, 23, 30, 0).getLunar();
EightChar eightChar = lunar.getEightChar();
Assert.assertEquals("年柱", "戊辰", eightChar.getYear());
Assert.assertEquals("月柱", "甲寅", eightChar.getMonth());
Assert.assertEquals("日柱", "庚子", eightChar.getDay());
Assert.assertEquals("时柱", "戊子", eightChar.getTime());
}
@Test
public void test11(){
Lunar lunar = Lunar.fromYmdHms(1987, 12, 28, 23, 30, 0);
EightChar eightChar = lunar.getEightChar();
Assert.assertEquals("年柱", "戊辰", eightChar.getYear());
Assert.assertEquals("月柱", "甲寅", eightChar.getMonth());
Assert.assertEquals("日柱", "庚子", eightChar.getDay());
Assert.assertEquals("时柱", "戊子", eightChar.getTime());
}
@Test
public void test13(){
Lunar lunar = Lunar.fromYmdHms(1991, 4, 5, 3, 37, 0);
EightChar eightChar = lunar.getEightChar();
Assert.assertEquals("年柱", "辛未", eightChar.getYear());
Assert.assertEquals("月柱", "癸巳", eightChar.getMonth());
Assert.assertEquals("日柱", "戊子", eightChar.getDay());
Assert.assertEquals("时柱", "甲寅", eightChar.getTime());
}
}

View File

@@ -94,8 +94,11 @@ public class HolidayTest {
Assert.assertEquals("2020-01-01 春节 2020-01-01", HolidayUtil.getHoliday("2020-01-01") + "");
Assert.assertEquals("2099-01-01 元旦节 2099-01-01", HolidayUtil.getHoliday("2099-01-01") + "");
// 更改节假日名称
String[] names = HolidayUtil.NAMES;
// 自定义节假日名称
String[] names = new String[HolidayUtil.NAMES.length];
for (int i = 0, j = HolidayUtil.NAMES.length; i < j; i++) {
names[i] = HolidayUtil.NAMES[i];
}
names[0] = "元旦";
names[1] = "大年初一";
@@ -125,4 +128,17 @@ public class HolidayTest {
Assert.assertNotNull(holiday.getTarget());
Assert.assertEquals("2016-10-01",holiday.getTarget());
}
@Test
public void testRemove() {
// 设置默认的节假日名称
HolidayUtil.fix(HolidayUtil.NAMES, null);
Holiday holiday = HolidayUtil.getHoliday(2010,1,1);
Assert.assertNotNull(holiday);
Assert.assertEquals("元旦节",holiday.getName());
HolidayUtil.fix("20100101~000000000000000000000000000");
holiday = HolidayUtil.getHoliday(2010,1,1);
Assert.assertNull(holiday);
}
}

View File

@@ -183,7 +183,7 @@ public class JieQiTest {
@Test
public void test8() {
Lunar lunar = Lunar.fromYmd(2050, 12, 1);
Assert.assertEquals("2050-12-07 06:41:00", lunar.getJieQiTable().get("大雪").toYmdHms());
Assert.assertEquals("2050-12-07 06:41:00", lunar.getJieQiTable().get("DA_XUE").toYmdHms());
}
@Test

View File

@@ -161,18 +161,6 @@ public class LunarTest {
Assert.assertEquals("2033-12-22", lunar.getSolar().toYmd());
}
@Test
public void test23() {
Lunar lunar = Lunar.fromYmd(2022, 1, 1);
Assert.assertEquals("六白金开阳", lunar.getYearNineStar().toString());
}
@Test
public void test24() {
Lunar lunar = Lunar.fromYmd(2033, 1, 1);
Assert.assertEquals("四绿木天权", lunar.getYearNineStar().toString());
}
@Test
public void test25() {
Solar solar = new Solar(2021, 6, 7, 21, 18, 0);
@@ -459,4 +447,16 @@ public class LunarTest {
Assert.assertEquals("秋社", lunar.getOtherFestivals().get(0));
}
@Test
public void test62() {
Lunar lunar = Lunar.fromYmd(1582, 9, 18);
Assert.assertEquals("1582-10-04", lunar.getSolar().toString());
}
@Test
public void test63() {
Lunar lunar = Lunar.fromYmd(1582, 9, 19);
Assert.assertEquals("1582-10-15", lunar.getSolar().toString());
}
}

View File

@@ -0,0 +1,26 @@
package test;
import com.nlf.calendar.Lunar;
import com.nlf.calendar.Solar;
import org.junit.Assert;
import org.junit.Test;
public class NineStarTest {
@Test
public void test1() {
Lunar lunar = Solar.fromYmd(1985, 2, 19).getLunar();
Assert.assertEquals("六", lunar.getYearNineStar().getNumber());
}
@Test
public void test2() {
Lunar lunar = Lunar.fromYmd(2022, 1, 1);
Assert.assertEquals("六白金开阳", lunar.getYearNineStar().toString());
}
@Test
public void test3() {
Lunar lunar = Lunar.fromYmd(2033, 1, 1);
Assert.assertEquals("四绿木天权", lunar.getYearNineStar().toString());
}
}

View File

@@ -1,5 +1,6 @@
package test;
import com.nlf.calendar.Lunar;
import com.nlf.calendar.Solar;
import com.nlf.calendar.util.SolarUtil;
import org.junit.Assert;
@@ -79,4 +80,95 @@ public class SolarTest {
Assert.assertEquals("全国中小学生安全教育日",solar.getFestivals().get(0));
}
@Test
public void test12(){
Solar solar = new Solar(2022, 1, 1);
Assert.assertEquals("2022-01-02", solar.next(1).toYmd());
}
@Test
public void test13(){
Solar solar = new Solar(2022, 1, 31);
Assert.assertEquals("2022-02-01", solar.next(1).toYmd());
}
@Test
public void test14(){
Solar solar = new Solar(2022, 1, 1);
Assert.assertEquals("2023-01-01", solar.next(365).toYmd());
}
@Test
public void test15(){
Solar solar = new Solar(2023, 1, 1);
Assert.assertEquals("2022-01-01", solar.next(-365).toYmd());
}
@Test
public void test16(){
Solar solar = new Solar(1582, 10, 4);
Assert.assertEquals("1582-10-15", solar.next(1).toYmd());
}
@Test
public void test17(){
Solar solar = new Solar(1582, 10, 4);
Assert.assertEquals("1582-11-01", solar.next(18).toYmd());
}
@Test
public void test18(){
Solar solar = new Solar(1582, 11, 1);
Assert.assertEquals("1582-10-04", solar.next(-18).toYmd());
}
@Test
public void test19(){
Solar solar = new Solar(1582, 11, 1);
Assert.assertEquals("1582-10-15", solar.next(-17).toYmd());
}
@Test
public void test20(){
int days = SolarUtil.getDaysBetween(1582, 10, 4, 1582, 10, 15);
Assert.assertEquals(1, days);
}
@Test
public void test21(){
int days = SolarUtil.getDaysBetween(1582, 10, 4, 1582, 11, 1);
Assert.assertEquals(18, days);
}
@Test
public void test22(){
int days = SolarUtil.getDaysBetween(1582, 1, 1, 1583, 1, 1);
Assert.assertEquals(355, days);
}
@Test
public void test23(){
Solar solar = Solar.fromYmd(1991, 5, 12);
Lunar lunar = solar.getLunar();
Assert.assertEquals("壬午", lunar.getDayInGanZhi());
}
@Test
public void test24(){
Solar solar = new Solar(1582, 10, 15);
Assert.assertEquals("1582-09-30", solar.next(-5).toYmd());
}
@Test
public void test25(){
Solar solar = new Solar(1582, 10, 15);
Assert.assertEquals("1582-10-04", solar.next(-1).toYmd());
}
@Test
public void test26(){
Solar solar = new Solar(1582, 10, 15);
Assert.assertEquals("1582-09-29", solar.next(-6).toYmd());
}
}

View File

@@ -136,7 +136,7 @@ public class TimeTest {
put("2020-4,5,","丙");
put("2020-4,5,23:01:01","戊");
put("2020-4,5,其他","丙");
put("2020-4,5,80:90","丙");
put("2020-4,5,0:90","丙");
put("2020-4,5,21:01:01","丁");
@@ -204,7 +204,7 @@ public class TimeTest {
put("2020-4,5,","丙子");
put("2020-4,5,23:01:01","戊子");
put("2020-4,5,其他","丙子");
put("2020-4,5,80:90","丙子");
put("2020-4,5,0:90","丙子");
put("2020-4,5,20:21:01","丙戌");
put("2020-4,5,21:01:01","丁亥");

View File

@@ -1,5 +1,6 @@
package test;
import com.nlf.calendar.Solar;
import com.nlf.calendar.SolarWeek;
import com.nlf.calendar.util.SolarUtil;
import org.junit.Assert;
@@ -41,4 +42,16 @@ public class WeekTest {
//当周第一天(本月)
Assert.assertEquals("2019-05-01",week.getFirstDayInMonth().toString());
}
@Test
public void test1(){
Solar solar = Solar.fromYmd(1582, 10, 1);
Assert.assertEquals(1, solar.getWeek());
}
@Test
public void test2(){
Solar solar = Solar.fromYmd(1582, 10, 15);
Assert.assertEquals(5, solar.getWeek());
}
}

View File

@@ -103,4 +103,18 @@ public class WuHouTest {
Assert.assertEquals(solar.toString(),"小寒 初候",lunar.getHou());
}
@Test
public void test15(){
Solar solar = new Solar(2022,8,22);
Lunar lunar = solar.getLunar();
Assert.assertEquals(solar.toString(),"寒蝉鸣",lunar.getWuHou());
}
@Test
public void test16(){
Solar solar = new Solar(2022,8,23);
Lunar lunar = solar.getLunar();
Assert.assertEquals(solar.toString(),"鹰乃祭鸟",lunar.getWuHou());
}
}