java对日期和时间的格式化和运算处理

 

 

package com.nos.DateAndCalendar;

import java.text.MessageFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateTool
{
/* 
      SimpleDateFormat的构造函数中String中字符的含义列如下表:
      Letter     Date or Time Component     Presentation     Examples
      G         Era designator             Text             AD
      y         Year                     Year             1996; 96
      M         Month in year             Month             July; Jul; 07
      w         Week in year             Number             27
      W         Week in month             Number             2
      D         Day in year             Number             189
      d         Day in month             Number             10
      F         Day of week in month     Number             2
      E         Day in week             Text             Tuesday; Tue
      a         Am/pm marker             Text             PM
      H         Hour in day (0-23)         Number             0
      k         Hour in day (1-24)         Number             24
      K         Hour in am/pm (0-11)     Number             0
      h         Hour in am/pm (1-12)     Number             12
      m         Minute in hour             Number             30
      s         Second in minute         Number             55
      S         Millisecond             Number             978
      z         Time zone             General time zone Pacific Standard Time; PST; GMT-08:00
      Z         Time zone             RFC 822 time zone


    Date and Time Pattern                  Result  
    "yyyy.MM.dd G 'at' HH:mm:ss z"      2001.07.04 AD at 12:08:56 PDT  
    "EEE, MMM d, ''yy"                  Wed, Jul 4, '01  
    "h:mm a"                              12:08 PM  
    "hh 'o''clock' a, zzzz"              12 o'clock PM, Pacific Daylight Time  
    "K:mm a, z"                          0:08 PM, PDT  
    "yyyyy.MMMMM.dd GGG hh:mm aaa"      02001.July.04 AD 12:08 PM  
    "EEE, d MMM yyyy HH:mm:ss Z"          Wed, 4 Jul 2001 12:08:56 -0700  
    "yyMMddHHmmssZ"                      010704120856-0700  
    "yyyy-MM-dd'T'HH:mm:ss.SSSZ"          2001-07-04T12:08:56.235-0700 
     
    (在Date and Time Pattern中,字母a-zA-Z都是进行解析和转换的,
    故我们如果要用到没有特定意义的字母时,需要用单引号将其引起来;而用到非字母的其它字符时就可直接使用)
    
    
    Calendar与GregorianCalendar是父类与子类的关系,Calendar是父类,也是抽象类,GregorianCalendar是子类,
    它实现Calendar父类,可以写成 Calendar cal = new GregorianCalendar();//直接实例化
                    或者:Calendar cal = Calendar.getInstance();//工厂方法实例化
*/
    public static final String TIME_PATTERN_DEFAULT = "yyyy-MM-dd HH:mm:ss";//默认的日期格式
    private static String getPattern(String pattern){
        if("".equals(pattern)){
            pattern = TIME_PATTERN_DEFAULT;
        }
        return pattern;
    }
    
    
    /**  
     * 判断指定的日期格式pattern是不是与String类型的date日期相对应的日期格式。
     * 比如:20120910与yyyyMMdd是相对应的日期格式,是符合转换的规范的,不会出现转换异常,返回true。
     * 而20120910与yyyy/MM/dd、aaaaMMd等都不是相对应的日期格式,会出现转换异常,返回false。
     */  
    public static boolean isDatePattern(String date, String pattern) {   
        if (date != null) {   
            SimpleDateFormat format = new SimpleDateFormat(pattern);   
            format.setLenient(false);   
            try {   
                format.format(format.parse(date));   
            } catch (ParseException e) {   
                return false;   
            }   
            return true;   
        }   
        return false;   
    }   

    
    /*###############################################################################*/
    /*############################========日期格式化方法=======############################*/
    /*###############################################################################*/    
    
    /**
     * 将Date类型的日期对你转换成String类型返回
     */
    public static String parseDateToString(Date date){
        SimpleDateFormat sdf = new SimpleDateFormat();
        return sdf.format(date);
    }
    
    /**
     * 将Date类型的日期按照给定的格式pattern进行格式化,然后以String类型返回。如果pattern为空串,则按默认的pattern格式化。
     * 将Date对象转换成String类型时是没有格式限制的,符合要规范的格式日期格式都可以转换,即pattern是没有限制的。
     * @param date 需要转换的Date类型的日期
     * @param pattern 需要转换成的日期格式,格式没有限制。
     */
    public static String parseDateToString(Date date, String pattern){
        String redate = null;
        pattern = DateTool.getPattern(pattern);
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        redate = sdf.format(date);
        return redate;
    }
    
    /**
     * 将String类型的日期转换成Date类型的对象返回
     * 虽然的们可以直接返回new Date(str);但这个方法已经淘汰,可以用DateFormat.getDateInstance().parse(source);但这两种方法都会带来转换异常。
     * 但它默认的字符串日期的格式是yyyy-MM-dd,也就是说只有形如2012-09-08这类的String类型的时间才能正确转换,故我们选用了SimpleDateFormat
     * 它可以先指定转换的pattern模式,然后再按照这个模式将String类型的时间转换成对应的Date对象,这样就不会出现转换异常了。
     * 注意:在String类型的日期转成日期对象时,给定的日期source与日期格式sourcePattern一定要对应,否则会出现转换异常。
     * 比如:source:2012/09/10,则传递过来的sourcePattern一定要是"yyyy/MM/dd",而不能是其他的
     * @param source 需要转换的String类型的日期
     * @param sourcePattern 与日期source相对应的日期格式。注意:一定要是相对应的日期格式。
     */
    public static Date parseStringToDate(String source, String sourcePattern){
        Date date = null;
        SimpleDateFormat sdf = new SimpleDateFormat(sourcePattern);
        try{
            date = sdf.parse(source);
        }catch (ParseException e){
            e.printStackTrace();
        }
        return date;
        
    }
    
    /**
     * 按照给定的pattern模式来格式化String类型的日期,并将格式化后的时间以String类型返回
     * pattern形如:yyyy-MM-dd
     */
    public static String formatDate(String source, String sourcePattern, String finalPattern){
        String redate = null;
        SimpleDateFormat sdf = new SimpleDateFormat(finalPattern);
        redate = sdf.format(DateTool.parseStringToDate(source, sourcePattern));
        return redate;
    }
    
    /**
     * 按照给定的pattern模式来格式化Date类型的日期,并将格式化后的时间以String类型返回
     * pattern没有格式限制,符合规范即可。
     */
    public static String formatDate(Date date, String pattern){
        return DateTool.parseDateToString(date, pattern);
    }
    
    /**
     * 利用MessageFormat的format方法将String类型的日期格式化。
     * 这个方法中有两个参数,一个是pattern模式,另外一个就是按这个模式进行格式化的参数,这个参数可以是一个,也可以是多个组成的数组。
     * 故它的pattern模式要求用大括号"{}"括起来,里面写入3个值,第一个表示将传递过来的参数中的第几个,第二个表示要格式化的类型,可以是date、number、time
     * pattern形如:{0,date,yyyy-MM-dd HH-mm:ss:ms}、{0,number,percent}、{1,number,###.##}
     */
    public static String formatDate2(String source, String sourcePattern, String finalPattern){
        String redate = null;
        redate = MessageFormat.format(finalPattern, new Object[]{DateTool.parseStringToDate(source, sourcePattern)});
        return redate;
    }
    
    
    /*###############################################################################*/
    /*#############################========日期运算方法=======############################*/
    /*###############################################################################*/    
    
    /**
     * 获取当前系统时间,时间格式为默认的系统时间格式。可以通过这个类里面的parseDateToString(Date date, String pattern)
     * 来将Date类型的日期按照自定义的格式进行转换
     * @return 返回的是Date类型
     */
    public static Date getCurrentDate(){
        return Calendar.getInstance().getTime();
    }
    
    /**
     * 给定一个日期,返回这个日期对应的是星期几
     */
    public static String getWeekday(Date date){
        SimpleDateFormat sdf = new SimpleDateFormat("E");
        return sdf.format(date);
    }
    
    /**
     * 获得当前日期N天后的日期
     */
    public static Date addDays(int days){
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DAY_OF_MONTH, days);
        return cal.getTime();
    }
    
    /**
     * 按指定的日期格式pattern得到当前日期N天后的日期
     */
    public static String addDays(int days, String pattern){
        return DateTool.parseDateToString(DateTool.addDays(days), pattern);
    }
    
    /**
     * 获得指定日期  N天后的日期
     */
    public static Date addDays(Date date, int days){
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DAY_OF_MONTH, days);
        return cal.getTime();
    }
    
    /**
     * 计算两个日期间相差的天数
     */
    public static int daysBetween(Date date1, Date date2){
        int between_days;
        Calendar cal = Calendar.getInstance();
        cal.setTime(date1);
        long time1 = cal.getTimeInMillis();//得到date1对应的毫秒数
        cal.setTime(date2);
        long time2 = cal.getTimeInMillis();//得到date2对应的毫秒数
        between_days = (int)(time2 - time1)/(1000*60*60*24);
        return between_days;
    }
    
    /**
     * 得到当前月份的第一天
     */
    public static Date getFirstDayOfCurrentMonth(){
        return DateTool.getFirstDayOfMonth(new Date());
    }
    
    /**
     * 得到当前月份的最后一天
     */
    public static Date getLastDayOfCurrentMonth(){
        return DateTool.getLastDayOfMonth(new Date());
    }
    
    /**
     * 得到上个月的第一天
     */
    public static Date getFirstDayOfPreviousMonth(){
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.DATE, 1);
        cal.add(Calendar.MONTH, -1);
        return cal.getTime();
    }
    
    /**
     * 得到指定日期对应的月份的最后一天
     */
    public static Date getLastDayOfMonth(Date date){
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.set(Calendar.DATE, 1);//将日期设置为当月的1号
        cal.add(Calendar.MONTH, 1);//当前月份加1,变为下个月的1号
        cal.add(Calendar.DATE, -1);//日期-1,变为当前月份的最后一天的日期
        return cal.getTime();
    }
    
    /**
     * 得到指定日期对应月份的第一天
     */
    public static Date getFirstDayOfMonth(Date date){
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.set(Calendar.DATE, 1);
        return cal.getTime();
    }
    
    /**
     * 获得本周星期日的日期
     */
    public static Date getCurrentWeekend(){
        return DateTool.getWeekend(new Date());
    }
    
    /**
     * 获得给定日期对应的周的日期日的日期
     */
    public static Date getWeekend(Date date){
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        // 获得今天是一周的第几天,星期日是第一天,星期二是第二天......
        int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK)-1;// 因为按中国礼拜一作为第一天所以这里减1
        if(dayOfWeek == 0){//传递过来的日期是星期日
            return date;
        }
        cal.add(Calendar.DAY_OF_WEEK, 7-dayOfWeek);
        return cal.getTime();
    }
    
    /**
     * 获得本周一的日期
     */
    public static Date getCurrentMonday(){
        return DateTool.getMonday(new Date());
    }
    
    /**
     * 获得给定日期对就的周的周一的日期
     */
    public static Date getMonday(Date date){
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        // 获得今天是一周的第几天,星期日是第一天,星期二是第二天......
        int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK)-1;// 因为按中国礼拜一作为第一天所以这里减1
        if(dayOfWeek == 0){//传递过来的日期是星期日
            cal.add(Calendar.DAY_OF_WEEK, -6);
            return cal.getTime();
        }
        cal.add(Calendar.DAY_OF_WEEK, -(dayOfWeek-1));
        return cal.getTime();
    }
    
    /**  
     * 判断是否是闰年  
     */
    public static boolean isLeapYear(int year) {   
        return (year%4==0 && year%100!=0) || (year%400==0);
    }   
    
    public static void main(String[] args)
    {
//        System.out.println(DateTool.parseDateToString(new Date()));
//        System.out.println(DateTool.parseStringToDate("2012年09月08日", "yyyy年MM月dd日"));
//        System.out.println(DateTool.formatDate("2012/09/08", "yyyy/MM/dd", "yyyy年MM月dd日"));
//        System.out.println(DateTool.formatDate(new Date(), "yyyy/MM/dd"));
//        System.out.println(DateTool.formatDate2("2012/09/08", "yyyy/MM/dd", "{0,date,yyyy年MM月dd日}"));
//        System.out.println(DateTool.getCurrentDate());
//        System.out.println(DateTool.parseDateToString(new Date(), "yyyy/MM/dd hh:mm:ss"));
//        System.out.println(DateTool.getWeekday(DateTool.parseStringToDate("20120908", "yyyyMMdd")));
//        System.out.println(DateTool.parseDateToString(DateTool.addDays(1), "yyyyMMdd"));
//        System.out.println(DateTool.addDays(3, "yyyyMMdd"));
//        System.out.println(DateTool.addDays(DateTool.parseStringToDate("20120908", "yyyyMMdd"), 2));
//        System.out.println(DateTool.getFirstDayOfCurrentMonth());
//        System.out.println(DateTool.daysBetween(DateTool.parseStringToDate("2012/09/08", "yyyy/MM/dd"), DateTool.parseStringToDate("20120911", "yyyyMMdd")));
//        System.out.println(DateTool.getLastDayOfCurrentMonth());
//        System.out.println(DateTool.getLastDayOfMonth(DateTool.parseStringToDate("20120804", "yyyyMMdd")));
//        System.out.println(DateTool.getFirstDayOfMonth(DateTool.parseStringToDate("20120804", "yyyyMMdd")));
//        System.out.println(DateTool.getCurrentWeekend());
//        System.out.println(DateTool.getWeekend(DateTool.parseStringToDate("20120902", "yyyyMMdd")));
//        System.out.println(DateTool.getMonday(DateTool.parseStringToDate("20120902", "yyyyMMdd")));
    }

}

 

你可能感兴趣的:(java)