获取一个月的不善言辞,直接贴代码,功能非常实用
package com.umessage.test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
* 获取指定月的日历
*
* @author kojon
* @date 2014-7-30
* @version 1.0
*/
public class CalendarUtil {
public static void main(String[] args) {
int year = 2014;
int month = 03;
printCalendar(year, month);
System.out.println("\n获取集合:"+getCalendar(year, month));
System.out.println("\n获取集合:"+getCalendar("2014-06-30"));
System.out.println("\n以周输出:");
getCalendarWeek(year, month);
}
/**
* 根据日期获取当前月数据
* @param date 格式2014-07-30
* @return 月日期集合
*/
static List<String> getCalendar(String date) {
return getCalendar(Integer.valueOf(getTime(date,Calendar.YEAR)),(Integer.valueOf(getTime(date,(Calendar.MONTH)))+1));
}
static void printCalendar(int year, int month) {
System.out.println("Calendar for year/mont:" + year +"/"+ (month));
System.out.println("日 |一 |二 |三 |四 |五 |六");
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month-1);
//一个月的天数
int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
//每一天进行循环加入
for (int day = 1; day <= maxDay; day++) {
calendar.set(Calendar.DATE, day);
int weekDay=getWeekDay(calendar);
if (day == 1) {
//前一个月的补齐
if (weekDay != 7) {
calendar.add(Calendar.MONTH, -1);//上一个月
int beforMaxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);//上个月最大天数
int befordaycount=weekDay;//第一个月第一天星期几 前面补足几天
//倒序补齐
for (int i = 1; i <= weekDay; i++) {
System.out.print((beforMaxDay+1-befordaycount)+"|");
befordaycount--;
}
calendar.set(Calendar.MONTH, month-1);//恢复原来的月
}
}
System.out.print((day>9?day:"0"+day) + "|");
//保持日历格式 周六换行
if (weekDay == 6) {
System.out.println();
}
//下个月补齐
if(day == maxDay){
if (weekDay != 6) {//非周六才需补齐
int lastDayCount=weekDay==7?6:(6-weekDay);//星期天还有6天补齐 其余是6-?
for (int i = 1; i <=lastDayCount ; i++) {
System.out.print((i>9?i:"0"+i)+"|");
}
}
}
}
}
static List<String> getCalendar(int year, int month) {
List<String> data=new ArrayList<String>();
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month-1);
//一个月的天数
int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
//每一天进行循环加入
for (int day = 1; day <= maxDay; day++) {
calendar.set(Calendar.DATE, day);
int weekDay=getWeekDay(calendar);
if (day == 1) {
//前一个月的补齐
if (weekDay != 7) {
calendar.add(Calendar.MONTH, -1);//上一个月
int beforMaxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);//上个月最大天数
int befordaycount=weekDay;//第一个月第一天星期几 前面补足几天
//倒序补齐
for (int i = 1; i <= weekDay; i++) {
data.add(calendar.get(Calendar.YEAR)+"-"+getValue(calendar.get(Calendar.MONTH)+1)+"-"+getValue(beforMaxDay+1-befordaycount));
befordaycount--;
}
calendar.set(Calendar.MONTH, month-1);//恢复原来的月
}
}
data.add(calendar.get(Calendar.YEAR)+"-"+getValue(calendar.get(Calendar.MONTH)+1)+"-"+getValue(day));
//下个月补齐
if(day == maxDay){
if (weekDay != 6) {//非周六才需补齐
int lastDayCount=weekDay==7?6:(6-weekDay);//星期天还有6天补齐 其余是6-?
for (int i = 1; i <=lastDayCount ; i++) {
data.add(year+"-"+getValue(month+1)+"-"+getValue(i));
}
}
}
}
return data;
}
public static void getCalendarWeek(int year, int month){
try {
List<String> calendar= getCalendar(year, month);
int n=1;
for (int i = 0; i < calendar.size(); i+=7) {
System.out.println("第["+n+"]周");
//一周为周期
for (int j = 0; j < 7; j++) {
int index=i+j;
//亲,在此写你的业务逻辑
System.out.println(calendar.get(index));
}
n++;
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 十以下前补0
* @param num
* @return
*/
private static String getValue(int num){
return String.valueOf(num>9?num:("0"+num));
}
/**
* 获取星期1-7
* @param calendar
* @return
*/
static int getWeekDay(Calendar calendar){
int weekDay = calendar.get(Calendar.DAY_OF_WEEK)-1;
return weekDay==0?7:weekDay;
}
/**
* 字符串日期,获取年、月、日、星期等
*
* @param date
* @param value
* 年:Calendar.YEAR
* 月:Calendar.MONTH 注意:以0开始计算的
* 日:Calendar.DATE
* 星期:Calendar.MONDAY 等
* 参见Calendar中的变量
* @return
*/
static String getTime(String date,int value){
Calendar ca=Calendar.getInstance();
ca.setTime(string2Date(date));
return String.valueOf(ca.get(value));
}
static String date2String(Date date){
return new SimpleDateFormat("yyyy-MM-dd").format(date);
}
static Date string2Date(String date){
try {
return new SimpleDateFormat("yyyy-MM-dd").parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
输出结果:
Calendar for year/mont:2014/3
日 |一 |二 |三 |四 |五 |六
23|24|25|26|27|28|01|
02|03|04|05|06|07|08|
09|10|11|12|13|14|15|
16|17|18|19|20|21|22|
23|24|25|26|27|28|29|
30|31|01|02|03|04|05|
获取集合:[2014-02-23, 2014-02-24, 2014-02-25, 2014-02-26, 2014-02-27, 2014-02-28, 2014-03-01, 2014-03-02, 2014-03-03, 2014-03-04, 2014-03-05, 2014-03-06, 2014-03-07, 2014-03-08, 2014-03-09, 2014-03-10, 2014-03-11, 2014-03-12, 2014-03-13, 2014-03-14, 2014-03-15, 2014-03-16, 2014-03-17, 2014-03-18, 2014-03-19, 2014-03-20, 2014-03-21, 2014-03-22, 2014-03-23, 2014-03-24, 2014-03-25, 2014-03-26, 2014-03-27, 2014-03-28, 2014-03-29, 2014-03-30, 2014-03-31, 2014-04-01, 2014-04-02, 2014-04-03, 2014-04-04, 2014-04-05]
获取集合:[2014-06-01, 2014-06-02, 2014-06-03, 2014-06-04, 2014-06-05, 2014-06-06, 2014-06-07, 2014-06-08, 2014-06-09, 2014-06-10, 2014-06-11, 2014-06-12, 2014-06-13, 2014-06-14, 2014-06-15, 2014-06-16, 2014-06-17, 2014-06-18, 2014-06-19, 2014-06-20, 2014-06-21, 2014-06-22, 2014-06-23, 2014-06-24, 2014-06-25, 2014-06-26, 2014-06-27, 2014-06-28, 2014-06-29, 2014-06-30, 2014-07-01, 2014-07-02, 2014-07-03, 2014-07-04, 2014-07-05]
以周输出:
第[1]周
2014-02-23
2014-02-24
2014-02-25
2014-02-26
2014-02-27
2014-02-28
2014-03-01
第[2]周
2014-03-02
2014-03-03
2014-03-04
2014-03-05
2014-03-06
2014-03-07
2014-03-08
第[3]周
2014-03-09
2014-03-10
2014-03-11
2014-03-12
2014-03-13
2014-03-14
2014-03-15
第[4]周
2014-03-16
2014-03-17
2014-03-18
2014-03-19
2014-03-20
2014-03-21
2014-03-22
第[5]周
2014-03-23
2014-03-24
2014-03-25
2014-03-26
2014-03-27
2014-03-28
2014-03-29
第[6]周
2014-03-30
2014-03-31
2014-04-01
2014-04-02
2014-04-03
2014-04-04
2014-04-05
如有更好的写法,更加简洁,求赐教!