一、需求(提供一个日期字符串(YYYY-MM-DD)返回日历信息,并且提供周日与周一选项是否放置在第一位选项)
二、功能效果图
三、功能分析
1、日期的第一天是星期几?
2、日期月份的最大天数是多少?
3、如1号前面有空位,要进行补位
4、如周六或周日在最末尾,要进行换行
四、功能代码
1、测试类
public class CalendarTest {
public static void main(String[] args) {
// 输入日期
LocalDate localDate = null;
do {
// 打印部分
out.print(String.format("请输入日期格式(%s),日历以星期日开始,输入的天数打*标识 :", LocalDateUtils.get()));
// 输入部分
Scanner scanner = new Scanner(System.in);
String ymd = scanner.next();
// 验证部分
localDate = LocalDateUtils.transform(ymd);
if (null != localDate) {
// 打印日历
out.println(String.format("%s的日历如下所示!", LocalDateUtils.getYM(localDate)));
out.println("一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一");
out.println(Calendars.get(false, localDate));
out.println("一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一");
//
} else {
err.println("您好,日期输入有误,请重新输入!");
}
} while (localDate == null);
}
}
2、日期工具类
public class LocalDateUtils {
public static final DateTimeFormatter DATE_FOR_YYYY_MM_DD =
DateTimeFormatter.ofPattern("yyyy-MM-dd");
public static final DateTimeFormatter DATE_FOR_YYYY_MM = DateTimeFormatter.ofPattern("yyyy年MM月");
private static final int FIRST_DAY = 1;
public static LocalDate parseLocalDate(String dateStr) {
return LocalDate.parse(dateStr, DATE_FOR_YYYY_MM_DD);
}
public static String getYM(LocalDate date) {
return date.format(DATE_FOR_YYYY_MM);
}
public static LocalDate get() {
return LocalDate.now();
}
/**
* @param localDate
* @return 返回指定日期的当月第一天,如2020-12-28,返回为2020-12-01
*/
public static LocalDate getDayOfMonth(LocalDate localDate) {
return setDayOfMonth(localDate, FIRST_DAY);
}
public static LocalDate setDayOfMonth(LocalDate localDate, int day) {
return localDate.withDayOfMonth(day);
}
public static LocalDate transform(String ymd) {
LocalDate localDate = null;
try {
localDate = LocalDateUtils.parseLocalDate(ymd);
} catch (Exception ex) {
//
}
return localDate;
}
/**
* @param localDate
* @return 返回指定日期是星期几,如星期一返回1,星期二返回2,...星期日返回7
*/
public static int getDayOfWeek(LocalDate localDate) {
return localDate.getDayOfWeek().getValue();
}
/**
* @param localDate
* @return 返回指定日期中的月份最后的号数,如2020-12-28,这个月最后号数为:31,如2020-02-02,这个月最后号数为:29
*/
public static int getLengthOfMonth(LocalDate localDate) {
return localDate.lengthOfMonth();
}
}
3、日历类
public class Calendars {
private static final String TABS = "\t\t\t";
private static final String TWO_TAB = "\t\t";
private static final String WRAP = "\n";
private static final String WEEK_HEAD = "一\t\t\t二\t\t\t三\t\t\t四\t\t\t五\t\t\t六";
private static final String SUNDAY = "日";
private static final String MARK = "*";
private static final int ONE = 1;
private static final int SEVEN = 7;
private static final int NINE = 9;
/**
* @param isFristOfSunDay true为星期日排第一位,false为星期一排第一位
* @return 返回日历的头部部分
*/
public static String head(boolean isFristOfSunDay) {
if (isFristOfSunDay) {
return SUNDAY + TABS + WEEK_HEAD + WRAP;
}
return WEEK_HEAD + TABS + SUNDAY + WRAP;
}
/**
* @param year 指定年份
* @param month 指定月份
* @return 返回以星期日开始的日历
*/
public static String get(int year, int month) {
LocalDate localDate = LocalDate.of(year, month, ONE);
return get(localDate);
}
/**
* @param localDate 指定日期
* @return 返回以星期日开始的日历
*/
public static String get(LocalDate localDate) {
return get(true, localDate);
}
/**
* @param isFristOfSunDay true为星期日排第一位,false为星期一排第一位
* @param localDate 指定日期
* @return 返回日历字符串
*/
public static String get(boolean isFristOfSunDay, LocalDate localDate) {
// 日历头部信息
StringBuilder calendarInfo = new StringBuilder();
calendarInfo.append(head(isFristOfSunDay));
calendarInfo.append(body(isFristOfSunDay, localDate));
return calendarInfo.toString();
}
/**
* @param localDate 指定日期
* @return 返回以星期日开始的日历
*/
public static String body(LocalDate localDate) {
return body(true, localDate);
}
/**
* @param isFristOfSunDay true为星期日排第一位,false为星期一排第一位
* @param localDate 指定日期
* @return 返回日历的主体内容字符串
*/
public static String body(boolean isFristOfSunDay, LocalDate localDate) {
// 日历头部信息
StringBuilder calendarInfo = new StringBuilder();
// 这个月最大天数
int maxDay = LocalDateUtils.getLengthOfMonth(localDate);
int currentDay = localDate.getDayOfMonth();
//
int weekCounts = 0;
for (int day = ONE; day <= maxDay; day++) {
//
if (day == ONE) {
LocalDate dayDate = LocalDateUtils.setDayOfMonth(localDate, day);
// 星期数
int weekNum = LocalDateUtils.getDayOfWeek(dayDate);
// 如果1号前面距离星期日还有空位,就要进行补位int size = isFristOfSunDay ? weekNum : weekNum--;
for (int j = 0; j < weekNum; j++) {
// 制表符
calendarInfo.append(TABS);
}
weekCounts += weekNum;
}
weekCounts++;
calendarInfo.append(day);
// 如用户输入的日期等于当前天数就增加标识:*
String spacing = TABS;
if (day == currentDay) {
calendarInfo.append(MARK);
spacing = TWO_TAB;
}
calendarInfo.append(day > NINE ? TWO_TAB : spacing);
//
if (weekCounts % SEVEN == 0) {
// 换行
calendarInfo.append(WRAP);
}
}
return calendarInfo.toString();
}
}