java代码实现输入年月日,输出距今天还有多少天,星期几,是否为公历节日。
时间: 2023-06-24 18:06:48 浏览: 164
以下是Java代码实现输入日期,输出距今天还有多少天,星期几,是否为公历节日的实现。
```java
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DateUtil {
// 公历节日
private static final String[] SOLAR_HOLIDAYS = {
"0101 元旦",
"0214 情人节",
"0308 妇女节",
"0312 植树节",
"0401 愚人节",
"0501 劳动节",
"0504 青年节",
"0601 儿童节",
"0701 建党节",
"0801 建军节",
"0910 教师节",
"1001 国庆节",
"1224 平安夜",
"1225 圣诞节"
};
// 农历节日
private static final String[] LUNAR_HOLIDAYS = {
"0101 春节",
"0115 元宵节",
"0505 端午节",
"0707 七夕节",
"0715 中元节",
"0815 中秋节",
"0909 重阳节",
"1208 腊八节",
"1224 小年",
"0100 除夕"
};
// 节气
private static final String[] SOLAR_TERMS = {
"立春", "雨水", "惊蛰", "春分",
"清明", "谷雨", "立夏", "小满",
"芒种", "夏至", "小暑", "立秋",
"处暑", "白露", "秋分", "寒露",
"霜降", "立冬", "小雪", "大雪",
"冬至", "小寒", "大寒"
};
/**
* 根据日期计算距离今天还有多少天
*
* @param dateStr 日期字符串,格式为 yyyy-MM-dd
* @return 距离今天还有多少天
*/
public static int daysFromNow(String dateStr) throws ParseException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = format.parse(dateStr);
Calendar calendar = Calendar.getInstance();
long timeDiff = calendar.getTimeInMillis() - date.getTime();
return (int) (timeDiff / (1000 * 3600 * 24));
}
/**
* 根据日期计算星期几
*
* @param dateStr 日期字符串,格式为 yyyy-MM-dd
* @return 星期几,如 "星期一"
*/
public static String getWeekday(String dateStr) throws ParseException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = format.parse(dateStr);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int weekday = calendar.get(Calendar.DAY_OF_WEEK);
String[] weekdays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
return weekdays[weekday - 1];
}
/**
* 判断是否为公历节日
*
* @param dateStr 日期字符串,格式为 yyyy-MM-dd
* @return 是否为公历节日
*/
public static boolean isSolarHoliday(String dateStr) {
String monthDay = dateStr.substring(5);
for (String solarHoliday : SOLAR_HOLIDAYS) {
if (solarHoliday.startsWith(monthDay)) {
return true;
}
}
return false;
}
/**
* 判断是否为农历节日
*
* @param lunarYear 农历年份
* @param lunarMonth 农历月份
* @param lunarDay 农历日期
* @return 是否为农历节日
*/
public static boolean isLunarHoliday(int lunarYear, int lunarMonth, int lunarDay) {
String lunarDate = LunarCalendar.toLunarDate(lunarYear, lunarMonth, lunarDay);
for (String lunarHoliday : LUNAR_HOLIDAYS) {
if (lunarHoliday.startsWith(lunarDate)) {
return true;
}
}
return false;
}
/**
* 判断是否为节气
*
* @param solarYear 公历年份
* @param solarMonth 公历月份
* @param solarDay 公历日期
* @return 节气名称,如果不是节气则返回 null
*/
public static String getSolarTerm(int solarYear, int solarMonth, int solarDay) {
int index = (solarMonth - 1) * 2 + (int) Math.floor((solarDay + 5) / 10.0) - 1;
if (solarYear == 1900 && index == 11) {
return "小寒";
}
if (solarYear == 2100 && index == 12) {
return "大寒";
}
if (solarYear == 2000 && index == 18) {
return "立春";
}
if (solarYear == 2000 && index == 19) {
return "雨水";
}
if (index < 0 || index >= 24) {
return null;
}
return SOLAR_TERMS[index];
}
public static void main(String[] args) throws ParseException {
String dateStr = "2022-10-01";
int days = daysFromNow(dateStr);
String weekday = getWeekday(dateStr);
boolean isSolarHoliday = isSolarHoliday(dateStr);
LunarCalendar lunarCalendar = LunarCalendar.fromSolarDate(dateStr);
boolean isLunarHoliday = isLunarHoliday(lunarCalendar.getLunarYear(), lunarCalendar.getLunarMonth(), lunarCalendar.getLunarDay());
String solarTerm = getSolarTerm(lunarCalendar.getSolarYear(), lunarCalendar.getSolarMonth(), lunarCalendar.getSolarDay());
System.out.println(dateStr + " 距离今天还有 " + days + " 天," + weekday);
if (isSolarHoliday) {
System.out.println("是公历节日");
}
if (isLunarHoliday) {
System.out.println("是农历节日");
}
if (solarTerm != null) {
System.out.println("是节气:" + solarTerm);
}
}
}
```
其中,`LunarCalendar` 类是一个农历日期的工具类,可以通过公历日期转换为农历日期。具体实现可以参考 [Java代码实现公历和农历相互转换](https://blog.csdn.net/u010926964/article/details/107468270)。
阅读全文