java格式化输出间隔_Java中的时间格式化和时间计算的方法

最近工程项目里需要频繁地计算时间,比如取得去年的今天,上个月的现在时间,前几天,后几天等等。一开始都是在需要的地方,写个方法,后来随着工程的开发,这样的时间计算和格式化需要的越来越多。干脆索性就直接写个日期时间管理类。下面就是具体方法代码:

首先定义一些静态常量,通常会作为参数来表达时间的格式等等:

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;

}

由于需要计算时间差,例如前十分钟,前一天等等小额时间差,在这里利用将时间差转换为毫秒数,然后相加减,利用Date构造方法再转换为时间,所以就直接写了个根据时间差数值获取时间差毫秒数的方法。

/**

* 将一个表示时间段的数转换为毫秒数

* @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;

}

}

获 取某一时间的月份和年份,一开始直接用的date.getMonth()方法和date.getYear()方法,不过还是Eclipse工具强大啊,当 我写上时,一道横线提示我该方法已经过时,所以只好在换一个方法了。利用转换格式的写法写的。。。也不知道专不专业,先就这样写上了:

/**

* 只输出一个时间中的月份

* @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);

}

后来翻阅了下资料,发现Calendar类确实很强大啊,提供了很多方法和变量,可以直接使用。。。又将上面的方法改写了一下:

/**

* 只输出一个时间中的月份

* @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);

}

获得一指定时间的前(后)X分钟(秒/小时/天)的时间,分别有输出为Date时间类型和字符串类型,其实后来考虑还有更好地方法,就是利用GregorianCalendat类来实现。

/**

* 获取某一指定时间的前一段时间

* @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类中的set方法很好的解决了计算间隔时间差得具体时间,如果是计算前几年,前几天,等地时候只要吧 set()方法中第一个变量换成Calendar.YEAR,Calendar.DAY_OF_MONTH,Calendar.MINUTE即可。下面是 是API文档里的介绍:GregorianCalendar为每个日历字段使用以下默认值(如果该值未定义)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值