Java中对日期的操作(获取、比较、排序、间隔)

一,获取网络时间

 private void getNetTime() {
        TimeZone.setDefault(TimeZone.getTimeZone("GMT+8")); // 时区设置
        try {
            URL url = new URL("http://www.baidu.com");//取得资源对象
            URLConnection uc = url.openConnection();//生成连接对象
            uc.connect(); //发出连接
            long ld = uc.getDate(); //取得网站日期时间(时间戳) System.currentTimeMillis()
            Date date=new Date(ld);
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA);
            String currTime = formatter.format(date);
            System.out.print("currTime=" + currTime);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

之前使用的url是 www.bjtime.cn,获取到的时间一直是提前两天的,比如今天是2016.03.04,使用bjtime获取到的则是2016.03.02,不知道为啥,使用baidu获取的却是正常的


二、时间的比较


import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;


public class TestTime {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String firstTime = "2015-01-07 08:52";
		String secondTime = "2015-01-07 11:53";
		CompareDateTime(firstTime, secondTime);

		String thirdTime = "2015-01-07 08:52";
		String fourthTime = "2015-01-07 12:53";
		CompareDateTime(thirdTime, fourthTime);

		String fifthTime = "2015-01-07 08:52";
		String sixthTime = "2015-01-07 13:53";
		CompareDateTime(fifthTime, sixthTime);

		String date1 = "2014-12-03";
		String date2 = "2015-01-07";
		System.out.println("天数=="+daysBetween(date1, date2));
		System.out.println("后一天=="+getSpecifiedDayAfter(date1));

	}

	public static boolean CompareDateTime(String time1, String time2) {
		boolean isFirstBig = false;
		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
		try {
			Date date1 = dateFormat.parse(time1);
			Date date2 = dateFormat.parse(time2);
			System.out.println("date1==" +date1.getTime());
			System.out.println("date2==" +date2.getTime());
			// Method 1
			if (date1.getTime() > date2.getTime()) {
				System.out.println("M1--date1在date2后");
				isFirstBig = true;
			} else if (date1.getTime() < date2.getTime()) {
				System.out.println("M1--date1在date2前");
				isFirstBig = false;
			}
			// Method 2
			if (date1.compareTo(date2) == 1) {
				System.out.println("M2--date1在date2后");
				isFirstBig = true;
			} else if (date1.getTime() < date2.getTime()) {
				System.out.println("M2--date1在date2前");
				isFirstBig = false;
			}
			// Method 3
			Calendar cal1 = Calendar.getInstance();
			Calendar cal2 = Calendar.getInstance();
			cal1.setTime(date1);
			cal2.setTime(date2);
			if (cal1.after(cal2)) {
				System.out.println("M3--date1在date2后");
			} else {
				System.out.println("M3--date1在date2前");
			}
		} catch (Exception exception) {
			exception.printStackTrace();
		}
		return isFirstBig;
	}
	
	/**
	 * 计算两天之间的天数
	 * @param startStr
	 * @param endStr
	 * @return
	 */
	public static int daysBetween(String startStr, String endStr) {
		int daysBetween = 0;
		try {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

			Date date1 = sdf.parse(startStr);
			Calendar startDate = Calendar.getInstance();
			startDate.setTime(date1);

			Date date2 = sdf.parse(endStr);
			Calendar endDate = Calendar.getInstance();
			endDate.setTime(date2);

			Calendar date = (Calendar) startDate.clone();

			while (date.before(endDate)) {
				date.add(Calendar.DAY_OF_MONTH, 1);
				daysBetween++;
			}

		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return daysBetween;
	}
	/** 
     * 获得指定日期的后一天 
     *  
     * @param specifiedDay 
     * @return 
     */  
    public static String getSpecifiedDayAfter(String specifiedDay) {  
        Calendar c = Calendar.getInstance();  
        Date date = null;  
        try {  
            date = new SimpleDateFormat("yy-MM-dd").parse(specifiedDay);  
        } catch (ParseException e) {  
            e.printStackTrace();  
        }  
        c.setTime(date);  
        int day = c.get(Calendar.DATE);  
        c.set(Calendar.DATE, day + 1);  
  
        String dayAfter = new SimpleDateFormat("yyyy-MM-dd")  
                .format(c.getTime());  
        return dayAfter;  
    }  
}

运行后控制台输出如下:

date1==1420591920000
date2==1420602780000
M1--date1在date2前
M2--date1在date2前
M3--date1在date2前
date1==1420591920000
date2==1420606380000
M1--date1在date2前
M2--date1在date2前
M3--date1在date2前
date1==1420591920000
date2==1420609980000
M1--date1在date2前
M2--date1在date2前
M3--date1在date2前
天数==35
后一天==2014-12-04

在Java中比较时间或者日期基本上都要转换成Date类型,以上代码主要提供三个比较的方法,compareTo、getTime、after,另外还提供计算两个日期之间的间隔天数,以及根据当前日期获取后一天的日期的方法

代码虽然简单,但粗心大意的我却在这上面耗费了近半天的时间

问题描述:如上,有三组时间对,其中第二组的第二个时间为12点多,在没改之前,只有这组的返回结果是错误的,调试半天找不到原因,后来有网友建议把gettime的值打印出来看看,打出来后发现12点多返回的long值确实比其他几个都小很多,然后把年月日去掉直接比较时间还是同样的结果,然后就突然意识到可能是“时”这个单位的问题,然后就看到了这行代码

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm");
下意识的将这行代码改为
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
再次运行后看结果就正确了,看来区别只在于hh的大小写

然后在博客园看到这样一篇文章 《日期格式化{0:yyyy-MM-dd HH:mm:ss.fff}和{0:yyyy-MM-dd hh:mm:ss.fff}的区别》

{0:yyyy-MM-dd HH:mm:ss.fff}:使用24小时制格式化日期
{0:yyyy-MM-dd hh:mm:ss.fff}:使用12小时制格式化日期

原来就是24小时制和12小时制格式的区别,所以大家以后要注意了,同理还有下面这对:

Calendar.HOUR_OF_DAY:使用24小时

Calendar.HOUR:使用12小时制


三、时间间隔的获取

获取两个时间之间相差多少小时,忽略分和秒,参考网上的,出处找不到了,在此记录下

/**
	 * 两个时间相差距离多少小时
	 * 
	 * @param str1
	 *            时间参数 1 格式:1990-01-01 12:00:00
	 * @param str2
	 *            时间参数 2 格式:2009-01-01 12:00:00
	 * @return long[] 返回值为:{天, 时, 分, 秒}
	 */
	public static long getDistanceTimes(String str1, String str2) {
		DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date one;
		Date two;
		long day = 0;
		long hour = 0;
		long min = 0;
		long sec = 0;
		try {
			one = df.parse(str1);
			two = df.parse(str2);
			long time1 = one.getTime();
			long time2 = two.getTime();
			long diff;
			if (time1 < time2) {
				diff = time2 - time1;
			} else {
				diff = time1 - time2;
			}
			day = diff / (24 * 60 * 60 * 1000);
			hour = (diff / (60 * 60 * 1000) - day * 24);
			min = ((diff / (60 * 1000)) - day * 24 * 60 - hour * 60);
			sec = (diff / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return day*24 + hour;
	}


年月日的比较以及日期间隔的获取

	/**
	 * 起始年月日yyyy-MM-dd与终止年月日yyyy-MM-dd之间的比较。
	 *
	 * @param DATE1
	 *            格式为yyyy-MM-dd
	 * @param DATE2
	 *            格式为yyyy-MM-dd
	 * @return isFirstBig。
	 */
	@SuppressLint("SimpleDateFormat")
	public static boolean CompareDate(String DATE1, String DATE2) {
		boolean isFirstBig = false;
		DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		try {
			Date dt1 = df.parse(DATE1);
			Date dt2 = df.parse(DATE2);
			if (dt1.compareTo(dt2) == 1) {
				System.out.println("dt1 在dt2前");
				isFirstBig = true;
			} else if (dt1.getTime() < dt2.getTime()) {
				System.out.println("dt1在dt2后");
				isFirstBig = false;
			}
		} catch (Exception exception) {
			exception.printStackTrace();
		}
		return isFirstBig;
	}
	/**
	 * 起始年月yyyy-MM与终止月yyyy-MM之间的比较。
	 *
	 * @param DATE1
	 *            格式为yyyy-MM
	 * @param DATE2
	 *            格式为yyyy-MM
	 * @return isFirstBig。
	 */
	@SuppressLint("SimpleDateFormat")
	public static boolean CompareDateMonth(String DATE1, String DATE2) {
		boolean isFirstBig = false;
		DateFormat df = new SimpleDateFormat("yyyy-MM");
		try {
			Date dt1 = df.parse(DATE1);
			Date dt2 = df.parse(DATE2);
			if (dt1.compareTo(dt2) == 1) {
				System.out.println("dt1 在dt2前");
				isFirstBig = true;
			} else if (dt1.getTime() < dt2.getTime()) {
				System.out.println("dt1在dt2后");
				isFirstBig = false;
			}
		} catch (Exception exception) {
			exception.printStackTrace();
		}
		return isFirstBig;
	}

	/**
	 * 起始年月yyyy-MM与终止月yyyy-MM之间跨度的月数。
	 *
	 * @param beginMonth
	 *            格式为yyyy-MM
	 * @param endMonth
	 *            格式为yyyy-MM
	 * @return 整数。
	 */
	public static int getIntervalMonth(String beginMonth, String endMonth) {
		int intBeginYear = Integer.parseInt(beginMonth.substring(0, 4));
		int intBeginMonth = Integer.parseInt(beginMonth.substring(beginMonth
				.indexOf("-") + 1));
		int intEndYear = Integer.parseInt(endMonth.substring(0, 4));
		int intEndMonth = Integer.parseInt(endMonth.substring(endMonth
				.indexOf("-") + 1));

		return ((intEndYear - intBeginYear) * 12)
				+ (intEndMonth - intBeginMonth) + 1;
	}
	/**
	 * 求两个日期相差天数
	 *
	 * @param sd
	 *            起始日期,格式yyyy-MM-dd
	 * @param ed
	 *            终止日期,格式yyyy-MM-dd
	 * @return 两个日期相差天数
	 */
	public static long getIntervalDays(String sd, String ed) {
		return ((java.sql.Date.valueOf(ed)).getTime() - (java.sql.Date
				.valueOf(sd)).getTime())
				/ (3600 * 24 * 1000);
	}

	/**
	 * 得到指定月的天数
	 * */
	public static int getMonthLastDay(int year, int month)
	{
		Calendar a = Calendar.getInstance();
		a.set(Calendar.YEAR, year);
		a.set(Calendar.MONTH, month - 1);
		a.set(Calendar.DATE, 1);//把日期设置为当月第一天
		a.roll(Calendar.DATE, -1);//日期回滚一天,也就是最后一天
		int maxDate = a.get(Calendar.DATE);
		return maxDate;
	}

四、按照日期排序

    public class TimeSort implements Comparator {
        
        public int compare(Object arg0, Object arg1) {
            NoteBean user0 = (NoteBean) arg0;
            NoteBean user1 = (NoteBean) arg1;
            int flag = user1.getTime().compareTo(user0.getTime());
            return flag;
        }
    
    }

调用方法

            TimeSort sort = new TimeSort();
            Collections.sort(beanList, sort);




你可能感兴趣的:(Java)