java Calendar 按月输出日历

获取一个月的不善言辞,直接贴代码,功能非常实用

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

如有更好的写法,更加简洁,求赐教!



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xianghan收藏册

极简精品作,一分也是一份鼓励哦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值