需要程序解析时间,
已知两个时间的字符串。
例
开始时间:2010-8-19 10:20:00
结束时间:2010-8-20 11:30:00
解析成
2010-8-19 10:20:00 到 2010-8-20 00:00:00
2010-8-20 00:00:00 到 2010-8-20 11:30:00
这种形式的。
但是日期有很多需要判断,例如 跨年,闰年的2月。
希望大家能指教下。
分少请见谅。。
1、两个字符串转换成日期(这里先忽略几点几分)
2、得到两个日期相差的天假设是i
3、如果i=0-直接输出
如果i=1-输出第一个字符串-当天24点,24点到次日的时间
如果i>1输出第一个字符串-当天24点,中间的i-1天都是输出一整天,最后输出最后天 24点到该时间的字符串。(现在的问题如何得到这i-1天各是什么日子
我之前看到过一个得到几天后日志的方法
public static Date getDateAfter(Date d, int day) {
Calendar now = Calendar.getInstance();
now.setTime(d);
now.set(Calendar.DATE, now.get(Calendar.DATE) + day);
return now.getTime();
}
第一个参数是当前的天,第二个参数是第几天,返回的是第几天后的日期。
希望对你有帮助。
Calendar类设置和计算日期
SimpleDateFormat类设置日期格式
package com.test;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class Iter {
public static void main(String[] args) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date one = sdf.parse("2009-1-1 12:30:00");
Date two = sdf.parse("2009-3-1 12:30:00");
//one must before two
Iter.printDate(one, two, Calendar.getInstance(),sdf);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void printDate(Date one, Date two, Calendar calendar,SimpleDateFormat sdf) {
if (one.after(two)) {
calendar.setTime(one);
calendar.add(Calendar.DAY_OF_YEAR, -1);
one = calendar.getTime();
System.out.println(sdf.format(one) + "到" + sdf.format(two));
return;
} else {
calendar.setTime(one);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
calendar.add(Calendar.DAY_OF_YEAR, 1);
Date temp = calendar.getTime();
if (temp.after(two)) {
System.out.println(sdf.format(one) + "到" + sdf.format(two));
return;
} else {
System.out.println(sdf.format(one) + "到" + sdf.format(temp));
printDate(temp, two, calendar,sdf);
}
}
}
}
是这个意思么
private static void printIntervalDate(String beginDateStr, String endDateStr) throws ParseException {
//1.字符串转日期
Date beginDate = convertDate(beginDateStr);
Date endDate = convertDate(endDateStr);
//2.计算时间间隔,单位:天
int days = getIntervalDays(beginDate, endDate);
//3.输出
StringBuffer sb = new StringBuffer();
String connector = " 到 ";
String startStr =beginDateStr;
String endStr= "";
for(int i=0; i<days; i++) {
endStr =getDateAfterDays(beginDateStr,i+1,"yyyy-MM-dd hh:mm:ss");
sb.append(startStr + connector + endStr);
sb.append("\r\n");
startStr = endStr;
}
sb.append(startStr + connector + endDateStr);
System.out.println(sb.toString());
}
private static int getIntervalDays(Date begin, Date end) {
int beginYear = getYear(begin);
int endYear = getYear(end);
int intervalYear = Math.abs(endYear - beginYear) ;
int intervalDays = getDayOfYear(end) - getDayOfYear(begin);
if(intervalYear==0) {
return intervalDays;
} else {
for(int i=0; i<intervalYear; i++) {
intervalDays +=getDaysOfYear(beginYear++);
}
return intervalDays;
}
}
我觉得关键是要计算出时间的间隔,以下是部分代码
[code="java"]
//主流程代码
public static void printIntervalDate(String beginDateStr, String endDateStr) throws ParseException {
//1.字符串转日期
Date beginDate = convertDate(beginDateStr);
Date endDate = convertDate(endDateStr);
//2.计算时间间隔,单位:天
int days = getIntervalDays(beginDate, endDate);
//3.输出
StringBuffer sb = new StringBuffer();
String connector = " 到 ";
String startStr =beginDateStr;
String endStr= "";
for(int i=0; i<days; i++) {
endStr =getDateAfterDays(beginDateStr,i+1,"yyyy-MM-dd hh:mm:ss");
sb.append(startStr + connector + endStr);
sb.append("\r\n");
startStr = endStr;
}
sb.append(startStr + connector + endDateStr);
System.out.println(sb.toString());
}
//计算两个时间的时间间隔,单位是天
private static int getIntervalDays(Date begin, Date end) {
int beginYear = getYear(begin);
int endYear = getYear(end);
int intervalYear = Math.abs(endYear - beginYear) ;
int intervalDays = getDayOfYear(end) - getDayOfYear(begin);
if(intervalYear==0) {
return intervalDays;
} else {
for(int i=0; i<intervalYear; i++) {
intervalDays +=getDaysOfYear(beginYear++);
}
return intervalDays;
}
}
[/code]
下面是一些工具类
[code="java"]
//得到一年又多少天
private static int getDaysOfYear(int year) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH,11);
cal.set(Calendar.DAY_OF_MONTH,31);
return getDayOfYear(cal.getTime());
}
//得到该日期是一年中的第几天
private static int getDayOfYear(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.DAY_OF_YEAR);
}
[/code]
不知道我有没有理解错,看看这个是不是你要的结果
[code="java"]
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d HH:mm:ss");
String startDateStr = "2010-8-19 10:20:00";
String endDateStr = "2011-5-8 11:30:00";
System.out.println("开始时间:" + startDateStr + "\n结束时间:" + endDateStr+"\n输出:");
try {
printDate(startDateStr, endDateStr, sdf);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void printDate(String startDateStr, String endDateStr,
SimpleDateFormat sdf) throws Exception {
// 解析传入日期字符串
Date startDate = sdf.parse(startDateStr);
Date endDate = sdf.parse(endDateStr);
// 生成GregorianCalendar对象
GregorianCalendar startCal = new GregorianCalendar();
GregorianCalendar endCal = new GregorianCalendar();
startCal.setTimeInMillis(startDate.getTime());
endCal.setTimeInMillis(endDate.getTime());
if (endCal.get(Calendar.YEAR) == startCal.get(Calendar.YEAR)
&& endCal.get(Calendar.DAY_OF_YEAR) == startCal
.get(Calendar.DAY_OF_YEAR)) { // 如果是同年同一天
System.out.println(startDateStr + "\t到\t" + endDateStr);
} else { // 如果结束时间是下一天后
// 结束日历年中的天数
int end = endCal.get(Calendar.DAY_OF_YEAR);
do { //开始天数不到结束天数循环输出
System.out.print(sdf.format(startCal.getTime()) + "\t到\t");
//开始日历加一天并且时分秒清0
startCal.add(Calendar.DAY_OF_YEAR, 1);
startCal.set(Calendar.HOUR_OF_DAY, 0);
startCal.set(Calendar.MINUTE, 0);
startCal.set(Calendar.SECOND, 0);
System.out.println(sdf.format(startCal.getTime()));
} while (startCal.get(Calendar.DAY_OF_YEAR) != end);
//结束那天起始时分秒清0
endCal.set(Calendar.HOUR_OF_DAY, 0);
endCal.set(Calendar.MINUTE, 0);
endCal.set(Calendar.SECOND, 0);
System.out.println(sdf.format(endCal.getTime()) + "\t到\t"
+ endDateStr);
}
}
[/code]
[code="java"]
package org.nutz.test5;
import java.util.ArrayList;
import java.util.List;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
public class DateUtil {
public static List<String> split(String startDateStr, String endDateStr) {
List<String> result = new ArrayList<String>();
DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-M-d HH:mm:ss");
DateTimeFormatter fmt2 = DateTimeFormat.forPattern("yyyy-M-d 00:00:00");
DateTime startDate = fmt.parseDateTime(startDateStr);
DateTime endDate = fmt.parseDateTime(endDateStr);
assert startDate.isBefore(endDate);
while(startDate.plusDays(1).isBefore(endDate)){
String tmpStr = startDate.plusDays(1).toString(fmt2);
result.add(startDate.toString(fmt) + " 到 " + tmpStr);
startDate = fmt.parseDateTime(tmpStr);
}
result.add(startDate.toString(fmt) + " 到 " + endDate.toString(fmt));
return result;
}
}
[/code]
[code="java"]
package org.nutz.test5;
import static org.junit.Assert.assertEquals;
import java.util.List;
import org.junit.Test;
public class DateTest {
@Test
public void test_simple_date_split() {
String startDateStr = "2010-8-19 10:20:00";
String endDateStr = "2010-8-20 11:30:00";
List result = DateUtil.split(startDateStr, endDateStr);
assertEquals("2010-8-19 10:20:00 到 2010-8-20 00:00:00", result.get(0));
assertEquals("2010-8-20 00:00:00 到 2010-8-20 11:30:00", result.get(1));
}
@Test
public void test_simple_date_split2() {
String startDateStr = "2010-8-19 10:20:00";
String endDateStr = "2010-8-19 11:30:00";
List<String> result = DateUtil.split(startDateStr, endDateStr);
assertEquals("2010-8-19 10:20:00 到 2010-8-19 11:30:00", result.get(0));
}
@Test
public void test_simple_date_split3() {
String startDateStr = "2010-2-28 10:20:00";
String endDateStr = "2010-3-1 11:30:00";
List<String> result = DateUtil.split(startDateStr, endDateStr);
assertEquals("2010-2-28 10:20:00 到 2010-3-1 00:00:00", result.get(0));
assertEquals("2010-3-1 00:00:00 到 2010-3-1 11:30:00", result.get(1));
}
@Test
public void test_simple_date_split4() {
String startDateStr = "2009-12-31 10:20:00";
String endDateStr = "2010-1-1 11:30:00";
List<String> result = DateUtil.split(startDateStr, endDateStr);
assertEquals("2009-12-31 10:20:00 到 2010-1-1 00:00:00", result.get(0));
assertEquals("2010-1-1 00:00:00 到 2010-1-1 11:30:00", result.get(1));
}
}
[/code]
joda-time这个日期操作库非常强大,线程安全~~见http://www.iteye.com/news/237