1
0
mirror of synced 2025-12-25 14:57:59 +08:00

支持0001到9999年。

This commit is contained in:
6tail
2021-04-11 21:09:37 +08:00
parent b0984c52f9
commit ecccdd6380
19 changed files with 1576 additions and 1006 deletions

View File

@@ -61,9 +61,11 @@ public class Solar{
* @param minute 分钟0到59
* @param second 秒钟0到59
*/
public Solar(int year,int month,int day,int hour,int minute,int second){
@SuppressWarnings("MagicConstant")
public Solar(int year, int month, int day, int hour, int minute, int second){
calendar = Calendar.getInstance();
calendar.set(year,month-1,day,hour,minute,second);
calendar.set(Calendar.MILLISECOND,0);
this.year = year;
this.month = month;
this.day = day;
@@ -80,6 +82,7 @@ public class Solar{
public Solar(Date date){
calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.MILLISECOND,0);
year = calendar.get(Calendar.YEAR);
month = calendar.get(Calendar.MONTH)+1;
day = calendar.get(Calendar.DATE);
@@ -94,6 +97,7 @@ public class Solar{
* @param calendar 日历
*/
public Solar(Calendar calendar){
calendar.set(Calendar.MILLISECOND,0);
this.calendar = calendar;
year = calendar.get(Calendar.YEAR);
month = calendar.get(Calendar.MONTH)+1;
@@ -107,6 +111,7 @@ public class Solar{
* 通过儒略日初始化
* @param julianDay 儒略日
*/
@SuppressWarnings("MagicConstant")
public Solar(double julianDay){
int d = (int)(julianDay + 0.5);
double f = julianDay + 0.5 - d;
@@ -142,6 +147,7 @@ public class Solar{
calendar = Calendar.getInstance();
calendar.set(year,month-1,day,hour,minute,second);
calendar.set(Calendar.MILLISECOND,0);
this.year = year;
this.month = month;
this.day = day;
@@ -208,7 +214,7 @@ public class Solar{
}
/**
* 通过八字获取阳历列表(晚子时日柱按当天)
* 通过八字获取阳历列表(晚子时日柱按当天起始年为1900
* @param yearGanZhi 年柱
* @param monthGanZhi 月柱
* @param dayGanZhi 日柱
@@ -220,7 +226,7 @@ public class Solar{
}
/**
* 通过八字获取阳历列表
* 通过八字获取阳历列表起始年为1900
* @param yearGanZhi 年柱
* @param monthGanZhi 月柱
* @param dayGanZhi 日柱
@@ -229,6 +235,20 @@ public class Solar{
* @return 符合的阳历列表
*/
public static List<Solar> fromBaZi(String yearGanZhi,String monthGanZhi,String dayGanZhi,String timeGanZhi,int sect){
return fromBaZi(yearGanZhi,monthGanZhi,dayGanZhi,timeGanZhi,sect,1900);
}
/**
* 通过八字获取阳历列表
* @param yearGanZhi 年柱
* @param monthGanZhi 月柱
* @param dayGanZhi 日柱
* @param timeGanZhi 时柱
* @param sect 流派2晚子时日柱按当天1晚子时日柱按明天
* @param baseYear 起始年
* @return 符合的阳历列表
*/
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();
@@ -245,18 +265,15 @@ public class Solar{
hour = (i-1)*2;
}
}
while(startYear>=SolarUtil.BASE_YEAR-1){
while(startYear>=baseYear){
int year = startYear-1;
int counter = 0;
int month = 12;
int day;
boolean found = false;
while (counter < 15) {
if(year>=SolarUtil.BASE_YEAR){
if(year>=baseYear){
day = 1;
if(year==SolarUtil.BASE_YEAR&&month==SolarUtil.BASE_MONTH){
day = SolarUtil.BASE_DAY;
}
Solar solar = new Solar(year, month, day, hour, 0, 0);
lunar = solar.getLunar();
if(lunar.getYearInGanZhiExact().equals(yearGanZhi) && lunar.getMonthInGanZhiExact().equals(monthGanZhi)){
@@ -279,9 +296,6 @@ public class Solar{
year--;
}
day = 1;
if(year==SolarUtil.BASE_YEAR&&month==SolarUtil.BASE_MONTH){
day = SolarUtil.BASE_DAY;
}
Solar solar = new Solar(year, month, day, hour, 0, 0);
while (counter < 61) {
lunar = solar.getLunar();
@@ -508,11 +522,11 @@ public class Solar{
}
public String toYmd(){
return year+"-"+(month<10?"0":"")+month+"-"+(day<10?"0":"")+day;
return String.format("%04d-%02d-%02d", year, month, day);
}
public String toYmdHms(){
return toYmd()+" "+(hour<10?"0":"")+hour+":"+(minute<10?"0":"")+minute+":"+(second<10?"0":"")+second;
return toYmd()+" "+String.format("%02d:%02d:%02d", hour, minute, second);
}
public String toFullString(){
@@ -550,9 +564,17 @@ public class Solar{
return next(days,false);
}
/**
* 取往后推几天的阳历日期,如果要往前推,则天数用负数
* @param days 天数
* @param onlyWorkday 是否仅限工作日
* @return 阳历日期
*/
@SuppressWarnings("MagicConstant")
public Solar next(int days, boolean onlyWorkday){
Calendar c = Calendar.getInstance();
c.set(year,month-1,day,hour,minute,second);
c.set(Calendar.MILLISECOND,0);
if(0!=days) {
if(!onlyWorkday){
c.add(Calendar.DATE,days);