Java對(duì)日期Date類進(jìn)行加減運(yùn)算、年份加減月份加減彬向、時(shí)間差等等

1.實(shí)現(xiàn)方式一

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
 
public class DateTestUtil { 
 public static void main(String[] args) throws Exception {  
  SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd");
  String str="20110823";
  Date dt=sdf.parse(str);
  Calendar rightNow = Calendar.getInstance();
  rightNow.setTime(dt);
  rightNow.add(Calendar.YEAR,-1);//日期減1年
  rightNow.add(Calendar.MONTH,3);//日期加3個(gè)月
  rightNow.add(Calendar.DAY_OF_YEAR,10);//日期加10天
  Date dt1=rightNow.getTime();
  String reStr = sdf.format(dt1);
  System.out.println(reStr);
 }
}

注:在Calendar對(duì)象的add方法中兼贡,第二個(gè)參數(shù)為正數(shù)表示“加”,負(fù)數(shù)表示“減”娃胆。

2.實(shí)現(xiàn)方式二

import java.text.SimpleDateFormat; 
import java.util.Date; 
  
public class DateTest { 
   
  public static void main(String[] arg){ 
    Date now = new Date();     
    addAndSubtractDaysByGetTime(now,-5); 
    addAndSubtractDaysByGetTime(now,5); 
    addAndSubtractDaysByCalendar(now,-5); 
    addAndSubtractDaysByCalendar(now,5); 
  } 
   public static Date addAndSubtractDaysByGetTime(Date dateTime/*待處理的日期*/,int n/*加減天數(shù)*/){   
     //日期格式 
     SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");  
     SimpleDateFormat dd=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");     
     System.out.println(df.format(new Date(dateTime.getTime() + n * 24 * 60 * 60 * 1000L))); 
     //System.out.println(dd.format(new Date(dateTime.getTime() + n * 24 * 60 * 60 * 1000L))); 
     //注意這里一定要轉(zhuǎn)換成Long類型遍希,要不n超過(guò)25時(shí)會(huì)出現(xiàn)范圍溢出,從而得不到想要的日期值 
     return new Date(dateTime.getTime() + n * 24 * 60 * 60 * 1000L); 
   } 
     
   public static Date addAndSubtractDaysByCalendar(Date dateTime/*待處理的日期*/,int n/*加減天數(shù)*/){ 
     //日期格式 
     SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");  
     SimpleDateFormat dd=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
     java.util.Calendar calstart = java.util.Calendar.getInstance(); 
       calstart.setTime(dateTime); 
     calstart.add(java.util.Calendar.DAY_OF_WEEK, n);    
     System.out.println(df.format(calstart.getTime())); 
     //System.out.println(dd.format(calstart.getTime())); 
     return calstart.getTime(); 
   }   
}

3.實(shí)現(xiàn)方式三

package com.data.utils;
 
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
 
public class DateFormat {
 
 /**
  * 日期減幾年
  */
 public static String dateMinusYear(String str) throws Exception {
 
  SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
  Date dt = sdf.parse(str);
  Calendar rightNow = Calendar.getInstance();
  rightNow.setTime(dt);
  rightNow.add(Calendar.YEAR, -1);// 日期減1年
  Date dt1 = rightNow.getTime();
  String reStr = sdf.format(dt1);
  return reStr;
 }
 
 /**
  * 日期加幾年
  */
 public static String dateAddYear(String str) throws Exception {
 
  SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
  Date dt = sdf.parse(str);
  Calendar rightNow = Calendar.getInstance();
  rightNow.setTime(dt);
  rightNow.add(Calendar.YEAR, 1);// 日期加1年
  Date dt1 = rightNow.getTime();
  String reStr = sdf.format(dt1);
  return reStr;
 }
 
 /**
  * 日期減幾月
  */
 public static String dateMinusMonth(String str) throws Exception {
 
  SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
  Date dt = sdf.parse(str);//將字符串生成Date
  Calendar rightNow = Calendar.getInstance();
  rightNow.setTime(dt);//使用給定的 Date 設(shè)置此 Calendar 的時(shí)間里烦。 
  rightNow.add(Calendar.MONTH, -1);// 日期減1個(gè)月
  Date dt1 = rightNow.getTime();//返回一個(gè)表示此 Calendar 時(shí)間值的 Date 對(duì)象凿蒜。
  String reStr = sdf.format(dt1);//將給定的 Date 格式化為日期/時(shí)間字符串,并將結(jié)果添加到給定的 StringBuffer胁黑。
  return reStr;
 }
 
 /**
  * 日期加幾月
  */
 public static String dateAddMonth(String str) throws Exception {
 
  SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
  Date dt = sdf.parse(str);
  Calendar rightNow = Calendar.getInstance();
  rightNow.setTime(dt);
  rightNow.add(Calendar.MONTH, 1);// 日期加3個(gè)月
  // rightNow.add(Calendar.DAY_OF_YEAR,10);//日期加10天
  Date dt1 = rightNow.getTime();
  String reStr = sdf.format(dt1);
  return reStr;
 }
 
 /**
  * 獲取當(dāng)前年月的第一個(gè)月的str
  * @param str
  *   201505
  * @return 201501
  * @throws Exception
  */
 public static String dateOneMonth(String str) {
 
  str = str.substring(0, str.length() - 2);
  str = str + "01";
  return str;
 }
 
 /**
  * 算出所選月份距離一月份有幾個(gè)月废封。
  * @param str 201509
  * @return 9
  */
 public static int dateDistanceMonth(String str) {
 
  int i = Integer.parseInt(str);
  int j = Integer.parseInt(DateFormat.dateOneMonth(str));
  System.out.println(i - j);
  return i - j + 1;
 }
 
 /**
  * 獲取兩個(gè)時(shí)間的時(shí)間差,精確到毫秒
  * @param str
  * @return
  */
 public static String TimeDifference(long start, long end) {
 
  long between = end - start;
  long day = between / (24 * 60 * 60 * 1000);
  long hour = (between / (60 * 60 * 1000) - day * 24);
  long min = ((between / (60 * 1000)) - day * 24 * 60 - hour * 60);
  long s = (between / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
  long ms = (between - day * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000
    - min * 60 * 1000 - s * 1000);
  String timeDifference = day + "天" + hour + "小時(shí)" + min + "分" + s + "秒" + ms
    + "毫秒";
  return timeDifference;
 }
}
 
 /**
  * 獲取24小時(shí)丧蘸、一周漂洋、一個(gè)月的起始時(shí)間
  * 
  * @param timeInterval
  *   : DAY_TIME_INTERVAL WEEK_TIME_INTERVAL MONTH_TIME_INTERVAL
  * @return "yyyy-mm-dd hh:mm:ss"
  */
 public static String getStartTime(int timeInterval) {
  Calendar cal = Calendar.getInstance();
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  if (DAY_TIME_INTERVAL == timeInterval) {// 獲取24小時(shí)的起始時(shí)間
   cal.set(Calendar.HOUR_OF_DAY, 0);
   cal.set(Calendar.MINUTE, 0);
   cal.set(Calendar.SECOND, 0);
   String startTime = sdf.format(cal.getTime());
   return startTime;
  } else if (WEEK_TIME_INTERVAL == timeInterval) {
   int weekday = cal.get(Calendar.DAY_OF_WEEK) - 1;
   cal.add(Calendar.DATE, -weekday);
   cal.set(Calendar.HOUR_OF_DAY, 0);
   cal.set(Calendar.MINUTE, 0);
   cal.set(Calendar.SECOND, 0);
   String startTime = sdf.format(cal.getTime());
   return startTime;
  } else if (MONTH_TIME_INTERVAL == timeInterval) {
   int dayofmonthMin = cal.getActualMinimum(Calendar.DAY_OF_MONTH);
   // c.add(Calendar.DATE, -dayofmonth);
   cal.set(Calendar.DATE, dayofmonthMin);
   cal.set(Calendar.HOUR_OF_DAY, 0);
   cal.set(Calendar.MINUTE, 0);
   cal.set(Calendar.SECOND, 0);
   String startTime = sdf.format(cal.getTime());
   return startTime;
  }
  return null;
 }
 
 /**
  * 獲取24小時(shí)、一周力喷、一個(gè)月的結(jié)束時(shí)間
  * 
  * @param timeInterval
  *   : DAY_TIME_INTERVAL WEEK_TIME_INTERVAL MONTH_TIME_INTERVAL
  * @return "yyyy-mm-dd hh:mm:ss"
  */
 public static String getEndTime(int timeInterval) {
  Calendar cal = Calendar.getInstance();
  cal.setTimeZone(TimeZone.getTimeZone("GMT+8"));
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  if (DAY_TIME_INTERVAL == timeInterval) {
   cal.set(Calendar.HOUR_OF_DAY, 23);
   cal.set(12, 59);
   cal.set(13, 59);
   long date = cal.getTimeInMillis();
   String endTime = sdf.format(new Date(date));
   return endTime;
  } else if (WEEK_TIME_INTERVAL == timeInterval) {
   int weekday = cal.get(Calendar.DAY_OF_WEEK) - 1;
   cal.add(Calendar.DATE, -weekday);
   cal.add(Calendar.DATE, 6);
   cal.set(Calendar.HOUR_OF_DAY, 23);
   cal.set(12, 59);
   cal.set(13, 59);
   long date = cal.getTimeInMillis();
   String endTime = sdf.format(new Date(date));
   return endTime;
  } else if (MONTH_TIME_INTERVAL == timeInterval) {
   int dayOfMonthMax = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
   cal.set(Calendar.DATE, dayOfMonthMax);
   cal.set(Calendar.HOUR_OF_DAY, 23);
   cal.set(Calendar.MINUTE, 59);
   cal.set(Calendar.SECOND, 59);
   String endTime = sdf.format(cal.getTime());
   return endTime;
  }
  return null;
 }
 /**
  * 判斷dateStr是否在start和end中間刽漂,start和end都可以為null yyyyMMddHHmmss或者yyyyMMdd格式
  * 
  * @author you.xu
  * @date 2015年8月19日下午3:11:46
  * @param dateStr
  * @param start
  * @param end
  * @return
  */
 public static boolean checkDateVal(String dateStr, String start, String end) {
  boolean isDateRight = false;
  Date date = null;
  Date startDate = null;
  Date endDate = null;
  SimpleDateFormat sdf = null;
  // 判斷日期格式
  if (14 == dateStr.length()) {
   sdf = new SimpleDateFormat("yyyyMMddHHmmss");
  } else if (8 == dateStr.length()) {
   sdf = new SimpleDateFormat("yyyyMMdd");
  } else
   return false;
 
  try {
   // 更改判斷日期格式
   date = sdf.parse(dateStr);
  } catch (ParseException e) {
   log.error(e, e);
  }
 
  if ((start == null) && (end != null)) {
   try {
    endDate = sdf.parse(end);
   } catch (ParseException ex1) {
    log.error(ex1, ex1);
   }
   if ((date != null) && (endDate != null))// Check parameters for
   {
    if (date.compareTo(endDate) <= 0)
     isDateRight = true;
   }
  } else if ((start != null) && (end == null)) {
   try {
    startDate = sdf.parse(start);
   } catch (ParseException ex1) {
    log.error(ex1, ex1);
   }
   if ((date != null) && (startDate != null)) {
    if (date.compareTo(startDate) >= 0)
     isDateRight = true;
   }
  } else if ((start != null) && (end != null)) {
   try {
    startDate = sdf.parse(start);
    endDate = sdf.parse(end);
   } catch (ParseException ex2) {
    System.out.println(ex2.toString());
   }
   if ((startDate != null) && (date != null) && (endDate != null)) {
    if ((date.compareTo(startDate) >= 0)
      && (date.compareTo(endDate) <= 0))
     isDateRight = true;
   }
  }
  return isDateRight;
 }
 
 /**
  * 判斷dateStr是否在start和end中間,start和end都可以為null long形格式
  * 
  * @author you.xu
  * @date 2015年8月19日下午3:12:35
  * @param dateStr
  * @param start
  * @param end
  * @return
  */
 public static boolean checkDateV(String dateStr, String start, String end) {
  boolean isDateRight = false;
  long date = -1;
  long fromDate = -1;
  long toDate = -1;
 
  date = java.lang.Long.parseLong(dateStr);
 
  if ((start == null) && (end == null)) {
   isDateRight = true;
  } else if ((start == null) && (end != null)) {
   try {
    toDate = java.lang.Long.parseLong(end);
   } catch (NumberFormatException nfe) {
    log.error(nfe, nfe);
   }
   if (date <= toDate) {
    isDateRight = true;
   }
  } else if ((start != null) && (end == null)) {
   try {
    fromDate = java.lang.Long.parseLong(start);
   } catch (NumberFormatException nfe) {
    log.error(nfe, nfe);
   }
 
   if (date >= fromDate) {
    isDateRight = true;
   }
  } else if ((start != null) && (end != null)) {
   try {
    toDate = java.lang.Long.parseLong(end);
    fromDate = java.lang.Long.parseLong(start);
   } catch (NumberFormatException nfe) {
    log.error(nfe, nfe);
   }
 
   if ((date <= toDate) && (date >= fromDate)) {
    isDateRight = true;
   }
  }
  return isDateRight;
 }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末弟孟,一起剝皮案震驚了整個(gè)濱河市贝咙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌披蕉,老刑警劉巖颈畸,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異没讲,居然都是意外死亡眯娱,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門爬凑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)徙缴,“玉大人,你說(shuō)我怎么就攤上這事嘁信∮谘” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵潘靖,是天一觀的道長(zhǎng)穿剖。 經(jīng)常有香客問(wèn)我,道長(zhǎng)卦溢,這世上最難降的妖魔是什么糊余? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任秀又,我火速辦了婚禮,結(jié)果婚禮上贬芥,老公的妹妹穿的比我還像新娘吐辙。我一直安慰自己,他們只是感情好蘸劈,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布昏苏。 她就那樣靜靜地躺著,像睡著了一般威沫。 火紅的嫁衣襯著肌膚如雪贤惯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天壹甥,我揣著相機(jī)與錄音救巷,去河邊找鬼。 笑死句柠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的棒假。 我是一名探鬼主播溯职,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼帽哑!你這毒婦竟也來(lái)了谜酒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤妻枕,失蹤者是張志新(化名)和其女友劉穎僻族,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屡谐,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡述么,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了愕掏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片度秘。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖饵撑,靈堂內(nèi)的尸體忽然破棺而出剑梳,到底是詐尸還是另有隱情,我是刑警寧澤滑潘,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布垢乙,位于F島的核電站,受9級(jí)特大地震影響语卤,放射性物質(zhì)發(fā)生泄漏追逮。R本人自食惡果不足惜酪刀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望羊壹。 院中可真熱鬧蓖宦,春花似錦、人聲如沸油猫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)情妖。三九已至睬关,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間毡证,已是汗流浹背电爹。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留料睛,地道東北人丐箩。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像恤煞,于是被迫代替她去往敵國(guó)和親屎勘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容