zoukankan      html  css  js  c++  java
  • java日期处理简单封装

    今天没什么事情做,温习一下基本知识,在网上看到和日期处理的相关框架,什么joda,date4j等,都宣称超级强大简单易用。下下来试了下,确实都挺不错。不过自己不是经常涉及到日期操作,且涉及到的也不复杂。且不说这些库的功能强不强大,单说为了处理个时间就引入几十个类,实在有点浪费了。再说JDK提供的Calendar和SimpleDateFormat组合使用功能也还是非常强大啊。如果觉得同时使用这两个类稍显麻烦,可以稍微封装一下,即可满足大部分需求,就一个类,自己需要用到什么功能的时候,添加进去就行了。

      1 package luojing.date;
      2 
      3 import java.io.Serializable;
      4 import java.text.ParseException;
      5 import java.text.SimpleDateFormat;
      6 import java.util.Calendar;
      7 import java.util.Date;
      8 import java.util.TimeZone;
      9 
     10 /**
     11  * 日期时间处理封装
     12  * 
     13  * @author luojing
     14  */
     15 public class DateTime implements Comparable<DateTime>, Serializable {
     16 
     17     private static final long serialVersionUID = 4715414577633839197L;
     18     private Calendar calendar = Calendar.getInstance();
     19     private SimpleDateFormat sdf = new SimpleDateFormat();
     20 
     21     private final String DEFAULT_DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
     22     private final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd";
     23     private final String DEFAULT_TIME_PATTERN = "HH:mm:ss";
     24 
     25     public DateTime() {
     26     }
     27 
     28     public DateTime(String dateStr) {
     29         try {
     30             parse(dateStr);
     31         } catch (Exception e) {
     32             e.printStackTrace();
     33         }
     34     }
     35 
     36     public DateTime(String dateStr, TimeZone timeZone) {
     37         this(dateStr);
     38         calendar.setTimeZone(timeZone);
     39     }
     40 
     41     public DateTime(String dateStr, String pattern) {
     42         try {
     43             parse(dateStr, pattern);
     44         } catch (Exception e) {
     45             e.printStackTrace();
     46         }
     47     }
     48 
     49     public DateTime(String dateStr, String pattern, TimeZone timeZone) {
     50         this(dateStr, pattern);
     51         calendar.setTimeZone(timeZone);
     52     }
     53 
     54     public DateTime(int year, int month, int day, int hour, int minute, int second) {
     55         calendar.set(year, month, day, hour, minute, second);
     56     }
     57 
     58     public DateTime(int year, int month, int day, int hour, int minute, int second, TimeZone timeZone) {
     59         this(year, month, day, hour, minute, second);
     60         calendar.setTimeZone(timeZone);
     61     }
     62 
     63     public DateTime(long milliSeconds) {
     64         calendar.setTimeInMillis(milliSeconds);
     65     }
     66 
     67     public Calendar getCalendar() {
     68         return calendar;
     69     }
     70 
     71     public void setCalendar(Calendar calendar) {
     72         this.calendar = calendar;
     73     }
     74 
     75     public Date getDate() {
     76         return calendar.getTime();
     77     }
     78 
     79     public void setDate(Date date) {
     80         calendar.setTime(date);
     81     }
     82 
     83     public int getYear() {
     84         return calendar.get(Calendar.YEAR);
     85     }
     86 
     87     public void setYear(int year) {
     88         calendar.set(Calendar.YEAR, year);
     89     }
     90 
     91     public int getMonth() {
     92         return calendar.get(Calendar.MONTH);
     93     }
     94 
     95     public void setMonth(int month) {
     96         calendar.set(Calendar.MONTH, month);
     97     }
     98 
     99     public int getDay() {
    100         return calendar.get(Calendar.DAY_OF_MONTH);
    101     }
    102 
    103     public void setDay(int dayOfMonth) {
    104         calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
    105     }
    106 
    107     public int getHour() {
    108         return calendar.get(Calendar.HOUR_OF_DAY);
    109     }
    110 
    111     public void setHour(int hour) {
    112         calendar.set(Calendar.HOUR_OF_DAY, hour);
    113     }
    114 
    115     public int getMinute() {
    116         return calendar.get(Calendar.MINUTE);
    117     }
    118 
    119     public void setMinute(int minute) {
    120         calendar.set(Calendar.MINUTE, minute);
    121     }
    122 
    123     public int getSecond() {
    124         return calendar.get(Calendar.SECOND);
    125     }
    126 
    127     public void setSecond(int second) {
    128         calendar.set(Calendar.SECOND, second);
    129     }
    130 
    131     public long getTimeInMilliSeconds() {
    132         return calendar.getTimeInMillis();
    133     }
    134 
    135     public void setTimeInMilliSeconds(long milliSeconds) {
    136         calendar.setTimeInMillis(milliSeconds);
    137     }
    138 
    139     public TimeZone getTimeZone() {
    140         return calendar.getTimeZone();
    141     }
    142 
    143     public void setTimeZone(TimeZone timeZone) {
    144         calendar.setTimeZone(timeZone);
    145     }
    146 
    147     /**
    148      * 使用默认格式解析日期字符串
    149      * 
    150      * @param dateStr
    151      * @throws Exception
    152      */
    153     public void parse(String dateStr) throws Exception {
    154         try {
    155             parse(dateStr, DEFAULT_DATETIME_PATTERN);
    156         } catch (Exception e) {
    157             try {
    158                 parse(dateStr, DEFAULT_DATE_PATTERN);
    159             } catch (Exception e1) {
    160                 try {
    161                     parse(dateStr, DEFAULT_TIME_PATTERN);
    162                 } catch (Exception e2) {
    163                     throw new Exception("the date string [" + dateStr + "] could not be parsed");
    164                 }
    165             }
    166         }
    167 
    168     }
    169 
    170     /**
    171      * 使用给定模式解析日期字符串
    172      * 
    173      * @param dateStr
    174      * @param pattern
    175      * @throws Exception
    176      */
    177     public void parse(String dateStr, String pattern) throws Exception {
    178         if (dateStr == null) {
    179             throw new NullPointerException("date string could not be null");
    180         }
    181 
    182         if (pattern == null) {
    183             throw new NullPointerException("the pattern string could not be null");
    184         }
    185 
    186         try {
    187             sdf.applyPattern(pattern);
    188             sdf.parse(dateStr);
    189         } catch (ParseException e) {
    190             throw new Exception("the date string [" + dateStr + "] could not be parsed with the pattern [" + pattern + "]");
    191         }
    192         calendar = sdf.getCalendar();
    193     }
    194 
    195     /**
    196      * 格式化当前DateTime对象代表的时间
    197      * 
    198      * @param pattern
    199      * @return
    200      */
    201     public String format(String pattern) {
    202         sdf.applyPattern(pattern);
    203         return sdf.format(calendar.getTime());
    204     }
    205 
    206     /**
    207      * 获取默认格式日期字符串
    208      * 
    209      * @return
    210      */
    211     public String toDateTimeString() {
    212         sdf.applyPattern(DEFAULT_DATETIME_PATTERN);
    213         return sdf.format(calendar.getTime());
    214     }
    215 
    216     @Override
    217     public int compareTo(DateTime otherDateTime) {
    218         return calendar.compareTo(otherDateTime.getCalendar());
    219     }
    220 
    221     /**
    222      * 是否闰年
    223      * 
    224      * @return
    225      */
    226     public boolean isLeapYear() {
    227         int year = getYear();
    228         boolean result = false;
    229         if (year % 100 == 0) {
    230             if (year % 400 == 0) {
    231                 result = true;
    232             }
    233         } else if (year % 4 == 0) {
    234             result = true;
    235         }
    236         return result;
    237     }
    238 
    239     /**
    240      * 获取星期
    241      * 
    242      * @return
    243      */
    244     public int getDayOfWeek() {
    245         return calendar.get(Calendar.DAY_OF_WEEK);
    246     }
    247 
    248     /**
    249      * 是否周末
    250      * 
    251      * @return
    252      */
    253     public boolean isWeekend() {
    254         int dayOfWeek = getDayOfWeek();
    255         return dayOfWeek == 1 || dayOfWeek == 7;
    256     }
    257 
    258     /**
    259      * 当前DateTime对象月份天数
    260      * 
    261      * @return
    262      */
    263     public int getDayNumsInMonth() {
    264         Calendar c = (Calendar) calendar.clone();
    265         c.set(Calendar.DAY_OF_MONTH, 1);
    266         c.roll(Calendar.DAY_OF_MONTH, -1);
    267         return c.get(Calendar.DAY_OF_MONTH);
    268     }
    269 
    270     /**
    271      * 两个日期之间间隔天数
    272      * 
    273      * @param otherDateTime
    274      * @return
    275      */
    276     public int dayNumFrom(DateTime otherDateTime) {
    277         long millis = Math.abs(getTimeInMilliSeconds() - otherDateTime.getTimeInMilliSeconds());
    278         int days = (int) Math.floor(millis / 86400000);
    279         return days;
    280     }
    281 
    282     public boolean lessThan(DateTime otherDateTime) {
    283         return compareTo(otherDateTime) < 0;
    284     }
    285 
    286     public boolean greaterThan(DateTime otherDateTime) {
    287         return compareTo(otherDateTime) > 0;
    288     }
    289 
    290     public boolean equal(DateTime otherDateTime) {
    291         return compareTo(otherDateTime) == 0;
    292     }
    293 
    294     /**
    295      * 当前时间基础上增加秒数(负数时为减)
    296      * 
    297      * @param amount
    298      */
    299     public void plusSecond(int amount) {
    300         calendar.add(Calendar.SECOND, amount);
    301     }
    302 
    303     public void plusMinute(int amount) {
    304         calendar.add(Calendar.MINUTE, amount);
    305     }
    306 
    307     public void plusHour(int amount) {
    308         calendar.add(Calendar.HOUR, amount);
    309     }
    310 
    311     public void plusDays(int amount) {
    312         calendar.add(Calendar.DAY_OF_MONTH, amount);
    313     }
    314 
    315     public void plusMonth(int amount) {
    316         calendar.add(Calendar.MONTH, amount);
    317     }
    318 
    319     public void plusYear(int amount) {
    320         calendar.add(Calendar.YEAR, amount);
    321     }
    322 
    323     public void plus(int year, int month, int day, int hour, int minute, int second) {
    324         plusYear(year);
    325         plusMonth(month);
    326         plusDays(day);
    327         plusHour(hour);
    328         plusMinute(minute);
    329         plusSecond(second);
    330     }
    331 
    332 }

    测试:

     1 package luojing.date;
     2 
     3 import java.util.Date;
     4 
     5 public class DateTimeTest {
     6 
     7     public static void main(String[] args) throws Exception {
     8         DateTime dateTime = new DateTime();
     9         DateTime dateTime2 = new DateTime("2013-12-12");
    10         System.out.println("默认格式输出:" + dateTime.toDateTimeString());
    11         System.out.println("是否闰年:" + dateTime.isLeapYear());
    12         System.out.println("自定义格式输出:" + dateTime.format("yyyy-MM-dd"));
    13         System.out.println("输出到毫秒:" + dateTime.format("yyyy-MM-dd HH:mm:ss.SSS"));
    14         System.out.println("某月天数:" + dateTime.getDayNumsInMonth());
    15         System.out.println("星期:" + dateTime.getDayOfWeek());//1:星期日,7:星期六
    16         System.out.println("是否周末:" + dateTime.isWeekend());
    17         System.out.println("相距:" + dateTime.dayNumFrom(dateTime2) + "天");
    18         
    19         dateTime.plusMonth(1);
    20         System.out.println("增加一个月后的datetime: " + dateTime.toDateTimeString());
    21         dateTime.plus(0, 0, 2, 4, 4, 5);
    22         System.out.println("增加 XXX后的datetime: " + dateTime.toDateTimeString());
    23         System.out.println("毫秒数:" + dateTime.getTimeInMilliSeconds());
    24         
    25         //DateTime转换为Date
    26         Date date = dateTime.getDate();
    27         System.out.println( dateTime.getTimeInMilliSeconds() == date.getTime());
    28     }
    29 }

    输出:

    默认格式输出:2013-09-25 19:16:15
    是否闰年:false
    自定义格式输出:2013-09-25
    输出到毫秒:2013-09-25 19:16:15.278
    某月天数:30
    星期:4
    是否周末:false
    相距:77天
    增加一个月后的datetime: 2013-10-25 19:16:15
    增加 XXX后的datetime: 2013-10-27 23:20:20
    毫秒数:1382887220278
    true

    本人使用到日期处理相关的操作,大多就是格式化时间和时间之间的比较。这个封装已经完全能够满足我的日常需要了,再说,即使找不到合适的封装方法,还可以直接获取包装的calendar对象来做处理。

  • 相关阅读:
    php 参数 注释
    Ubuntu11.04下Memcached和php5memcache的安装与基本使用
    在php中使用UNIX System V IPC机制共享应用程序数据
    zend studio 使用SVN配置工具
    php 参数 注释
    zend studio 使用SVN配置工具
    IBM Tivoli Monitoring Manager
    my security / csdn / 2000w / chakaifang.info
    my phone blackberry priv / blackberry keyone / heimei
    OS + Unix FreeBSD / MacOSX Snow Leopard 10.6.38 / MacBook Pro / apple / MC373
  • 原文地址:https://www.cnblogs.com/jdluojing/p/3339368.html
Copyright © 2011-2022 走看看