欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java常见的时间工具类-DateUtils

程序员文章站 2022-03-20 13:09:38
``` package com.app.common.util; import java.text.DecimalFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util. ......
package com.app.common.util;
import java.text.decimalformat;
import java.text.parseexception;
import java.text.simpledateformat;
import java.util.calendar;
import java.util.date;
import org.apache.commons.lang3.time.dateformatutils;

public class dateutils {
    
   /**
    * 仅显示年月日,例如 2015-08-11.
    */
   public static final string date_format = "yyyy-mm-dd";
   /**
    * 显示年月日时分秒,例如 2015-08-11 09:51:53.
    */
   public static final string datetime_format = "yyyy-mm-dd hh:mm:ss";

   /**
    * 仅显示时分秒,例如 09:51:53.
    */
   public static final string time_format = "hh:mm:ss";

   /**
    * 每天的毫秒数 8640000.
    */
   public static final long milliseconds_per_day = 86400000l;

   /**
    * 每周的天数.
    */
   public static final long days_per_week = 7l;

   /**
    * 每小时毫秒数.
    */
   public static final long milliseconds_per_hour = 3600000l;

   /**
    * 每分钟秒数.
    */
   public static final long seconds_per_minute = 60l;

   /**
    * 每小时秒数.
    */
   public static final long seconds_per_hour = 3600l;

   /**
    * 每天秒数.
    */
   public static final long seconds_per_day = 86400l;

   /**
    * 每个月秒数,默认每月30天.
    */
   public static final long seconds_per_month = 2592000l;

   /**
    * 每年秒数,默认每年365天.
    */
   public static final long seconds_per_year = 31536000l;

   /**
    * 常用的时间格式.
    */
   private static string[] parsepatterns = { "yyyy-mm-dd", "yyyy-mm-dd hh:mm:ss", "yyyy-mm-dd hh:mm", "yyyy/mm/dd",
         "yyyy/mm/dd hh:mm:ss", "yyyy/mm/dd hh:mm" };

   /**
    * 得到当前日期字符串.
    * @return string 日期字符串,例如2015-08-11
    * @since 1.0
    */
   public static string getdate() {
      return getdate(dateutils.date_format);
   }

   /**
    * 得到当前时间字符串.
    * @return string 时间字符串,例如 09:51:53
    * @since 1.0
    */
   public static string gettime() {
      return formatdate(new date(), dateutils.time_format);
   }

   /**
    * 得到当前日期和时间字符串.
    * @return string 日期和时间字符串,例如 2015-08-11 09:51:53
    * @since 1.0
    */
   public static string getdatetime() {
      return formatdate(new date(), dateutils.datetime_format);
   }

   /**
    * 获取当前时间指定格式下的字符串.
    * @param pattern
    *            转化后时间展示的格式,例如"yyyy-mm-dd","yyyy-mm-dd hh:mm:ss"等
    * @return string 格式转换之后的时间字符串.
    * @since 1.0
    */
   public static string getdate(string pattern) {
      return dateformatutils.format(new date(), pattern);
   }

   /**
    * 获取指定日期的字符串格式.
    * @param date  需要格式化的时间,不能为空
    * @param pattern 时间格式,例如"yyyy-mm-dd","yyyy-mm-dd hh:mm:ss"等
    * @return string 格式转换之后的时间字符串.
    * @since 1.0
    */
   public static string getdate(date date, string pattern) {
      return dateformatutils.format(date, pattern);
   }

   /**
    * 获取日期时间字符串,默认格式为(yyyy-mm-dd).
    * @param date 需要转化的日期时间
    * @param pattern 时间格式,例如"yyyy-mm-dd" "hh:mm:ss" "e"等
    * @return string 格式转换后的时间字符串
    * @since 1.0
    */
   public static string formatdate(date date, object... pattern) {
      string formatdate = null;
      if (pattern != null && pattern.length > 0) {
         formatdate = dateformatutils.format(date, pattern[0].tostring());
      } else {
         formatdate = dateformatutils.format(date, dateutils.date_format);
      }
      return formatdate;
   }

   /**
    * 获取当前年份字符串.
    * @return string 当前年份字符串,例如 2015
    * @since 1.0
    */
   public static string getyear() {
      return formatdate(new date(), "yyyy");
   }

   /**
    * 获取当前月份字符串.
    * @return string 当前月份字符串,例如 08
    * @since 1.0
    */
   public static string getmonth() {
      return formatdate(new date(), "mm");
   }

   /**
    * 获取当前天数字符串.
    * @return string 当前天数字符串,例如 11
    * @since 1.0
    */
   public static string getday() {
      return formatdate(new date(), "dd");
   }

   /**
    * 获取当前星期字符串.
    * @return string 当前星期字符串,例如星期二
    * @since 1.0
    */
   public static string getweek() {
      return formatdate(new date(), "e");
   }

   /**
    * 将日期型字符串转换为日期格式.
    * 支持的日期字符串格式包括"yyyy-mm-dd","yyyy-mm-dd hh:mm:ss", "yyyy-mm-dd hh:mm",
    * "yyyy/mm/dd", "yyyy/mm/dd hh:mm:ss", "yyyy/mm/dd hh:mm"
    * @param str
    * @return date
    * @since 1.0
    */
   public static date parsedate(object str) {
      if (str == null) {
         return null;
      }
      try {
         return org.apache.commons.lang3.time.dateutils.parsedate(str.tostring(), parsepatterns);
      } catch (parseexception e) {
         return null;
      }
   }

   /**
    * 获取当前日期与指定日期相隔的天数.
    * @param date 给定的日期
    * @return long 日期间隔天数,正数表示给定日期在当前日期之前,负数表示在当前日期之后
    * @since 1.0
    */
   public static long pastdays(date date) {
      // 将指定日期转换为yyyy-mm-dd格式
      date = dateutils.parsedate(dateutils.formatdate(date, dateutils.date_format));
      // 当前日期转换为yyyy-mm-dd格式
      date currentdate = dateutils.parsedate(dateutils.formatdate(new date(), dateutils.date_format));
      long t=0;
      if(date!=null&&currentdate!=null){
         t = (currentdate.gettime() - date.gettime()) / dateutils.milliseconds_per_day;
      }
      return t;
   }

   /**
    * 获取当前日期指定天数之后的日期.
    * @param num   相隔天数
    * @return date 日期
    * @since 1.0
    */
   public static date nextday(int num) {
      calendar curr = calendar.getinstance();
      curr.set(calendar.day_of_month, curr.get(calendar.day_of_month) + num);
      return curr.gettime();
   }

   /**
    * 获取当前日期指定月数之后的日期.
    * @param num   间隔月数
    * @return date 日期
    * @since 1.0
    */
   public static date nextmonth(int num) {
      calendar curr = calendar.getinstance();
      curr.set(calendar.month, curr.get(calendar.month) + num);
      return curr.gettime();
   }

   /**
    * 获取当前日期指定年数之后的日期.
    * @param num    间隔年数
    * @return date 日期
    * @since 1.0
    */
   public static date nextyear(int num) {
      calendar curr = calendar.getinstance();
      curr.set(calendar.year, curr.get(calendar.year) + num);
      return curr.gettime();
   }

   /**
    * 将 date 日期转化为 calendar 类型日期.
    * @param date   给定的时间,若为null,则默认为当前时间
    * @return calendar calendar对象
    * @since 1.0
    */
   public static calendar getcalendar(date date) {
      calendar calendar = calendar.getinstance();
      // calendar.setfirstdayofweek(calendar.sunday);//每周从周日开始
      // calendar.setminimaldaysinfirstweek(1); // 设置每周最少为1天
      if (date != null) {
         calendar.settime(date);
      }
      return calendar;
   }

   /**
    * 计算两个日期之间相差天数.
    * @param start     计算开始日期
    * @param end       计算结束日期
    * @return long 相隔天数
    * @since 1.0
    */
   public static long getdaysbetween(date start, date end) {
      // 将指定日期转换为yyyy-mm-dd格式
      start = dateutils.parsedate(dateutils.formatdate(start, dateutils.date_format));
      // 当前日期转换为yyyy-mm-dd格式
      end = dateutils.parsedate(dateutils.formatdate(end, dateutils.date_format));

      long diff=0;
      if(start!=null&&end!=null) {
         diff = (end.gettime() - start.gettime()) / dateutils.milliseconds_per_day;
      }
      return diff;
   }

   /**
    * 计算两个日期之前相隔多少周.
    * @param start      计算开始时间
    * @param end    计算结束时间
    * @return long 相隔周数,向下取整
    * @since 1.0
    */
   public static long getweeksbetween(date start, date end) {
      return getdaysbetween(start, end) / dateutils.days_per_week;
   }

   /**
    * 获取与指定日期间隔给定天数的日期.
    * @param specifiedday    给定的字符串格式日期,支持的日期字符串格式包括"yyyy-mm-dd","yyyy-mm-dd hh:mm:ss",
    *            "yyyy-mm-dd hh:mm", "yyyy/mm/dd", "yyyy/mm/dd hh:mm:ss",
    *            "yyyy/mm/dd hh:mm"
    * @param num   间隔天数
    * @return string 间隔指定天数之后的日期
    * @since 1.0
    */
   public static string getspecifieddayafter(string specifiedday, int num) {
      date specifieddate = parsedate(specifiedday);
      calendar c = calendar.getinstance();
      c.settime(specifieddate);
      int day = c.get(calendar.date);
      c.set(calendar.date, day + num);
      string dayafter = formatdate(c.gettime(), dateutils.date_format);
      return dayafter;
   }

   /**
    * 计算两个日期之前间隔的小时数.
    * 
    * @param date1
    *            结束时间
    * @param date2
    *            开始时间
    * @return string 相差的小时数,保留一位小数
    * @since 1.0
    */
   public static string dateminus(date date1, date date2) {
      if (date1 == null || date2 == null) {
         return "0";
      }
      long r = date1.gettime() - date2.gettime();
      decimalformat df = new decimalformat("#.0");
      double result = r * 1.0 / dateutils.milliseconds_per_hour;
      return df.format(result);
   }

   /**
    * 获取当前季度 .
    * 
    * @return integer 当前季度数
    * @since 1.0
    */
   public static integer getcurrentseason() {
      calendar calendar = calendar.getinstance();
      integer month = calendar.get(calendar.month) + 1;
      int season = 0;
      if (month >= 1 && month <= 3) {
         season = 1;
      } else if (month >= 4 && month <= 6) {
         season = 2;
      } else if (month >= 7 && month <= 9) {
         season = 3;
      } else if (month >= 10 && month <= 12) {
         season = 4;
      }
      return season;
   }

   /**
    * 将以秒为单位的时间转换为其他单位.
    * 
    * @param seconds
    *            秒数
    * @return string 例如 16分钟前、2小时前、3天前、4月前、5年前等
    * @since 1.0
    */
   public static string getintervalbyseconds(long seconds) {
      stringbuffer buffer = new stringbuffer();
      if (seconds < seconds_per_minute) {
         buffer.append(seconds).append("秒前");
      } else if (seconds < seconds_per_hour) {
         buffer.append(seconds / seconds_per_minute).append("分钟前");
      } else if (seconds < seconds_per_day) {
         buffer.append(seconds / seconds_per_hour).append("小时前");
      } else if (seconds < seconds_per_month) {
         buffer.append(seconds / seconds_per_day).append("天前");
      } else if (seconds < seconds_per_year) {
         buffer.append(seconds / seconds_per_month).append("月前");
      } else {
         buffer.append(seconds / dateutils.seconds_per_year).append("年前");
      }
      return buffer.tostring();
   }

   /**
    * 
    * getnowtimebefore(记录时间相当于目前多久之前)
    * 
    * @param seconds
    *            秒
    * @return
    * @exception @since
    *                1.0
    * @author rlliu
    */
   public static string getnowtimebefore(long seconds) {
      stringbuffer buffer = new stringbuffer();
      buffer.append("上传于");
      if (seconds < 3600) {
         buffer.append((long) math.floor(seconds / 60.0)).append("分钟前");
      } else if (seconds < 86400) {
         buffer.append((long) math.floor(seconds / 3600.0)).append("小时前");
      } else if (seconds < 604800) {
         buffer.append((long) math.floor(seconds / 86400.0)).append("天前");
      } else if (seconds < 2592000) {
         buffer.append((long) math.floor(seconds / 604800.0)).append("周前");
      } else if (seconds < 31104000) {
         buffer.append((long) math.floor(seconds / 2592000.0)).append("月前");
      } else {
         buffer.append((long) math.floor(seconds / 31104000.0)).append("年前");
      }
      return buffer.tostring();
   }

   /**
    * 
    * getmonthsbetween(查询两个日期相隔的月份)
    * 
    * @param startdate 开始日期1 (格式yyyy-mm-dd)
    * @param enddate   截止日期2 (格式yyyy-mm-dd)
    * @return
    */
   public static int getmonthsbetween(string startdate, string enddate) {
      calendar c1 = calendar.getinstance();
      calendar c2 = calendar.getinstance();
      c1.settime(dateutils.parsedate(startdate));
      c2.settime(dateutils.parsedate(enddate));
      int year = c2.get(calendar.year) - c1.get(calendar.year);
      int month = c2.get(calendar.month) - c1.get(calendar.month);
      return math.abs(year * 12 + month);
   }

   /**
    * 
    * getdayofweek(获取当前日期是星期几)
    * 
    * @param datestr 日期
    * @return 星期几
    */
   public static string getdayofweek(string datestr) {
      string[] weekofdays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
      date date = parsedate(datestr);
      calendar calendar = calendar.getinstance();
      calendar.settime(date);
      int num = calendar.get(calendar.day_of_week) - 1;
      return weekofdays[num];
   }

   /**
    * sns 格式 如几秒前,几分钟前,几小时前,几天前,几个月前,几年后, ... 精细,类如某个明星几秒钟之前发表了一篇微博
    * 
    * @param createtime
    * @return
    */
   public static string snsformat(long createtime) {
      long now = system.currenttimemillis() / 1000;
      long differ = now - createtime / 1000;
      string datestr = "";
      if (differ <= 60) {
         datestr = "刚刚";
      } else if (differ <= 3600) {
         datestr = (differ / 60) + "分钟前";
      } else if (differ <= 3600 * 24) {
         datestr = (differ / 3600) + "小时前";
      } else if (differ <= 3600 * 24 * 30) {
         datestr = (differ / (3600 * 24)) + "天前";
      } else {
         date date = new date(createtime);
         simpledateformat sdf = new simpledateformat("yyyy-mm-dd");
         datestr = sdf.format(date);
      }
      return datestr;
   }
   
    /**
     * 得到utc时间,类型为字符串,格式为"yyyy-mm-dd hh:mm"
     * 如果获取失败,返回null
     * @return
     */
    public static string getutctimestr() {
        stringbuffer utctimebuffer = new stringbuffer();
        // 1、取得本地时间:
        calendar cal = calendar.getinstance() ;
        // 2、取得时间偏移量:
        int zoneoffset = cal.get(java.util.calendar.zone_offset);
        // 3、取得夏令时差:
        int dstoffset = cal.get(java.util.calendar.dst_offset);
        // 4、从本地时间里扣除这些差量,即可以取得utc时间:
        cal.add(java.util.calendar.millisecond, -(zoneoffset + dstoffset));
        int year = cal.get(calendar.year);
        int month = cal.get(calendar.month)+1;
        int day = cal.get(calendar.day_of_month);
        int hour = cal.get(calendar.hour_of_day);
        int minute = cal.get(calendar.minute); 
        utctimebuffer.append(year).append("-").append(month).append("-").append(day) ;
        utctimebuffer.append(" ").append(hour).append(":").append(minute) ;
        try{
           simpledateformat sdf = new simpledateformat("yyyy-mm-dd hh:mm");
           sdf.parse(utctimebuffer.tostring()) ;
            return utctimebuffer.tostring() ;
        }catch(parseexception e)
        {
            e.printstacktrace() ;
        }
        return null ;
    }
}