利用Calendar类制作日历

这学期刚学JavaWeb,看到B站有一个UP做了一个很漂亮的日历,想着自己也做一个。
首先,日历嘛,当然需要有年·月·日咯。
那么我们开始吧~

1.先在VScode上将HTML网页大致先写好。

没有用什么高端的框架,只是普普通通的CSS+HTML。做出来效果如下图所示:

HTML + CSS
图1 HTML + CSS

2.接下来在IDEA中编写JSP代码

因为只是一个小小日历,所以大部分的代码都写在JSP页面上了。(虽说要减少JSP中的Java代码,但这只是个小日历,所以先不管他)
在第一步编写HTML的时候,左侧就是今天的日期和今天是周几;而在右侧我们需要有三个部分。

1.其他部分

  • 首先编写左侧部分
  1. 实例化GregorianCalendar类的对象,并获取当前时间,存放到三个变量中
  // Calendar的.get(Calendar.DAY_OF_MONTH)方法,规定了每周第一天是星期日,所以星期日=1,星期一=2…星期六=7
  GregorianCalendar calendar= (GregorianCalendar) Calendar.getInstance();
  // calendar.set(2002,Calendar.FEBRUARY,17); // 设定日期
  int current_year = calendar.get(Calendar.YEAR);
  int current_month = calendar.get(Calendar.MONTH);
  int current_day = calendar.get(Calendar.DAY_OF_MONTH);
  int day_of_week = calendar.get(Calendar.DAY_OF_WEEK); // Java中规定了每周第一天是星期日,所以星期日=1,星期一=2…星期六=7
  1. 为后面建立三个数组(月份名称,周日到周六的名称,周名缩写)
  String[] monthsENG = {
          "January",    "February",   "March",    "April",
          "May",        "June",       "July",     "August",
          "September",  "October",    "November", "December"};
  // Java中规定了每周第一天是星期日,所以星期日=1,星期一=2…星期六=7
  String[] weekNamesENG = {
          "","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"
  };
  String[] weekShortNamesENG = {
          "S","M","T","W","T","F","S"
  };
  1. 放入相对应的div中
  <div class="left">
    <div class="week"><%=weekNamesENG[calendar.get(Calendar.DAY_OF_WEEK)]%></div>
    <div class="day"><%=calendar.get(Calendar.DAY_OF_MONTH)%></div>
  </div>
  • 接下来编写右侧,右侧分为三部分,上面显示当前月份名称和当前年份,中间显示缩写名,接下来是主体部分。
  1. 将相对应的信息放入div中
  <div class="right">
    <div class="year"><%=monthsENG[current_month]%>&nbsp<%=current_year%></div>
    <div class="calendar">
      <div class="weeks">
        <%
          // 这里输出星期几的名字缩写
          for(int i = 0; i < 7; i++){
            out.print("<div class=\"item\">" + weekShortNamesENG[i] + "</div>");
          }
        %>
      </div>

2. 日历部分

分析:我们要用到三个月的信息,需要知道每个月的总日子数量。
编写一个函数用来处理这个问题。(这里用了

package cn.king;

import java.util.GregorianCalendar;

public class DateProcess {
    public int MaxDayNumber(int current_year, int current_month) {
        GregorianCalendar calendar = new GregorianCalendar();
        int max_day = 30;
        if (current_month == 0 || current_month == 2 || current_month == 4 || current_month == 6 || current_month == 7 || current_month == 9 || current_month == 11)
            max_day = 31;
        else if (calendar.isLeapYear(current_year) && current_month == 1)
            max_day = 29;
        else if (!calendar.isLeapYear(current_year) && current_month == 1)
            max_day = 28;
        return max_day;
    }
}

  1. 写上一个月的末尾首先要知道当前月第一个日子之前有多少空白;是否要进行填充。
// 实例化dateProcess 调用里面的方法。
          DateProcess dateProcess = new DateProcess();
          
          // 1.写当前月的上一个月首先要获取当前月第一个日子之前有多少空白。
          
            // 现在是当前月, 首先设置当前日期是1号
          calendar.set(Calendar.DATE, 1);
          int start_day = calendar.get(Calendar.DAY_OF_WEEK) - 1;
//          System.out.println("1. start_day = " + start_day);
          boolean isYearPlus_Flag = false; // 建立一个flag用来判断年份是否 -1 了。
            // 已经获取当前月 1号 之前有多少日子放进blank_day中
            // 切换到上一个月
              // 如果当前月是1月,则手动调整为 上一年( -1 ) 的12月
          if (current_month == 0){
            calendar.set(Calendar.YEAR,current_year - 1);
            calendar.set(Calendar.MONTH, Calendar.DECEMBER);
            isYearPlus_Flag = true;
          }
              // 否则只需要月份 - 1
          else {
            calendar.set(Calendar.MONTH, current_month - 1);
          }
            // 刷新当前月期和年份
          current_year = calendar.get(Calendar.YEAR);
          current_month = calendar.get(Calendar.MONTH);
//          System.out.println("1. currentYear = " + current_year);
//          System.out.println("1. currentMonth = " + current_month);
//          System.out.println("1. currentDay = " + current_day);
            // 输出到屏幕上
          int max_day = dateProcess.MaxDayNumber(current_year, current_month);
//          System.out.println("1. max_day = " + max_day);
//          System.out.println();
          int temp = max_day - start_day + 1;
          for (int i = 0; i < start_day; i++) {
            // 此时这里还需要一个数字来从最大日期从大到小输出数字
            out.print("<div class=\"pre_Month_day\">" + temp + "</div>");
            temp++;
          }
  1. 将本月打印在屏幕上。本月就很简单了,只要知道有多少天,然后将其填充上去就行。(需要将今天和其他日子分开)
          // 2.上一个月已经输出完了,现在输出当前月份。
            // 切换到当前月份
              // 先判断年份是否变动
          if (isYearPlus_Flag) {
            calendar.set(Calendar.YEAR,current_year + 1);
            calendar.set(Calendar.MONTH, Calendar.JANUARY);
          }   // 没变动则直接月份 + 1
          else {
            calendar.set(Calendar.MONTH, current_month + 1);
          }
          // 刷新当前月期和年份
          current_year = calendar.get(Calendar.YEAR);
          current_month = calendar.get(Calendar.MONTH);
//          System.out.println("2. currentYear = " + current_year);
//          System.out.println("2. currentMonth = " + current_month);
//          System.out.println("2. currentDay = " + current_day);
          max_day = dateProcess.MaxDayNumber(current_year, current_month);
//          System.out.println("2. max_day = " + max_day);
            // 输出日期到屏幕上
              // 因为style设置,当前日期的class内容不同于其他日期,所以单独处理
          for (int i = 1; i < current_day; i++) {
            out.print("<div class=\"day\">"+ i +"</div>");
          }
          out.print("<div class=\"day today\">"+ current_day +"</div>");
          for (int i = current_day + 1; i <= max_day; i++) {
            out.print("<div class=\"day\">"+ i +"</div>");
          }
            // Java中规定了每周第一天是星期日,所以星期日=1,星期一=2…星期六=7
          calendar.set(Calendar.DATE, max_day);
            // 计算最后一天后面是否有空格
          int left_blank = 7 - calendar.get(Calendar.DAY_OF_WEEK);
//          System.out.println("2. left_blank = " + left_blank);
//          System.out.println();
  1. 输出下一个月填充到本月末尾,只需要判断要输出几天,或者不输出即可。
// 3. 该输出下一个月了,这个月需要了解上一个月最后一天是不是星期6,如果是就不输出。
          // 首先判断本月最后一天是否是周六
//          if (!isLastDaySaturday){
            // 切换到下一个月
            // 判断是否是12月 ,是就要同时切换年份
            if (current_month == 11) {
              // 设置年份 +1, 月份为 1月
              calendar.set(Calendar.YEAR, current_year-1);
              calendar.set(Calendar.MONTH, Calendar.JANUARY);
            }
            else {
              // 否则直接月份 +1
              calendar.set(Calendar.MONTH, current_month + 1);
            }
            // 切换月份完毕,准备输出下一个月的开始日期,在第二部分已经计算了当前月份后面有多少空白(left_blank)。
            // 输出日期
            for (int i = 1; i <= left_blank; i++){
              out.print("<div class=\"next_Month_day\">"+ i +"</div>");
            }
            // 刷新当前月期和年份
            current_year = calendar.get(Calendar.YEAR);
            current_month = calendar.get(Calendar.MONTH);

原始计划已经完成了,最终效果如下所示,我还想加两个按钮切换查看上一个月和下一个月;以及将节日添加上去,完善这个小项目。
在这里插入图片描述
未完待续…
下一步目标:加上节日提示

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值