急~~~关于把时间分段显示
逻辑很明显,但是不知道用什么方法实现。求大神庇佑~~
以每个月20和21号为分界显示日期段
比如说:2013-6-19至2013-7-23,
需要分段为2013-6-19至2013-6-20,2013-6-21至2013-7-20,2013-7-21至2013-7-23 三段
不知道怎么写啊
好纠结
日期??分段
[解决办法]
用Calendar对象处理,
先比较起始日期与当月20号,计算出第一段,
然后循环累加一个月,直至超过截止日期。
[解决办法]
大概是这样,然后依次输出就是你要的结果咯,
public static List<Date> getSplitTimeList(String startTime, String endTime) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
List<Date> dateList = new ArrayList<Date>();
Date startDate = sdf.parse(startTime);
Date endDate = sdf.parse(endTime);
dateList.add(startDate);
dateList.add(endDate);
Calendar calendar = Calendar.getInstance();
calendar.setTime(startDate);
calendar.set(Calendar.DAY_OF_MONTH, 20);
Date splitDate1 = null, splitDate2 = null;
while (true) {
splitDate1 = calendar.getTime();
if (splitDate1.after(endDate))
break;
if (!dateList.contains(splitDate1))
dateList.add(splitDate1);
calendar.add(Calendar.DAY_OF_MONTH, 1);
splitDate2 = calendar.getTime();
if (splitDate2.after(endDate))
break;
if (!dateList.contains(splitDate2))
dateList.add(splitDate2);
calendar.add(Calendar.MONTH, 1);
calendar.set(Calendar.DAY_OF_MONTH, 20);
}
if (startDate.getDate() == 20)
dateList.add(startDate);
if (endDate.getDate() == 21)
dateList.add(endDate);
Collections.sort(dateList);
return dateList;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static List<Date> getSplitTimeList(String startTime, String endTime) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
List<Date> dateList = new ArrayList<Date>();
Date startDate = sdf.parse(startTime);
Date endDate = sdf.parse(endTime);
dateList.add(startDate);
dateList.add(endDate);
Calendar calendar = Calendar.getInstance();
calendar.setTime(startDate);
calendar.set(Calendar.DAY_OF_MONTH, 20);
if (calendar.getTime().before(startDate)) {
calendar.add(Calendar.MONTH, 1);
calendar.set(Calendar.DAY_OF_MONTH, 20);
}
Date splitDate1 = null, splitDate2 = null;
while (true) {
splitDate1 = calendar.getTime();
if (splitDate1.after(endDate))
break;
if (!dateList.contains(splitDate1))
dateList.add(splitDate1);
calendar.add(Calendar.DAY_OF_MONTH, 1);
splitDate2 = calendar.getTime();
if (splitDate2.after(endDate))
break;
if (!dateList.contains(splitDate2))
dateList.add(splitDate2);
calendar.add(Calendar.MONTH, 1);
calendar.set(Calendar.DAY_OF_MONTH, 20);
}
if (startDate.getDate() == 20)
dateList.add(startDate);
if (endDate.getDate() == 21)
dateList.add(endDate);
Collections.sort(dateList);
return dateList;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;
public class DivideDisplay {
public static final int FIRSTDIVIDE = 20;// 分隔首日期
public static final int SECONDDIVIDE = 21;// 分隔尾日期
public static void main(String[] args) {
DivideDisplay dd = new DivideDisplay();
Scanner scan = new Scanner(System.in);
String firstDate = scan.next();
String secondDate = scan.next();
if (null == firstDate
[解决办法]
null == secondDate) {
System.out.println("日期格式错误! 重新运行!");
return;
}
String result = dd.getResult(firstDate, secondDate);
System.out.println(result);
}
/**
* 根据首尾日起的字符串,得到分割后的字符串。
*
* @param firstDate
* @param secondDate
* @return String
*/
public String getResult(String firstDate, String secondDate) {
String result = "";// 存放结果
// 首尾日期的Calendar表示。
Calendar dateStart = getCalendarFromString(firstDate);
Calendar dateEnd = getCalendarFromString(secondDate);
if(null == dateStart
[解决办法]
null == dateEnd){
result = "数据格式错误!";
return result;
}
if(dateStart.compareTo(dateEnd) >0 ){
result = "输入数据不合格 !";
return result;
}
//下一个最近的分隔日期
Calendar calDiv = getNextDivide(firstDate);
//每次输出的首日期。
String firstOut = firstDate;
//每次输出的尾日期。
String secondOut = secondDate;
//循环判断
while(calDiv.compareTo(dateEnd)<0){//未到结束日期
secondOut = getStringFromCal(calDiv);//得到字符串格式
result += firstOut +"\t" + " 至 \t" + secondOut +"\r\n";//输出
calDiv.add(Calendar.DATE, 1);//得到新的输出的首日期。
firstOut = getStringFromCal(calDiv);//得到新的输出的首日期的字符串形式。
calDiv = getNextDivide(firstOut);//得到新的分隔日期
}
result += firstOut +"\t" + " 至 \t" +secondDate;
return result;
}
/**
* 根据字符串得到日期。如果输入值为空,返回 null。
*
* @param dateString
* @return Calendar
*/
public Calendar getCalendarFromString(String dateString) {
Calendar cal = Calendar.getInstance();// 取当前时间
if (null != dateString && !dateString.equals(""))// 如果不为空,进一步计算。
{
String[] str = dateString.split("-");
if (str.length == 3) {
int year = Integer.parseInt(str[0]);
int month = Integer.parseInt(str[1]) - 1;// 必须,Calendar 认为0是一月。
int day = Integer.parseInt(str[2]);
cal.set(year, month, day, 0, 0, 0);
return cal;
}
}
return null;// 传值不正确,返回Null
}
/**
* 得到字符串表示的日期所在月的分个日期,如20号。
* @param dateString 字符串表示的年月日日期。
* @param t 分隔日期。
* @return 新字符串。末尾是t.
*/
public String getDivideDateString(String dateString, int t) {
String s = dateString.substring(0, dateString.lastIndexOf('-') + 1);
s += "" + t;
return s;
}
/**
* 根据日期得到字符串。
*
* @param dateStart
* @return
*/
public String getStringFromCal(Calendar date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d");
String dateString = sdf.format(new Date(date.getTimeInMillis()));
return dateString;
}
/**
* 根据输入的字符串形式的日期, 得到最近的首分隔日期。
* @param original
* @return Calendar
*/
public Calendar getNextDivide(String original){
Calendar cal = getCalendarFromString(original);
String div = getDivideDateString(original, FIRSTDIVIDE);
Calendar calDiv = getCalendarFromString(div);
if(cal.compareTo(calDiv) <=0){//日期小于FIRSTDIVIDE
return calDiv;
}
calDiv.add(Calendar.MONTH, 1);////日期大于FIRSTDIVIDE
return calDiv;
}