首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

急关于把时间分段展示

2013-09-21 
急~~~关于把时间分段显示逻辑很明显,但是不知道用什么方法实现。求大神庇佑~~以每个月20和21号为分界显示日

急~~~关于把时间分段显示
逻辑很明显,但是不知道用什么方法实现。求大神庇佑~~

以每个月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;
}

热点排行