package com.ycsoft.daos.helper;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
/**
* 包含一系列对日期处理的函数
*
* @author hh
* @date Dec 3, 2009 1:16:21 PM
*/
public class DateHelper {
private static NewDateFormat df = new NewDateFormat("yyyy-MM-dd HH:mm:ss");
private static NewDateFormat sdf = new NewDateFormat("yyyy-MM-dd");
/**
* 获取指定日期,输出格式化为yyyy-MM-dd HH:mm:ss
* @return
*/
public static String format(Date date) {
return df.format(date);
}
/**
* 获取当前时刻日期,格式为yyyy-MM-dd HH:mm:ss
* @return
*/
public static String format() {
Date date = new Date();
return df.format(date);
}
/**
* 获取当前日期年份
* @return
*/
public static int getCurrYear() {
Calendar c = Calendar.getInstance();
c.setTime(new Date());
return c.get(Calendar.YEAR);
}
/**
* 获取当前日期月份
* @return
*/
public static int getCurrMonth() {
Calendar c = Calendar.getInstance();
c.setTime(new Date());
return c.get(Calendar.MONTH);
}
/**
* 获取当前日期天
* @return
*/
public static int getCurrDAY() {
Calendar c = Calendar.getInstance();
c.setTime(new Date());
return c.get(Calendar.DATE);
}
/**
* 将时间字符串格式化yyyy-MM-dd HH:mm:ss
* @return
*/
public static String format(String datestr) {
Date date;
try {
date = df.parse(datestr);
} catch (ParseException e) {
date = new Date();
}
return df.format(date);
}
/**
* 将短时间格式时间转换为字符串 yyyy-MM-dd
* @param dateDate
* @return
*/
public static String dateToStr(java.util.Date dateDate) {
String dateString = sdf.format(dateDate);
return dateString;
}
/**
* 将短时间格式字符串转换为时间 yyyy-MM-dd
* @param strDate
* @return
*/
public static Date strToDate(String strDate) {
ParsePosition pos = new ParsePosition(0);
Date strtodate = sdf.parse(strDate, pos);
return strtodate;
}
/**
* 当前日期按分隔符号"spt"分隔返回显示,不含时分秒
* @return
*/
public static String getDate(String spt) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy" + spt + "MM" + spt+ "dd");
java.util.Date date = new java.util.Date();
return sdf.format(date);
}
/**
* 获取给定时间加N天后的日期,
* 如果N为负数那么就是给定时间减天
* @return date
*/
public static java.util.Date addDate(java.util.Date date, int day) {
java.util.Calendar c = java.util.Calendar.getInstance();
c.setTime(date);
c.setTimeInMillis(c.getTimeInMillis() + (long) day * 24 * 3600 * 1000);
return c.getTime();
}
/**
* 获取两个日期之间的间隔天数(1)
* @return
*/
public static int getDiffDays(Date beginDate, Date endDate){
long lBeginTime = beginDate.getTime();
long lEndTime = endDate.getTime();
int iDay = (int) ((lEndTime - lBeginTime) / 86400000);
return iDay;
}
/**
* 获取两个日期之间的间隔天数(2)
* @return
*/
public static int getDifferDays(String beginDate,String endDate) {
Date date1 = null, date2 = null;
int days=0;
try {
date1 = sdf.parse(beginDate);
date2 = sdf.parse(endDate);
days=(int) ((date2.getTime()-date1.getTime())/86400000);
} catch (ParseException e) {
e.printStackTrace();
}
return days;
}
/**
* 获取本月第一天(根据当前时间)
* @return
*/
public static String getFirstDateInCurrentMonth() {
Calendar calendar = Calendar.getInstance();
String year = String.valueOf(calendar.get(Calendar.YEAR));
String month = String.valueOf(calendar.get(Calendar.MONTH)+1);
String day = "01";
return year +"-"+ (month.length() == 1 ? "0" + month : month)+"-" + day;
}
/**
* 获取本月最后一天(根据当前时间)
*/
public String getLastDateInCurrentMonth(){
String str = "";
Calendar lastDate = Calendar.getInstance();
lastDate.set(Calendar.DATE,1);//设为当前月的1号
lastDate.add(Calendar.MONTH,1);//加一个月,变为下月的1号
lastDate.add(Calendar.DATE,-1);//减去一天,变为当月最后一天
str=sdf.format(lastDate.getTime());
return str;
}
/**
* 获取本年度第一天(根据当前时间)
* @return
*/
public static String getFirstDateInCurrentYear() {
Calendar calendar = Calendar.getInstance();
String year = String.valueOf(calendar.get(Calendar.YEAR));
String month = "01";
String day = "01";
return year +"-"+ month+"-" + day+" 00:00:00";
}
/**
* 获取下个月的第一天,根据输入时间
* @return
*/
public static Date getNextMonth(Date date){
Calendar c = Calendar.getInstance();
c.setTime(date);
c.set(Calendar.DAY_OF_MONTH,1);//set the first day.
c.add(Calendar.MONDAY,1); //set next month
return c.getTime();
}
/**
* 获取明天日期 格式yyyy-MM-dd
* @return
*/
public static String getNextDay(){
Calendar c = Calendar.getInstance();
c.add(Calendar.DAY_OF_MONTH,1);
return sdf.format(c.getTime());
}
/**
* 获得一个月共有多少天
* @param date
* @return
*/
public static String getDateSumDay(String date){
String day="";
String month = date.substring(5, 7);
if(month.equals("02")){
if(isLeapYear(date)){
day="29";
}else{
day="28";
}
}else if(month.equals("01")||month.equals("03")||month.equals("05")||month.equals("07")||month.equals("08")||month.equals("10")||month.equals("12")){
day="31";
}else{
day="30";
}
String dateInfo1 = date.substring(0,8)+""+ day ;
return dateInfo1;
}
/**
* 指定日期(默认当天)的第一个时刻
* @param date
* @return
*/
public final static String firstTimestampMonth(Date date) {
String firstDate = sdf.format(new Date()) + " 00:00:00";
if (date != null)
firstDate = sdf.format(date) + " 00:00:00";
return firstDate;
}
/**
* 指定日期(默认当天)的最后时刻
* @param date
* @return
*/
public final static String lastTimestampDate(Date date) {
String lastTime = sdf.format(new Date()) + " 23:59:59";
if (date != null)
lastTime = sdf.format(date) + " 23:59:59";
return lastTime;
}
/**
* 比较两个字符型日期是否一致 yyyy-MM-dd
* @param d1
* @param d2
* @return
*/
public static int compareDate(String d1,String d2){
if (d1.trim().length()>10){
d1 = d1.split(" ")[0];
}
if (d2.trim().length()>10){
d2 = d2.split(" ")[0];
}
GregorianCalendar date1 = new GregorianCalendar();
String[] temp1 = d1.split("-");
date1.set(Calendar.YEAR, Integer.parseInt(temp1[0]));
date1.set(Calendar.MONTH, Integer.parseInt(temp1[1].substring(0,1).equals("0")?temp1[1].substring(1):temp1[1])-1);
date1.set(Calendar.DATE, Integer.parseInt(temp1[2].substring(0,1).equals("0")?temp1[2].substring(1):temp1[2]));
GregorianCalendar date2 = new GregorianCalendar();
String[] temp2 = d2.split("-");
date2.set(Calendar.YEAR, Integer.parseInt(temp2[0]));
date2.set(Calendar.MONTH, Integer.parseInt(temp2[1].substring(0,1).equals("0")?temp2[1].substring(1):temp2[1])-1);
date2.set(Calendar.DATE, Integer.parseInt(temp2[2].substring(0,1).equals("0")?temp2[2].substring(1):temp2[2]));
int result = date1.compareTo(date2);
return result;
}
/**
* 在日期中取出指定部分的字符串值(年、月、日、时、分、秒)
* @param date 格式yyyy-MM-dd HH:mm:ss
* @param part 1年 2月 5日 10时 12分 13秒 Calendar.MONTH;
* @return
*/
public static String GetDatePart(String date, int part) {
try {
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date time =df.parse(date);
df.format(time);
if (Calendar.MONTH == part)
return String.valueOf(df.getCalendar().get(part) + 1);
else
return String.valueOf(df.getCalendar().get(part));
} catch (Exception ex) {
ex.printStackTrace();
return "";
}
}
/**
* 判断date1是否在date2之前
* @param date1 date2 df格式
* @return
*/
public static boolean isDateBefore(String date1,String date2){
try{
return df.parse(date1).before(df.parse(date2));
}catch(ParseException e){
return false;
}
}
/**
* 判断当前时间是否在时间date2之前
* @param date2 df格式
* @return
*/
public static boolean isDateBefore(String date2){
try{
Date date1 = new Date();
return date1.before(df.parse(date2));
}catch(ParseException e){
return false;
}
}
/**
* 给出两个日期,计算他们之间相差的年数|月数|天数
* @param c1 日期1
* @param c2 日期2
* @param what 比较模式,如果是Calendar.YEAR则在年份上比较;
* 如果是Calendar.MONTH则在月数上比较;
* 如果是Calendar.DATE则在天数上比较(默认情形)
* @return 相差的年数或月数或天数
*/
public static int compare(Calendar c1,Calendar c2,int what) {
int number=0;
switch (what) {
case Calendar.YEAR:
number=c1.get(Calendar.YEAR)-c2.get(Calendar.YEAR);
break;
case Calendar.MONTH:
int years=compare(c1,c2,Calendar.YEAR);
number=12*years+c1.get(Calendar.MONTH)-c2.get(Calendar.MONTH);
break;
case Calendar.DATE:
number=(int) ((c1.getTimeInMillis()-c2.getTimeInMillis())/(1000*60*60*24));
break;
default:
number=(int) ((c1.getTimeInMillis()-c2.getTimeInMillis())/(1000*60*60*24));
break;
}
return number;
}
/**
* 判断是否润年
* @param ddate
* @return
*/
public static boolean isLeapYear(String ddate) {
/**
* 详细设计: 1.被400整除是闰年,否则: 2.不能被4整除则不是闰年 3.能被4整除同时不能被100整除则是闰年
* 3.能被4整除同时能被100整除则不是闰年
*/
Date d =strToDate(ddate);
GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
gc.setTime(d);
int year = gc.get(Calendar.YEAR);
if (year % 400 == 0)
return true;
else if (year % 4 == 0) {
if (year % 100 == 0)
return false;
else
return true;
} else
return false;
}
}
/**
* 新的时间类型格式工具
* 解决parse方法在并发下的错误
* @author new
*
*/
class NewDateFormat{
private String format_str=null;
private DateFormat format =null;
public NewDateFormat(String format_str){
this.format_str=format_str;
this.format=new SimpleDateFormat(format_str);
}
public String format(Date date){
return this.format.format(date);
}
public Date parse(String date) throws ParseException{
return new SimpleDateFormat(format_str).parse(date);
}
public Date parse(String date,ParsePosition pos){
return new SimpleDateFormat(format_str).parse(date,pos);
}
}