最近工程项目里需要频繁地计算时间,比如取得去年的今天,上个月的现在时间,前几天,后几天等等。一开始都是在需要的地方,写个方法,后来随着工程的开发,这样的时间计算和格式化需要的越来越多。干脆索性就直接写个日期时间管理类。下面就是具体方法代码:
首先定义一些静态常量,通常会作为参数来表达时间的格式等等:
- private static String TIME_PATTERN="HH:mm:ss";//定义标准时间格式
- private static String DATE_PATTERN_1="yyyy/MM/dd";//定义标准日期格式1
- private static String DATE_PATTERN_2="yyyy-MM-dd";//定义标准日期格式2
- private static String DATE_PATTERN_3="yyyy/MM/dd HH:mm:ss";//定义标准日期格式3,带有时间
- private static String DATE_PATTERN_4="yyyy/MM/dd HH:mm:ss E";//定义标准日期格式4,带有时间和星期
- private static String DATE_PATTERN_5="yyyy年MM月dd日 HH:mm:ss E";//定义标准日期格式5,带有时间和星期
- /**
- * 定义时间类型常量
- */
- private final static int SECOND=1;
- private final static int MINUTE=2;
- private final static int HOUR=3;
- private final static int DAY=4;
项目里一般都是以现在时间作为参考,所以就直接定义了一个全局变量,并用构造方法初始化。
- private Date now;
- public Date getNow() {
- return now;
- }
- public void setNow(Date now) {
- this.now = now;
- }
- /**
- * 构造方法,初始化now时间
- */
- public DateTimeUtil(){
- now=new Date();
- }
下面是Date时间和字符串时间互相转换的两个方法,主要是利用java.text.SimpleDateFormat类。其中由字符串转换为时间的时候,需要捕获异常。
- /**
- * 把一个日期,按照某种格式 格式化输出
- * @param date 日期对象
- * @param pattern 格式模型
- * @return 返回字符串类型
- */
- public String formatDate(Date date, String pattern){
- SimpleDateFormat sdf = new SimpleDateFormat(pattern);
- return sdf.format(date);
- }
- /**
- * 将字符串类型的时间转换为Date类型
- * @param str 时间字符串
- * @param pattern 格式
- * @return 返回Date类型
- */
- public Date formatString(String str,String pattern){
- SimpleDateFormat sdf = new SimpleDateFormat(pattern);
- Date time=null;
- //需要捕获ParseException异常,如不要捕获,可以直接抛出异常,或者抛出到上层
- try {
- time = sdf.parse(str);
- } catch (ParseException e) {
- e.printStackTrace();
- }
- return time;
- }
- /**
- * 将一个表示时间段的数转换为毫秒数
- * @param num 时间差数值,支持小数
- * @param type 时间类型:1->秒,2->分钟,3->小时,4->天
- * @return long类型时间差毫秒数,当为-1时表示参数有错
- */
- public long formatToTimeMillis(double num, int type) {
- if (num <= 0)
- return 0;
- switch (type) {
- case SECOND:
- return (long) (num * 1000);
- case MINUTE:
- return (long) (num * 60 * 1000);
- case HOUR:
- return (long) (num * 60 * 60 * 1000);
- case DAY:
- return (long) (num * 24 * 60 * 60 * 1000);
- default:
- return -1;
- }
- }
- /**
- * 只输出一个时间中的月份
- * @param date
- * @return 返回int数值类型
- */
- public int getMonth(Date date){
- String month=formatDate(date, "MM");//只输出时间
- return Integer.parseInt(month);
- }
- /**
- * 只输出一个时间中的年份
- * @param date
- * @return 返回数值类型
- */
- public int getYear(Date date){
- String year=formatDate(date, "yyyy");//只输出年份
- return Integer.parseInt(year);
- }
- /**
- * 只输出一个时间中的月份
- * @param date
- * @return 返回int数值类型
- */
- public int getMonth(Date date){
- Calendar cal=Calendar.getInstance();//获得一个Calendar实例相当于Date date=new Date()
- return cal.MONTH;
- }
- /**
- * 只输出一个时间中的年份
- * @param date
- * @return 返回数值类型
- */
- public int getYear(Date date){
- Calendar cal=Calendar.getInstance();//获得一个Calendar实例相当于Date date=new Date()
- return cal.YEAR;
- }
- /**
- * 得到一个日期函数的格式化时间
- * @param date 日期对象
- * @return
- */
- public String getTimeByDate(Date date){
- return formatDate(date, TIME_PATTERN);
- }
- /**
- * 获取当前的时间,new Date()获取当前的日期
- * @return
- */
- public String getNowTime(){
- return formatDate(new Date(), TIME_PATTERN);
- }
- /**
- * 获取某一指定时间的前一段时间
- * @param num 时间差数值
- * @param type 时间差类型:1->秒,2->分钟,3->小时,4->天
- * @param date 参考时间
- * @return 返回格式化时间字符串
- */
- public String getPreTimeStr(double num,int type, Date date){
- long nowLong=date.getTime();//将参考日期转换为毫秒时间
- Date time = new Date(nowLong-formatToTimeMillis(num, type));//减去时间差毫秒数
- return getTimeByDate(time);
- }
- /**
- * 获取某一指定时间的前一段时间
- * @param num 时间差数值
- * @param type 时间差类型:1->秒,2->分钟,3->小时,4->天
- * @param date 参考时间
- * @return 返回Date对象
- */
- public Date getPreTime(double num,int type, Date date){
- long nowLong=date.getTime();//将参考日期转换为毫秒时间
- Date time = new Date(nowLong-formatToTimeMillis(num, type));//减去时间差毫秒数
- return time;
- }
- /**
- * 获取某一指定时间的后一段时间
- * @param num 时间差数值
- * @param type 时间差类型:1->秒,2->分钟,3->小时,4->天
- * @param date 参考时间
- * @return 返回格式化时间字符串
- */
- public String getNextTimeStr(double num,int type, Date date){
- long nowLong=date.getTime();//将参考日期转换为毫秒时间
- Date time = new Date(nowLong+formatToTimeMillis(num, type));//加上时间差毫秒数
- return getTimeByDate(time);
- }
- /**
- * 获取某一指定时间的后一段时间
- * @param num 时间差数值
- * @param type 时间差类型:1->秒,2->分钟,3->小时,4->天
- * @param date 参考时间
- * @return 返回Date对象
- */
- public Date getNextTime(double num,int type, Date date){
- long nowLong=date.getTime();//将参考日期转换为毫秒时间
- Date time = new Date(nowLong+formatToTimeMillis(num, type));//加上时间差毫秒数
- return time;
- }
下面就是利用GregorianCalendar类实现的获取前几个月(或后几个月的当前时间)的方法:
- /**
- * 得到前几个月的现在
- * 利用GregorianCalendar类的set方法来实现
- * @param num
- * @param date
- * @return
- */
- public Date getPreMonthTime(int num, Date date){
- GregorianCalendar gregorianCal = new GregorianCalendar();
- gregorianCal.set(Calendar.MONTH, gregorianCal.get(Calendar.MONTH) - num);
- return gregorianCal.getTime();
- }
- /**
- * 得到后几个月的现在时间
- * 利用GregorianCalendar类的set方法来实现
- * @param num
- * @param date
- * @return
- */
- public Date getNextMonthTime(int num, Date date){
- GregorianCalendar gregorianCal = new GregorianCalendar();
- gregorianCal.set(Calendar.MONTH, gregorianCal.get(Calendar.MONTH) + num);
- return gregorianCal.getTime();
- }
GregorianCalendar
为每个日历字段使用以下默认值(如果该值未定义)。
字段 | 默认值 |
ERA | AD |
YEAR | 1970 |
MONTH | JANUARY |
DAY_OF_MONTH | 1 |
DAY_OF_WEEK | 一个星期的第一天 |
WEEK_OF_MONTH | 0 |
DAY_OF_WEEK_IN_MONTH | 1 |
AM_PM | AM |
HOUR, HOUR_OF_DAY, MINUTE, SECOND, MILLISECOND | 0 |