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"))); } }