近段时间关于日期的东西真是太烦人了,又是日期转换又是日期比较的,根据“合格的程序员就是不写重复代码的程序员”的指示精神。总结了一些,写了一个比较全的日期类,可以打成jar包来用。
package com.running.util;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
/**
* <p>Name: 日期工具类(DateUtils)</p>
* <p>Author: No24</p>
* <p>Date: 2006-9-12 12:22:40</p>
* <p>Modifier: Fifth</p>
* <p>DateLastModified: 2008-7-21 17:07</p>
* <p>Version: V1.0.1</p>
* <p>Description: </p>
* <p>Remark: 提供一些常用的日期方法
* V1.0.1版本添加了getDate的默认方法
* </p>
* <p>Copyright: Copyright (c) No24 All rights reserved.</p>
* <p>Company: XCY</p>
* @author No24
* @version 1.0
*/
public abstract class DateUtils {
private static final String DEFAULT_DATE_TIME = "yyyy-MM-dd HH:mm:ss";
/**
* 按指定格式获得当前日期字符串
* @param format 格式字符串
* @return 返回指定格式的当前日期字符串
*/
public static String getDate(String format) {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.format(date);
}
/**
* 按默认的格式获得当前日期字符串
* @param format 格式字符串
* @return 返回指定格式的当前日期字符串
*/
public static String getDate(){
return new SimpleDateFormat(DEFAULT_DATE_TIME).format(new Date());
}
/**
* 按指定格式获得指定日期字符串
* @param format 格式字符串
* @param date 指定日期
* @return 返回指定格式的指定日期字符串
*/
public static String getDate(String format, Date date) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.format(date);
}
/**
* 获得指定日期前面或后面某小时的日期
* @param date 日期
* @param i 相差的小时数(负值为前面的日期)
* @return 返回指定日期前面或后面某小时的日期
*/
public static Date relationSecond(Date date, int i) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.SECOND, i);
return cal.getTime();
}
/**
* 获得指定日期前面或后面某小时的日期
* @param date 日期
* @param i 相差的小时数(负值为前面的日期)
* @return 返回指定日期前面或后面某小时的日期
*/
public static Date relationMinute(Date date, int i) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.MINUTE, i);
return cal.getTime();
}
/**
* 获得指定日期前面或后面某小时的日期
* @param date 日期
* @param i 相差的小时数(负值为前面的日期)
* @return 返回指定日期前面或后面某小时的日期
*/
public static Date relationHour(Date date, int i) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.HOUR, i);
return cal.getTime();
}
/**
* 获得指定日期前面或后面某天的日期
* @param date 日期
* @param i 相差的天数(负值为前面的日期)
* @return 返回指定日期前面或后面某天的日期
*/
public static Date relationDate(Date date, int i) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DATE, i);
return cal.getTime();
}
/**
* 获得指定日期前面或后面某月的日期
* @param date 日期
* @param i 相差的月数(负值为前面的日期)
* @return 返回指定日期前面或后面某天的日期
*/
public static Date relationMonth(Date date, int i) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.MONTH, i);
return cal.getTime();
}
/**
* 转换日期字符串成日期对象
* @param s 日期字符串
* @return 返回日期对象
* @throws Exception
*/
public static Date parseDate(String s) throws Exception {
DateFormat df = DateFormat.getDateInstance(DateFormat.DEFAULT,new Locale("zh", "CN"));
return df.parse(s);
}
public static Date parseDate(String s,String format) throws Exception {
SimpleDateFormat sdf = null;
if (format == null) {
sdf = new SimpleDateFormat(DEFAULT_DATE_TIME);
} else {
sdf = new SimpleDateFormat(format);
}
return sdf.parse(s);
}
public static String getDirDate(){
Calendar calendar = Calendar.getInstance();
return calendar.get(Calendar.YEAR) + "/"+ (calendar.get(Calendar.MONTH)+1) + "/" + calendar.get(Calendar.DAY_OF_MONTH) + "/";
}
// public static
//2011-1-14 闫振伟添加
//获得指定日期的本月最初时间和最后时间
public static String getDate(int num,Date date){
String stringDate="";
SimpleDateFormat sf=null;
if(num==1){
sf=new SimpleDateFormat("yyyy-MM");
stringDate=sf.format(date)+"-"+getFirstDayOfMonth(new Date())+" 00:00:00";
}else if(num==2){
sf=new SimpleDateFormat("yyyy-MM");
int lastDay=getLastDayOfMonth(new Date());
stringDate=sf.format(date)+"-"+lastDay+" 23:59:59";
}
return stringDate;
}
//获得某个月的第一天
private static int getFirstDayOfMonth(Date a){
Calendar b = Calendar.getInstance();
b.setTime(a);
int firstDay = b.getActualMinimum(Calendar.DAY_OF_MONTH);
return firstDay;
}
//获得某个月的最后一天
private static int getLastDayOfMonth(Date a){
Calendar b = Calendar.getInstance();
b.setTime(a);
int lastDay = b.getActualMaximum(Calendar.DAY_OF_MONTH);
return lastDay;
}
/**
* @param date1 需要比较的时间 不能为空(null),需要正确的日期格式 ,如:2009-09-12
* @param date2 被比较的时间 为空(null)则为当前时间
* @param stype 返回值类型 0为多少天,1为多少个月,2为多少年
* @return
* 举例:
* compareDate("2009-09-12", null, 0);//比较天
* compareDate("2009-09-12", null, 1);//比较月
* compareDate("2009-09-12", null, 2);//比较年
*/
public static int compareDate(String startDay,String endDay,int stype){
int n = 0;
String[] u = {"天","月","年"};
String formatStyle = stype==1?"yyyy-MM":"yyyy-MM-dd";
endDay = endDay==null?getCurrentDate("yyyy-MM-dd"):endDay;
DateFormat df = new SimpleDateFormat(formatStyle);
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
try {
c1.setTime(df.parse(startDay));
c2.setTime(df.parse(endDay));
} catch (Exception e3) {
System.out.println("时间在初始化时出错!");
}
//List list = new ArrayList();
while (!c1.after(c2)) { // 循环对比,直到相等,n 就是所要的结果
//list.add(df.format(c1.getTime())); // 这里可以把间隔的日期存到数组中 打印出来
n++;
if(stype==1){
c1.add(Calendar.MONTH, 1); // 比较月份,月份+1
}
else{
c1.add(Calendar.DATE, 1); // 比较天数,日期+1
}
}
n = n-1;
if(stype==2){
n = (int)n/365;
}
//System.out.println(startDay+" -- "+endDay+" 相差多少"+u[stype]+":"+n);
return n;
}
public static String compareTime(String startTime,String endTime,String format){
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
DateFormat df = new SimpleDateFormat(format);
try {
c1.setTime(df.parse(startTime));
c2.setTime(df.parse(endTime));
} catch (Exception e3) {
System.out.println("时间在初始化时出错!");
}
if(c1.after(c2)){
return "after";
}else if(c2.after(c1)){
return "before";
}else{
return "equals";
}
}
public static String getCurrentDate(String format){
Calendar day=Calendar.getInstance();
day.add(Calendar.DATE,0);
SimpleDateFormat sdf=new SimpleDateFormat(format);//"yyyy-MM-dd"
String date = sdf.format(day.getTime());
return date;
}
public static void main(String[] args){
//按指定类型获得当前时间
String date1=DateUtils.getDate("今天是 yyyy-MM-dd");
//按默认格式获得当前时间,默认格式是yyyy-MM-dd hh:mm:ss
String date2=DateUtils.getDate();
//按指定格式格式化指定日期
String date3=DateUtils.getDate("yyyy--MM--dd",new Date());
//获得指定日期前后的天数
Date date4=DateUtils.relationDate(new Date(), 0);
//获得指定日期前后的月数
Date date5=DateUtils.relationMonth(new Date(), 0);
//获得指定日期前后的小时数
Date date6=DateUtils.relationHour(new Date(), -1);
//获得指定日期前后的分钟数
Date date7=DateUtils.relationMinute(new Date(), -1);
//获得指定日期前后的秒数
Date date8=DateUtils.relationSecond(new Date(), -1);
//将日期字符串转换为日期对象
try {
Date date9=DateUtils.parseDate("2010-11-11");
System.out.println(DateUtils.getDate("yyyy-MM-dd", date9));
Date date10=DateUtils.parseDate("2010-11-11 19:23:59","yyyy-MM-dd hh:mm:ss");
String date11=DateUtils.getDirDate();
System.out.println("-------------");
System.out.println("date9="+date9);
System.out.println("date10="+date10);
System.out.println(date11);
System.out.println("-------------");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(date1);
System.out.println(date2);
System.out.println(date3);
System.out.println(date4);
System.out.println(date5);
System.out.println(date6);
System.out.println(date7);
System.out.println(date8);
String date12=DateUtils.getDate(1, new Date());
System.out.println(date12);
String date13=DateUtils.getDate(2, new Date());
System.out.println(date13);
int date14=DateUtils.getLastDayOfMonth(new Date());
System.out.println(date14);
int date15=DateUtils.getFirstDayOfMonth(new Date());
System.out.println(date15);
}
}
附上我的API,大家看了之后要多提建议呀。