欢迎光临
我们一直在努力

一些无聊的代码之一:JAVA中的日期计算-JSP教程,Java技巧及代码

建站超值云服务器,限时71元/月

/* * datecalculate.java , created on 2005-3-18 * copyright 2005 aaa information technology co.ltd. all rights reserved. *  * 作成日期: 2005-3-18 * 修改履历:  *  */package com.bjb.xyh.util;

import java.text.decimalformat;//import java.text.parseexception;import java.text.simpledateformat;import java.util.calendar;import java.util.date;

/** * 类描述:自己实现的日期计算类,可以自由扩展 * @author xieyh lamp5w@yahoo.com.cn * @version  build 2005-3-18 *  */public class datecalculate {        /** 注意格里历和儒略历交接时的日期差别 */    private static transient int gregoriancutoveryear = 1582;        /** 闰年中每月天数 */    private static final int[] days_p_month_ly=       {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};    /** 平年中每月天数 */    private static final int[] days_p_month_cy=    {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};    /** 代表数组里的年、月、日 */    private static final int y = 0, m = 1, d = 2;        /** 参与运算用 */    private int[] ymd = null;

    /**     * 检查传入的参数是否合法的日期     * @param date     * @throws illegalargumentexception     */    public static void validate(string date)throws illegalargumentexception{                int[] ymd = splitymd( date );                if( ymd[m] == 0 || ymd[m] > 12 ){            throw new illegalargumentexception("月份数值错误");        }                if( true == isleapyear( ymd[0] ) ){            if( ymd[d] == 0 || ymd[d] > days_p_month_ly[ymd[m] -1 ] ){                throw new illegalargumentexception("日期数值错误");            }        }else{            if( ymd[d] == 0 || ymd[d] > days_p_month_cy[ymd[m] -1 ] ){                throw new illegalargumentexception("日期数值错误");            }        }    }

    /**     * 检查传入的参数代表的年份是否为闰年     * @param year     * @return     */    public static boolean isleapyear(int year) {        return year >= gregoriancutoveryear ?            ((year%4 == 0) && ((year%100 != 0) ||                     (year%400 == 0))) : // gregorian            (year%4 == 0); // julian    }        /**     * 日期加1天,注意这里没有考虑儒略历和格里历交接时相差的10天     * @param year     * @param month     * @param day     * @return     */    private int[] addoneday(int year, int month, int day){        if(isleapyear( year )){            day++;            if( day > days_p_month_ly[month -1 ] ){                month++;                if(month > 12){                    year++;                    month = 1;                }                day = 1;            }        }else{            day++;            if( day > days_p_month_cy[month -1 ] ){                month++;                if(month > 12){                    year++;                    month = 1;                }                day = 1;            }        }        int[] ymd = {year, month, day};        return ymd;    }        /**     * 以循环的方式计算日期加法     * @param date     * @param days     * @return     */    public string adddaysbyloop(string date, int days){        validate(date);        int[] ymd = splitymd( date );        for(int i = 0; i < days; i++){            ymd = addoneday(ymd[y], ymd[m], ymd[d]);        }        return formatyear(ymd[y])+       formatmonthday(ymd[m])+       formatmonthday(ymd[d]);    }        /**     * 日期减1天,注意这里没有考虑儒略历和格里历交接时相差的10天     * @param year     * @param month     * @param day     * @return     */    private int[] reduceoneday(int year, int month, int day){        if(isleapyear( year )){            day–;            if( day <= 0 ){                month–;                if(month < 1){                    year–;                    month = 12;                }                day = days_p_month_ly[month -1 ];            }        }else{            day–;            if( day <= 0 ){                month–;                if(month < 1){                    year–;                    month = 12;                }                day = days_p_month_cy[month -1 ];            }        }        int[] ymd = {year, month, day};        return ymd;    }        /**     * 以循环的方式计算日期减法     * @param date     * @param days     * @return     */    public string reducedaysbyloop(string date, int days){        validate(date);        int[] ymd = splitymd( date );        for(int i = 0; i < days; i++){            ymd = reduceoneday(ymd[y], ymd[m], ymd[d]);        }        return formatyear(ymd[y])+       formatmonthday(ymd[m])+       formatmonthday(ymd[d]);    }        /**     * 指定日期加上指定的天数的操作     * @param date     * @param days     * @return     * @throws illegalargumentexception     */    public string adddays(date date, int days)     throws illegalargumentexception{        return adddays(formatdate(date), days);    }        /**     * 指定日期加上指定的天数的操作     * @param date     * @param days     * @return     * @throws illegalargumentexception     */    public string adddays(string date, int days)     throws illegalargumentexception{                validate(date);        ymd = splitymd( date );                if( isleapyear( ymd[y] ) ){            ymd[d] += days;            if( ymd[d] > days_p_month_ly[ymd[m] -1 ] ){                ymd[m] ++;                ymd[d] = ymd[d] – days_p_month_ly[ymd[m] -1-1 ];                if(ymd[m] > 12){                    ymd[m] -= 12;                    ymd[y]++;                }                if( ymd[d] > days_p_month_ly[ymd[m] -1 ] ){                    adddays(formatyear(ymd[y])+                         formatmonthday(ymd[m])+                         formatmonthday(days_p_month_ly[ymd[m] -1 ]),                          ymd[d] – days_p_month_ly[ymd[m] -1 ]);                }            }        }else{            ymd[d] += days;            if( ymd[d] > days_p_month_cy[ymd[m] -1 ] ){                ymd[m] ++;                ymd[d] = ymd[d] – days_p_month_cy[ymd[m] -1-1 ];                if(ymd[m] > 12){                    ymd[m] -= 12;                    ymd[y]++;                }                if( ymd[d] > days_p_month_cy[ymd[m] -1 ] ){                    adddays(formatyear(ymd[y])+                         formatmonthday(ymd[m])+                         formatmonthday(days_p_month_cy[ymd[m] -1 ]),                          ymd[d] – days_p_month_cy[ymd[m] -1 ]);                }            }        }        return  formatyear(ymd[y])+        formatmonthday(ymd[m])+        formatmonthday(ymd[d]);    }        /**     * 指定日期减去指定的天数的操作     * @param date     * @param days     * @return     * @throws illegalargumentexception     */    public string reducedays(date date, int days)     throws illegalargumentexception{        return reducedays(formatdate(date), days);    }        /**     * 指定日期减去指定的天数的操作     * @param date     * @param days     * @return     * @throws illegalargumentexception     */    public string reducedays(string date, int days)     throws illegalargumentexception{                validate(date);        ymd = splitymd( date );                if( isleapyear( ymd[y] ) ){            ymd[d] -= days;            if( ymd[d] <= 0 ){                ymd[m] –;                if(ymd[m] < 1){                    ymd[m] += 12;                    ymd[y]–;                }                ymd[d] = ymd[d] + days_p_month_ly[ ymd[m]-1 ];                if( ymd[d] <= 0 ){                    reducedays(formatyear(ymd[y])+                         formatmonthday(ymd[m])+                         formatmonthday( 1 ),                         abs( ymd[d] – 1 ));                }            }        }else{            ymd[d] -= days;            if( ymd[d] <= 0 ){                ymd[m] –;                if(ymd[m] < 1){                    ymd[m] += 12;                    ymd[y]–;                }                ymd[d] = ymd[d] + days_p_month_cy[ ymd[m]-1 ];                if( ymd[d] <= 0 ){                    reducedays(formatyear(ymd[y])+                         formatmonthday(ymd[m])+                         formatmonthday(1),                         abs( ymd[d] – 1 ));                }            }        }        return  formatyear(ymd[y])+        formatmonthday(ymd[m])+        formatmonthday(ymd[d]);    }        /**     * 格式化一个日期字符串     * @param date     * @return     */    public static string formatdate(date date){        simpledateformat sdf = new simpledateformat("yyyymmdd");        return sdf.format( date );    }        /**     * 将代表日期的字符串分割为代表年月日的整形数组     * @param date     * @return     */    public static int[] splitymd(string date){        int[] ymd = {0, 0, 0};        ymd[y] = integer.parseint(date.substring(0, 4));        ymd[m] = integer.parseint(date.substring(4, 6));        ymd[d] = integer.parseint(date.substring(6, 8));        return ymd;    }        /**     * 将不足两位的月份或日期补足为两位     * @param decimal     * @return     */    public static string formatmonthday(int decimal){        decimalformat df = new decimalformat("00");        return df.format( decimal );    }        /**     * 将不足四位的年份补足为四位     * @param decimal     * @return     */    public static string formatyear(int decimal){        decimalformat df = new decimalformat("0000");        return df.format( decimal );    }        /**     * 取绝对值操作     * @param num     * @return     */    public static int abs(int num){        return (num > 0) ? num : -num;    }         /**     * 测试用main函数     * @param args     */    public static void main( string[] args ) throws exception{        string currdate = "20001231";        string currdate2 = "20001231";        int days = -36600;        date date = null;        datecalculate dc = new datecalculate();        simpledateformat sdf = new simpledateformat("yyyymmdd");        date = sdf.parse( currdate2 );                system.out.println(currdate + " + " +             abs(days) + "days = " + dc.adddays(currdate, abs(days)));        system.out.println(currdate + " – " +             abs(days) + "days = " + dc.reducedays(currdate, abs(days)));

        calendar cld = calendar.getinstance();        cld.settime( date );        cld.add(calendar.date, abs(days));        system.out.println(currdate2 + " + " +             abs(days) + "days = " + sdf.format(cld.gettime()));                cld = calendar.getinstance();        cld.settime( date );        cld.add(calendar.date, days);        system.out.println(currdate2 + " – " +             abs(days) + "days = " + sdf.format(cld.gettime()));                system.out.println(dc.adddaysbyloop(currdate2, abs(days)));        system.out.println(dc.reducedaysbyloop(currdate2, abs(days)));    }}

写这些代码的动机来自最近学习shell脚本的感受。

目的如下,先搁着,等有时间再作补充:1. 避免递归算法的滥用2. 临界值的把握3. 日期计算的细节

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 一些无聊的代码之一:JAVA中的日期计算-JSP教程,Java技巧及代码
分享到: 更多 (0)