目錄
通過 Java 的基本文法來實作萬年曆
Java 擷取一年中所有的周六和周日
Java 節假日導入導出
通過 Java 的基本文法來實作萬年曆
在 Java 的時間計算方面還有很多好用的工具類,Java 常用的工具類封裝架構連結如下:HUTool 架構官網
package com.taier.pulsar.date_utils;
import java.util.Scanner;
/**
* @author swadian2008
*/
public class DateUtils {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入年:");
int year = sc.nextInt();
System.out.println("請輸入月份:");
int month = sc.nextInt();
//1.計算1900.1.1到輸入年的天數
int dayOfYear = 0;
for (int i = 1900; i < year; i++) {
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) { // 閏年
dayOfYear += 366;
} else {
dayOfYear += 365;
}
}
//2.計算1月到輸入月的天數
int dayOfMonth = 0;
for (int i = 1; i < month; i++) {
switch (i) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
dayOfMonth += 31;
break;
case 4:
case 6:
case 9:
case 11:
dayOfMonth += 30;
break;
case 2:
if ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)) {
dayOfMonth += 29;
} else {
dayOfMonth += 28;
}
break;
}
}
//3.擷取輸入月的天數
int day = 0;
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
day = 31;
break;
case 4:
case 6:
case 9:
case 11:
day = 30;
break;
case 2:
if ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)) {
day = 29;
} else {
day = 28;
}
break;
}
//4.計算星期
int allDay = dayOfYear + dayOfMonth + 1;
int week = allDay % 7; // 計算餘數在星期中的位置
int count = 0;// 計數器,記錄日期的空格
System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
//5.列印空格
for (int i = 1; i <= week; i++) {
System.out.print("\t\t\t");
count++;
}
//6. 列印月曆
for (int i = 1; i <= day; i++) {
if (i < 10) { // 為了格式化
System.out.print(i + "\t\t\t");
} else {
System.out.print(i + "\t\t");
}
count++;
//若記錄數是七的倍數,換行輸出
if (count % 7 == 0) {
System.out.println();
}
}
}
}
列印效果如下:
Java 擷取一年中所有的周六和周日
下邊的示例中使用了一個Map來收集周六和周日,可以根據需要進行調節:
import static java.time.temporal.TemporalAdjusters.firstInMonth;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.Period;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
/**
* @author swadian2008
*/
public class WeekDay {
public static void main(String[] args) {
// 建立代表一年中第一天的LocalDate對象。
int year = 2023;
LocalDate now = LocalDate.of(year, Month.JANUARY, 1);
Map<String, List<Integer>> weekMap = new HashMap<>(12);
// 第一個星期六
LocalDate saturday = now.with(firstInMonth(DayOfWeek.SATURDAY));
do {
String satMonth = String.valueOf(saturday.getMonthValue());
if (CollectionUtils.isEmpty(weekMap.get(satMonth))) {
weekMap.put(satMonth, new ArrayList<>(Arrays.asList(saturday.getDayOfMonth())));
} else {
List<Integer> values = weekMap.get(satMonth);
values.add(saturday.getDayOfMonth());
Collections.sort(values);
weekMap.put(satMonth, values);
}
// 疊代一個星期
saturday = saturday.plus(Period.ofDays(7));
} while (saturday.getYear() == year);
// 第一個星期天
LocalDate sunday = now.with(firstInMonth(DayOfWeek.SUNDAY));
do {
String sunMonth = String.valueOf(sunday.getMonthValue());
if (CollectionUtils.isEmpty(weekMap.get(sunMonth))) {
weekMap.put(sunMonth, new ArrayList<>(Arrays.asList(sunday.getDayOfMonth())));
} else {
List<Integer> values = weekMap.get(sunMonth);
values.add(sunday.getDayOfMonth());
Collections.sort(values);
weekMap.put(sunMonth, values);
}
// 疊代一個星期
sunday = sunday.plus(Period.ofDays(7));
} while (sunday.getYear() == year);
Map<String, List<Integer>> sortWeekMap = weekMap.entrySet().stream().sorted((e1, e2) ->
Integer.compare(Integer.parseInt(e1.getKey()), Integer.parseInt(e2.getKey())))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1,
LinkedHashMap::new));
for (Entry<String, List<Integer>> map : sortWeekMap.entrySet()) {
System.out.println(map.getKey() + "月:" + map.getValue().toString());
}
}
}
列印效果如下:
Java 節假日導入導出
Java 節假日導入導出會要操作一些 excel 檔案,推薦使用 Easy Excel
使用該架構後,就不再需要寫原生的 POI 了,而且在資料量方面也提供了相關的解決方案。
因為周六日的擷取方法上文已經提供,其他節假日都是手動導入,因為節假日的導入導出重點在于 POI 操作 ,并非本文重點,且 easy excel 文檔已經提供了詳細的操作說明,是以此處隻提供方案,就不提供具體代碼了。