问题描述
1、输出两个日期之间的每一天(DAY)
2、输出两个日期之间的每一周的区间(WEEK)
3、输出两个日期之间的每个月份(MONTH)
前驱知识(三个常用的Class)
Date
java.util 包提供了 Date 类来封装当前的日期和时间。
SimpleDateFormat
SimpleDateFormat 是一个以语言环境敏感的方式来格式化和分析日期的类。SimpleDateFormat 允许你选择任何用户自定义日期时间格式来运行。
常见用法(date格式化转日期字符串互转):
String dateStr = "2018-12-12"
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//日期字符串转Date
Date date = sdf.parse(dateStr );
//Date转日期字符串
String ret = sdf.format(date);
Calendar
Calendar是日历的意思,区别于Date,Date是一个绝对时间,而Calendar是对时间的一种描述方式,不同国家、不同地区描述方式不同。
//获取Calendar实例的四种方式的区别(常用前两种)
//1.getInstance():使用默认的时区、默认的位置创建实例
Calendar c1 = Calendar.getInstance();
//2.getInstance(TimeZone zone):使用指定的时区、默认的位置创建实例
Calendar c2 = Calendar.getInstance(Locale.CHINA);
//3.getInstance(Locale aLocale):使用默认的时区、指定的位置创建实例
Calendar c3 = Calendar.getInstance(TimeZone.getTimeZone("GMT+9"));
//4.getInstance(TimeZone zone,Locale aLocale)使用指定的时区、指定的位置创建实例
Calendar c4 = Calendar.getInstance(TimeZone.getTimeZone("GMT+9"), Locale.US);
//本文用到的 Calendar 的方法
Calendar calendar= Calendar.getInstance();
//设置Calendar初始日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
calendar.setTime(sdf.parse("2018-12-12"));
//获取当前日期
calendar.getTime();
//往后增长一天(负整数就是后退 X 天)
calendar.add(Calendar.DAY_OF_MONTH, 1);
//加减一周
calendar.add(Calendar.WEEK_OF_MONTH, 1);
//加减一个月
calendar.add(Calendar.MONTH, 1);
//获取当前日期是当月的第几天
calendar.get(Calendar.DAY_OF_MONTH)
//获取当日是本周的第几周
calendar.get(Calendar.DAY_OF_WEEK)
//获取当月最大天数
calendar.getActualMaximum(Calendar.DAY_OF_MONTH)
//还有很多自行探索0.0
上代码(注解都在里面0.0,java8可以用 LocalDate 来遍历哦)
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
* @author Negen
* @createTime 2019/03/01
* @fileName DateUtil.java
*/
public class DateForEachUtil {
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
static final int DAY = 1; //日
static final int WEEK = 2; //周
static final int MONTH = 3; //月
/**
* 遍历两个日期之间的日、周、月
* @param startDateStr 开始日期字符串
* @param endDateStr 结束字符串
* @param Flag 遍历的标志,按日还是按周遍历 DAY:日 WEEK:周 MONTH:月
*/
public static void dateForEach(String startDateStr, String endDateStr, Integer Flag) throws ParseException {
//将字符串类型的日期转换为Date类型并加载到Calendar中(有异常直接抛)
Date startDate = sdf.parse(startDateStr);
Date endDate = sdf.parse(endDateStr);
//实例化Calendar(为什么要实例化两个Calendar,肯定是为了后面要用啊0.0)
Calendar startCalendar = Calendar.getInstance();
Calendar endCalendar = Calendar.getInstance();
//将两个日期加载到Calendar中
startCalendar.setTime(startDate);
endCalendar.setTime(endDate);
//开始遍历
switch (Flag){
case DAY:
//按日遍历
while(true){
String currentDateStr = sdf.format(startCalendar.getTime());
System.out.println("currentDateStr========>" + currentDateStr);
//日期加1
startCalendar.add(Calendar.DAY_OF_MONTH, 1);
//当前日期和结束日历日期比较,超过结束日期则终止
if(startCalendar.after(endCalendar))break;
}
break;
case WEEK:
//按周输出
while(true){
String firstAndSecondStr = "";
String secondDateStr = "";
String firstDateStr = sdf.format(startCalendar.getTime());
startCalendar.add(Calendar.DAY_OF_MONTH, 6);
secondDateStr = sdf.format(startCalendar.getTime());
if (startCalendar.after(endCalendar)){
startCalendar.add(Calendar.DAY_OF_MONTH, -6);
if(sdf.format(startCalendar.getTime()).equals(endDateStr)){
firstAndSecondStr = endDateStr + "~" + endDateStr;
// System.out.println(firstAndSecondStr);
resultMap.put(firstAndSecondStr, null);
break;
}
else{
firstDateStr = sdf.format(startCalendar.getTime());
firstAndSecondStr = firstDateStr + "~" + endDateStr;
// System.out.println(firstAndSecondStr);
resultMap.put(firstAndSecondStr, null);
break;
}
};
firstAndSecondStr = firstDateStr + "~" + secondDateStr;
resultMap.put(firstAndSecondStr, null);
startCalendar.add(Calendar.DAY_OF_MONTH, 1);
if (startCalendar.equals(endCalendar)){
resultMap.put(sdf.format(startCalendar.getTime()) + "~" + endDateStr, null);
break;}
if (startCalendar.after(endCalendar))
break;
}
break;
case MONTH:
while(true){
//和按日输出差不多
String currentDateStr = sdf.format(startCalendar.getTime()).substring(0,7);
System.out.println("currentDateStr========>" + currentDateStr);
//日期加1
startCalendar.add(Calendar.MONTH, 1);
//当前日期和结束日历日期比较,超过结束日期则终止
if(startCalendar.after(endCalendar))break;
}
}
}
//测试
public static void main(String[] args) throws ParseException {
String startDateStr = "2018-05-01";
String endDateStr = "2018-05-09";
DateForEachUtil.dateForEach(startDateStr, endDateStr, WEEK);
}
}
网友评论