我有一个类DurationFormatter如下:
import java.util.Date;
import org.joda.time.DateTime;
import org.joda.time.Period;
import org.joda.time.format.PeriodFormatter;
import org.joda.time.format.PeriodFormatterBuilder;
public class DurationFormatter {
private final static PeriodFormatter DURATION_FORMATTER =
new PeriodFormatterBuilder().appendYears()
.appendSuffix("year", "years")
.appendSeparator(" ")
.appendMonths()
.appendSuffix("month", "months")
.appendSeparator(" ")
.appendDays()
.appendSuffix("day", "days")
.appendSeparator(" ")
.appendHours()
.appendSuffix("hour", "hours")
.appendSeparator(" ")
.appendMinutes()
.appendSuffix("minute", "minutes")
.appendSeparator(" ")
.appendSeconds()
.appendSuffix("second", "seconds")
.toFormatter();
public static String format(Date start) {
StringBuffer result = new StringBuffer();
DURATION_FORMATTER.printTo(result,
new Period(new DateTime(start), new DateTime()));
return result.toString();
}
public static String format(Date start, Date end) {
StringBuffer result = new StringBuffer();
DURATION_FORMATTER.printTo(result,
new Period(new DateTime(start),
end == null
? new DateTime()
: new DateTime(end)));
return result.toString();
}
}
这是我的单元测试:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import junit.framework.Assert;
import org.joda.time.DateTime;
import org.joda.time.Period;
import org.junit.Test;
public class DurationFormatterTest {
@Test
public void testFormatDate() throws ParseException {
int years = 0;
int months = 0;
int weeks = 0;
int days = 0;
int hours = 0;
int minutes = 0;
int seconds = 0;
SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
String dateString = "07/27/2010 12:07:34";
Date startDate = (Date) df.parse( dateString );
// Find duration 1
String duration1 = DurationFormatter.format(startDate);
// Parse duration 1 and set values into new Period
String[] tokens = duration1.split("[ ]");
for( int index = 0; index < tokens.length; index++ ) {
String token = tokens[index];
if( token.contains("years") ) {
years = Integer.valueOf(token.replace("years", ""));
System.out.println("Years are: " + years);
}
else if( token.contains("months") ) {
months = Integer.valueOf(token.replace("months", ""));
System.out.println("Months are: " + months);
}
else if( token.contains("days") ) {
days = Integer.valueOf(token.replace("days", ""));
System.out.println("Days are: " + days);
}
else if( token.contains("hours") ) {
hours = Integer.valueOf(token.replace("hours", ""));
}
else if( token.contains("minutes") ) {
minutes = Integer.valueOf(token.replace("minutes", ""));
}
else if( token.contains("seconds") ) {
seconds = Integer.valueOf(token.replace("seconds", ""));
}
}
Period period = new Period( years, months, weeks, days, hours, minutes, seconds, 0);
// User period to initialize new endDate
DateTime endDate = new DateTime(startDate).plus(period);
// Find duration 2 using new endDate
String duration2 = DurationFormatter.format(startDate, endDate.toDate());
// If the durations are the same, then success.
Assert.assertEquals(
"The date of " + duration2
+ " is equal to " + duration1,
duration1, duration2);
}
}
结果始终输出错误:
junit.framework.ComparisonFailure: 5天23小时5分23秒的日期等于1个月5天23小时5分钟预期23秒:&lt; [1个月] 5天23小时5分钟...&gt;但是:&lt; [] 5天23小时5分钟......&gt;
字符串'[1month]'总是丢失。请检查我是否遗漏了代码中的内容?
由于
答案 0 :(得分:1)
在您的代码中,您有.appendSuffix("month", "months")
,其中"month"
是单数形式,"months"
是复数形式。
您的测试仅解析复数形式:
else if( token.contains("months") ) {
...
}
在这种情况下,测试失败,因为它只有1个月,因此是单数。
更新您的测试代码以解析单数和复数形式,它应该可以工作!