Java實現(xiàn)按年月打印日歷功能【基于Calendar】
本文實例講述了Java實現(xiàn)按年月打印日歷功能。分享給大家供大家參考,具體如下:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class CalendarBook {
public static void main(String[] args) throws ParseException {
CalendarBook cb = new CalendarBook();
cb.printWeekTitle();
cb.printCalendar(2018, 3);
}
public void printCalendar(int year, int month) throws ParseException {
String monthStr; // 格式化月份,因為要轉(zhuǎn)成yyyyMMdd格式的
if (month < 10) {
monthStr = "0" + month;
} else {
monthStr = month + ""; // 數(shù)字跟字符串拼接轉(zhuǎn)成字符串格式
}
String yearMonthStr = year + monthStr;
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Calendar calendarEnd = Calendar.getInstance();
Calendar calendarStart = Calendar.getInstance();
// 根據(jù)年份和月份得到輸入月份有多少天
int monthDays = getMonthLastDay(year, month);
// 月初的date字符串
String dateStartStr = yearMonthStr + "01";
// 月末的date字符串
String dateEndStr = yearMonthStr + monthDays;
Date startDate = sdf.parse(dateStartStr);
Date endDate = sdf.parse(dateEndStr);
calendarStart.setTime(startDate);
calendarEnd.setTime(endDate);
// 得到輸入月份有多少周
int weeks = calendarEnd.get(Calendar.WEEK_OF_MONTH);
// 得到當月第一天是星期幾,這里周日為第一天,從1開始,周一則為2
int dayOfWeek = calendarStart.get(Calendar.DAY_OF_WEEK);
int day = 1;
// 當月的第一周做特殊處理,單獨打印一行
for (int i = 1; i <= 7; i++) {
if (i >= dayOfWeek) {
System.out.print(" " + day + " ");
day++;
} else {
System.out.print(" ");
}
}
System.out.println();
// 開始打印從第二周開始的日期
for (int week = 1; week < weeks; week++) {
for (int i = 1; i <= 7; i++) {
if (day > monthDays) {
break;
}
if (day < 10) {
System.out.print(" " + day + " ");
} else {
System.out.print(day + " ");
}
day++;
}
System.out.println();
}
}
public int getMonthLastDay(int year, int month) {
int monthDay;
int[][] day = { { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
{ 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } };
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
// 閏年
monthDay = day[1][month];
} else {
monthDay = day[0][month];
}
return monthDay;
}
public void printWeekTitle() {
System.out.println("日" + " " + "一" + " " + "二" + " " + "三"
+ " " + "四" + " " + "五" + " " + "六");
}
}
運行結(jié)果截圖(運行效果,字體大小5號最佳):

PS:這里再為大家推薦幾款關(guān)于日期與時間計算的在線工具供大家參考使用:
在線日期/天數(shù)計算器:
http://tools.jb51.net/jisuanqi/date_jisuanqi
在線萬年歷日歷:
http://tools.jb51.net/bianmin/wannianli
在線陰歷/陽歷轉(zhuǎn)換工具:
http://tools.jb51.net/bianmin/yinli2yangli
Unix時間戳(timestamp)轉(zhuǎn)換工具:
http://tools.jb51.net/code/unixtime
更多關(guān)于java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《java日期與時間操作技巧匯總》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計有所幫助。
相關(guān)文章
詳解JavaScript中的函數(shù)聲明和函數(shù)表達式
這篇文章主要介紹了詳解JavaScript中的函數(shù)聲明和函數(shù)表達式,是JS入門學習中的基礎(chǔ)知識,需要的朋友可以參考下2015-08-08
簡析Java中的util.concurrent.Future接口
這篇文章主要介紹了簡析Java中的util.concurrent.Future接口,作者把future歸結(jié)為在未來得到目標對象的占位符,需要的朋友可以參考下2015-07-07
分布式服務(wù)Dubbo+Zookeeper安全認證實例
下面小編就為大家分享一篇分布式服務(wù)Dubbo+Zookeeper安全認證實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12
springMVC返回復雜的json格式數(shù)據(jù)方法
下面小編就為大家分享一篇springMVC返回復雜的json格式數(shù)據(jù)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03
Java基礎(chǔ)之JDK1.8新特性lambda表達式詳解
函數(shù)式接口有且僅有一個抽象方法,但是可以有多個非抽象方法的接口,函數(shù)式接口可以被隱式轉(zhuǎn)換為lambda表達式,這篇文章主要介紹了Java基礎(chǔ)之lambda表達式(JDK1.8新特性),需要的朋友可以參考下2023-08-08
在SpringBoot項目中實現(xiàn)給所有請求加固定前綴
這篇文章主要介紹了在SpringBoot項目中實現(xiàn)給所有請求加固定前綴,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02

