简单的日历表写法

import java.util.ArrayList;

import java.util.Calendar;

import java.util.List;



public class Test {



    public static void main(String[] args) {

        List<Integer> links = new ArrayList<Integer>();

        links.add(3);

        links.add(6);

        links.add(9);

        links.add(12);

        links.add(15);

        links.add(18);

        links.add(21);

        links.add(24);

        links.add(27);

        links.add(30);



        // 采用当月的方式进行构造,现在是 2008 年 7 月

        Nil2000 nil = new Nil2000(links);



        System.out.println(nil.toString());

    }    

}



class Nil2000 {   



    /**

     * 生成日历的 Calendar

     */

    private Calendar calendar;

    

    /**

     * 有链接的日期

     */

    private List<Integer> links;

    

    private static String TABLE_START = "<table width=/"200/" border=/"1/">/n";

    private static String TABLE_END = "<table>/n";

    

    private static String TR_START = "  <tr>/n";

    private static String TR_END = "  </tr>/n";

    

    private static String TD_START = "    <td>";

    private static String TD_END = "</td>/n";

    

    private static String TD_BLANK = TD_START + " " + TD_END;

    

    /**

     * 链接字符串的常量,需要将 {0} 替换成指定字符串

     */

    private static String LINK = "<a href=/"link{0}/">{0}</a>";

    

    /**

     * 构造当月的日历

     * @param links         需要带有链接的日期

     */

    public Nil2000(List<Integer> links) {

        this(Calendar.getInstance(), links);

    }

    

    /**

     * 构造指定日期月份的日历

     * @param calendar      指定日期

     * @param links         需要带有链接的日期

     */

    public Nil2000(Calendar calendar, List<Integer> links) {

        calendar.set(Calendar.DATE, 1);

        this.calendar = calendar;

        this.links = links;

    }

    

    public String toString() {

        StringBuffer sb = new StringBuffer();

        sb.append(TABLE_START);

        sb.append(TR_START);

        

        int total = 1;

        // 若非周日时,在添加空的 <td> 串,以空开,将 1 号显示在指定的位置上

        for(int k = calendar.get(Calendar.DAY_OF_WEEK); total < k; total++) {

            appendBlank(sb);

        }

        

        for(int i = 1, k = calendar.getActualMaximum(Calendar.DATE); i <= k; i++) {

            if((total - 1) % 7 == 0) {

                sb.append(TR_END).append(TR_START);

            }

            appendDate(sb, i);

            total++;

        }

        

        // 最后的日期如果不是周六,则在后面添加上若干个 <td> 串,以填满表格

        while((total - 1) % 7 != 0) {

            appendBlank(sb);

            total++;

        }

        sb.append(TR_START);

        sb.append(TABLE_END);

        return sb.toString();

    }

    

    private void appendBlank(StringBuffer sb) {

        sb.append(TD_BLANK);

    }

    

    private void appendDate(StringBuffer sb, int date) {        

        sb.append(TD_START);

        if(links.contains(date)) {

            sb.append(LINK.replace("{0}", String.valueOf(date)));

        } else {

            sb.append(date);

        }

        sb.append(TD_END);

    }    

}

 

运行结果为:

<table width="200" border="1">

  <tr>

    <td> </td>

    <td> </td>

    <td>1</td>

    <td>2</td>

    <td><a href="link3">3</a></td>

    <td>4</td>

    <td>5</td>

  </tr>

  <tr>

    <td><a href="link6">6</a></td>

    <td>7</td>

    <td>8</td>

    <td><a href="link9">9</a></td>

    <td>10</td>

    <td>11</td>

    <td><a href="link12">12</a></td>

  </tr>

  <tr>

    <td>13</td>

    <td>14</td>

    <td><a href="link15">15</a></td>

    <td>16</td>

    <td>17</td>

    <td><a href="link18">18</a></td>

    <td>19</td>

  </tr>

  <tr>

    <td>20</td>

    <td><a href="link21">21</a></td>

    <td>22</td>

    <td>23</td>

    <td><a href="link24">24</a></td>

    <td>25</td>

    <td>26</td>

  </tr>

  <tr>

    <td><a href="link27">27</a></td>

    <td>28</td>

    <td>29</td>

    <td><a href="link30">30</a></td>

    <td>31</td>

    <td> </td>

    <td> </td>

  <tr>

<table>

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值