时间公共类

     自己用到过的时间方法

    

package com.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;

/**
 * 操作时间、日期的工具类
 */
public class DateUtil {
	public static SimpleDateFormat daydf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	public static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
	public static SimpleDateFormat ym = new SimpleDateFormat("yyyy-MM");
	
	private DateUtil(){}
	
    /**
     * 格式化字符串为日期
     * @param day 字符串格式为yyyy-MM-dd
     * @return 日期 Date对象
     */
    public static java.util.Date formatDayTime(String day){
        try {
            return sdf.parse(day);
        } catch (ParseException ex) {
            ex.printStackTrace();
            return new java.util.Date();
        }
    }
    
    public static Date formatToDate(String day){
        try {
            return daydf.parse(day);
        } catch (ParseException ex) {
            ex.printStackTrace();
            return new java.util.Date();
        }
    }


    /**
     * 格式字符串为某年某月的第一天。
     * @param yearmonth 格式为2008-10
     * @return 某年某月的第一天
     */
    public static java.util.Date formatMonthTime(String yearmonth){
        try {
            return sdf.parse(yearmonth + "-01");
        } catch (ParseException ex) {
            ex.printStackTrace();
            return new java.util.Date();
        }
    }
    
	
	/**
	 * 
	 * @return
	 * @throws ParseException 
	 */
	public static String lastDayOfMonth(String yearMonth) throws ParseException{
		Calendar calendar=Calendar.getInstance();   
        Calendar cpcalendar=(Calendar)calendar.clone();  
        cpcalendar.setTime(ym.parse(yearMonth));
        cpcalendar.add(Calendar.MONTH, 1);   
        cpcalendar.add(Calendar.DATE, -1);   
        String date = sdf.format(cpcalendar.getTime());   
        return date;
	}
	
    
    /**
     * 获取当前月有多少天
     * @return
     */
    public static int getDayOfMonth(){
    	Calendar c = Calendar.getInstance(Locale.CHINA);
    	int countDay = c.getActualMaximum(Calendar.DATE);
    	return countDay;
    }
    
    /**
     *返回自1970年1月1日00:00:00GMT以来此日期对象表示的毫秒数
     *@param str 格式为yyyy-MM-dd
     */
    public static long parseDayByYYYYMMDD(String str){
        try {
            return sdf.parse(str).getTime();
        } catch (Exception ex) {
            return 0L;
        }
    }
    /**
     *返回自1970年1月1日00:00:00GMT以来此时间对象表示的秒数
     *@param str 格式为yyyy-MM-dd HH:mm:ss
     */
    public static int parseTimeByYYYYMMDDHHMMSS(String str){
        if(str == null || str.length() != 19) return 0;
        try {
            return (int)(daydf.parse(str).getTime()/1000L);
        } catch (Exception ex) {
            return 0;
        }
    }
    /**
     * 得到 yyyy-MM-dd 格式的指定日期的前一天
     */ 
    public static String foreDay(String day){
        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(parseDayByYYYYMMDD(day));
        cal.add(Calendar.DAY_OF_MONTH, -1);
        return sdf.format(cal.getTime());
    }
    /**
     * 根据时间值构造日期
     */
    public static String parseDay(int time){
        return sdf.format(new java.util.Date(time*1000L));
    }
    /**
     * 显示时间
     * @param millseconds 毫秒数
     * @return 时间显示
     */
    public static String displayTime(long millseconds) {
        if(millseconds < 1000) return millseconds+" ms";
        int seconds = (int)(millseconds/1000);
        if(seconds < 60) return seconds+" s";
        if(seconds < 60*60) return seconds/60+"m"+seconds%60+"s";
        int m = seconds -(seconds/3600)*3600;
        if(seconds < 24*60*60) return seconds/3600+"h"+m/60+"m"+m%60+"s";
        return millseconds+" ms";
    }
    

    /**
     * 转换成yyyy-MM-dd格式的日期字符串
     * @param d Date对象
     */
    public static String formatDay(java.util.Date d){
        return sdf.format(d);
    }
    /**
     * 转换成yyyy-MM-dd格式的日期字符串
     * @param d Calendar对象
     */
    public static String formatDay(java.util.Calendar d){
        return sdf.format(d.getTime());
    }
    /**
     * 转换成yyyy-MM-dd HH:mm:ss格式的时间
     * @param time 毫秒数
     */
    public static String formatyyyyMMddHHmmss(long time){
        return daydf.format(new java.util.Date(time));
    }
    
    /**
     * 转换成yyyy-MM-dd HH:mm:ss格式的时间
     * @param time 毫秒数
     */
    public static String formatyyyyMMdd(long time){
        return sdf.format(new java.util.Date(time));
    }
    
    /**
     * 将时间转换成yyyy-MM-dd HH:mm:ss的格式字符串。
     * @param time 时间对象
     * @return 格式化后的字符串,当输入为null时输出为""
     */
    public static String formatyyyyMMddHHmmss(Date time){
        if(time==null){
            return "";
        }
        try{
            return daydf.format(time);
        }
        catch(Exception ex){
            return "";
        }
    }

    /**
     * 当前日期
     * @return yyyy-MM-dd格式的当前日期
     */
    public static String today() {
        return sdf.format(new java.util.Date());
    }
	
    /**
     * 当前日期的前一天
     * @return 当前日期的前一天
     */
    public static String yesterday(){
        java.util.Calendar cal =java.util.Calendar.getInstance();
        cal.add(java.util.Calendar.DAY_OF_MONTH, -1);
        return sdf.format(cal.getTime());
    }
    

    /**
     * 当前日期的下一天
     * @return 当前日期的下一天
     */
    public static String tomorrow(){
        java.util.Calendar cal =java.util.Calendar.getInstance();
        cal.add(java.util.Calendar.DAY_OF_MONTH, 1);
        return sdf.format(cal.getTime());
    }
        
    /**
     * 返回本月1号
     * @return 返回本月1号
     */
    public static String currmonth1day(){
        java.util.Calendar cal =java.util.Calendar.getInstance();
        cal.set(java.util.Calendar.DAY_OF_MONTH, 1);
        return sdf.format(cal.getTime());
    }
    
    /**
	 * 返回本月最后一天
	 */
	public static String lastDayOfMonth(){
		Calendar calendar=Calendar.getInstance();   
        Calendar cpcalendar=(Calendar)calendar.clone();   
        cpcalendar.set(Calendar.DAY_OF_MONTH,1); 
        cpcalendar.add(Calendar.MONTH, 1);   
        cpcalendar.add(Calendar.DATE, -1);   
        String date = sdf.format( new Date(cpcalendar.getTimeInMillis()));   
        return date;
	}
	
	
	/**
	 * 给指定时间加上一个数值
	 * @param time1 要加上一数值的时间,为null即为当前时间,格式为yyyy-MM-dd HH:mm:ss
	 * @param addpart 要加的部分:年月日时分秒分别为:YMDHFS
	 * @param num 要加的数值
	 * @return 新时间,格式为yyyy-MM-dd HH:mm:ss
	 */
	public static String addTime(String time1,String addpart,int num){
		try{
			String now = daydf.format(new Date());
			time1 = (time1 == null) ? now : time1;
			if (time1.length() < 19){
				time1 += " 00:00:00";
			}
			GregorianCalendar cal = new GregorianCalendar();
			cal.setTime(daydf.parse(time1));
			if (addpart.equalsIgnoreCase("Y")){
				cal.add(Calendar.YEAR,num);
			}else if (addpart.equalsIgnoreCase("M")){
				cal.add(Calendar.MONTH,num);
			}else if (addpart.equalsIgnoreCase("D")){
				cal.add(Calendar.DATE,num);
			}else if (addpart.equalsIgnoreCase("H")){
				cal.add(Calendar.HOUR,num);
			}else if (addpart.equalsIgnoreCase("F")){
				cal.add(Calendar.MINUTE,num);
			}else if (addpart.equalsIgnoreCase("S")){
				cal.add(Calendar.SECOND,num);
			}
			return daydf.format(cal.getTime());
		}
		catch(Exception e){
			throw new RuntimeException(e);
		}
	}
	
	/**
	 * 给指定日期加上一个数值
	 * @param date1 要加上一数值的日期,为null即为当前日期,格式为yyyy-MM-dd
	 * @param addpart 要加的部分:年月日分别为:YMD
	 * @param num 要加的数值
	 * @return 新日期,格式为yyyy-MM-dd
	 */
	public static String addDate(String date1,String addpart,int num){
		return addTime(date1,addpart,num).substring(0,10);
	}
	
	
    /**
     * 当前日期
     * @return yyyy-MM-dd HH:mm:ss格式的当前日期
     */
    public static String now() {
        return daydf.format(new java.util.Date());
    }
    /**
	 * 返回当前时间
	 */
	public static String timeofnow(){
		Calendar curcal = Calendar.getInstance();
		return daydf.format(curcal.getTime());
	}

    /**
     * 得到距离当前天几天的日期表达,格式为1985-12-20。
     * @param step 天数。例如-10表示十天前
     * @return
     */
    public static String dateofSepcial(int step) {
        java.util.Calendar cal = java.util.Calendar.getInstance();
        cal.add(java.util.Calendar.DAY_OF_MONTH, step);
        return sdf.format(cal.getTime());
    }
    
    /**
     * UNIX时间x
     * @return
     */
    public static  String getCurrUnixtimestamp(){
		String ret = "";
		try {
			Date date = daydf.parse("1970-01-01 00:00:00");
			long l = (new Date().getTime() - date.getTime())/1000;
			ret = String.valueOf(l);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return ret;
	}
    
    /**
     * 比较时间大小,精确到时分秒
     */
    public static boolean compareDateYYYYMMDDHHmmss(String date1, String date2) {
        try {
            Date dt1 = daydf.parse(date1);
            Date dt2 = daydf.parse(date2);
            if (dt1.getTime() >= dt2.getTime()) {
            	return true;
            } else if (dt1.getTime() < dt2.getTime()) {
            	return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
    
    
    /**
     * 比较时间大小,精确到天
     */
    public static boolean compareDateYYYYMMDD(String date1, String date2) {
        try {
            Date dt1 = sdf.parse(date1);
            Date dt2 = sdf.parse(date2);
            if (dt1.getTime() >= dt2.getTime()) {
            	return true;
            } else if (dt1.getTime() < dt2.getTime()) {
            	return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
    
    
    /**
     * 计算两日期的差的天数
     * @param smdate 开始日期
     * @param bdate 结束日期
     */
    public static int daysBetween(String smdate,String bdate) {  
    	int num = 0;
    	try {
    		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");  
	        Calendar cal = Calendar.getInstance();    
	        cal.setTime(sdf.parse(smdate));    
	        long time1 = cal.getTimeInMillis();                 
	        cal.setTime(sdf.parse(bdate));    
	        long time2 = cal.getTimeInMillis();         
	        long between_days=(time2-time1)/(1000*3600*24);  
	        num = Integer.parseInt(String.valueOf(between_days)); 
		} catch (Exception e) {
			e.printStackTrace();
		}   
    	
    	return num;
    } 
    
    
    /**
     * 获取传入时间,所在年的周数
     * @param date
     * @return
     */
    public static int getWeekOfYear(String dateStr) {
    	//简单时间格式话类
    	SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd");
    	
		try {
			Date date = simpleDateFormat.parse(dateStr);
			Calendar c = new GregorianCalendar();
	        c.setFirstDayOfWeek(Calendar.MONDAY);
	        c.setMinimalDaysInFirstWeek(7);
	        c.setTime(date);
	        return c.get(Calendar.WEEK_OF_YEAR);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		
		return 1;
    }

    
    /**
     * 获取当前年的最大周数
     * @param year
     * @return
     */
    public static int getMaxWeekNumOfYear(int year) {
    	//简单时间格式话类
    	SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd");
    	
        Calendar c = new GregorianCalendar();
        c.set(year, Calendar.DECEMBER, 31, 23, 59, 59);

        return getWeekOfYear(simpleDateFormat.format(c.getTime()));
    }
    
    /**
     * 获取某年的第几周的开始日期
     * @param year
     * @param week
     * @return
     */
    public static String getFirstDayOfYearOrWeek(int year, int week) {
    	//简单时间格式话类
    	SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd");
    	
        Calendar c = new GregorianCalendar();
        c.set(Calendar.YEAR, year);
        c.set(Calendar.MONTH, Calendar.JANUARY);
        c.set(Calendar.DATE, 1);

        Calendar cal = (GregorianCalendar) c.clone();
        cal.add(Calendar.DATE, week * 7);
        
        
        return getFirstDayOfWeek(simpleDateFormat.format(cal.getTime()));
    }
    
    /**
     * 获取当前时间所在周的开始日期
     * @param dateStr
     * @return
     */
    public static String getFirstDayOfWeek(String dateStr) {
    	//简单时间格式话类
    	SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd");
    	
		try {
			//将字符串格式话为时间
			Date date = simpleDateFormat.parse(dateStr);
		    Calendar c = new GregorianCalendar();
	        c.setFirstDayOfWeek(Calendar.MONDAY);
	        c.setTime(date);
	        c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek()); 	//Monday
	        return simpleDateFormat.format(c.getTime());
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
    }
 
    /**
	 * 获取输入时间,相同周数、相同星期几、去年的日期
	 * @param thisDate
	 * @return
	 */
    public static String getPastWeekEqualDate(String thisDate){
  		//简单时间格式话类
  		SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd");
  		
  		Date date = new Date();
		
  		try {
			date = simpleDateFormat.parse(thisDate);
		} catch (ParseException e) {
			e.printStackTrace();
		}
  		
  		Calendar cal = Calendar.getInstance();  
        //设置时间
        cal.setTimeInMillis(date.getTime());  
        //获取当前年份
        int year = cal.get(Calendar.YEAR);
        
        //获取当前在今年的周数
        int startTimeWeek = DateUtil.getWeekOfYear(thisDate);
        //获取当前日期所在周的开始日期
        String thisWeekDate = DateUtil.getFirstDayOfYearOrWeek(year,startTimeWeek);
        //计算输入日期与所在周第一天的差值
        int insertDiffer =DateUtil.daysBetween(thisWeekDate,thisDate);
        
        //获取去年的最大周树
        int pastYearMaxWeek = DateUtil.getMaxWeekNumOfYear(year-1);
        //如果去年没有当前周,则周数减1
        if(startTimeWeek > pastYearMaxWeek){
        	startTimeWeek = startTimeWeek -1;
        }
        //获取去年的同周数的,第一天
        String paseYearWeekOneDdy = DateUtil.getFirstDayOfYearOrWeek(year-1,startTimeWeek);
        
        //得到去年相同周数的相同的日期
        String pastWeekStartDate = DateUtil.addDate(paseYearWeekOneDdy, "D", insertDiffer);
       
        return pastWeekStartDate;
	}
    
    
    /**
     * 测试
     */
  	public static void main(String[] args) throws ParseException {
  		String thisDate = "2015-07-29";
  		
  		//简单时间格式话类
  		SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd");
  		Date date = simpleDateFormat.parse(thisDate);
  		
  		Calendar cal = Calendar.getInstance();  
        //设置时间
        cal.setTimeInMillis(date.getTime());  
        
        //获取当前年份
        int year = cal.get(Calendar.YEAR);
        
        //获取当前在今年的周数
        int startTimeWeek = DateUtil.getWeekOfYear(thisDate);
        System.out.println("当前周数:" + startTimeWeek);
        
        //获取去年的最大周树
        int pastYearMaxWeek = DateUtil.getMaxWeekNumOfYear(year-1);
        System.out.println("去年最大周数:" + pastYearMaxWeek);
        
        //如果去年没有当前周,则周数减1
        if(startTimeWeek > pastYearMaxWeek){
        	startTimeWeek = startTimeWeek -1;
        }
        
        //获取当前日期所在周的开始日期
        String thisWeekDate = DateUtil.getFirstDayOfYearOrWeek(year,startTimeWeek);
        System.out.println("当前日期所在周的第一天日期:" + thisWeekDate);
        
        
        //获取去年的同周数的,第一天
        String paseYearWeekOneDdy = DateUtil.getFirstDayOfYearOrWeek(year-1,startTimeWeek);
        System.out.println("去年相同周岁的第一天日期:" + paseYearWeekOneDdy);
        
        //计算输入时间所在的周,与当前周的第一天的天数差
        int insertDiffer =DateUtil.daysBetween(thisWeekDate,thisDate);
        System.out.println("输入日期和输入日期所在周的第一天相差天数:" + insertDiffer);
        
        //得到去年相同周数的相同的日期
        String pastWeekDate = DateUtil.addDate(paseYearWeekOneDdy, "D", insertDiffer);
        System.out.println("去年相同周岁相同日期:" + pastWeekDate);
  	}
}

猜你喜欢

转载自x125858805.iteye.com/blog/2233678