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

来源:互联网 发布:开源地面站 安卓源码 编辑:程序博客网 时间:2024/06/11 18:17

一,获取网络时间

 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 stubString 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 1if (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 2if (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 3Calendar 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 blocke.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==1420591920000date2==1420602780000M1--date1在date2前M2--date1在date2前M3--date1在date2前date1==1420591920000date2==1420606380000M1--date1在date2前M2--date1在date2前M3--date1在date2前date1==1420591920000date2==1420609980000M1--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);




1 0
原创粉丝点击