2012-04-13 63 views
0

我有如下一个类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秒预计:< [1个月] 5天23小时s 5分钟...>但是:< [] 5天23小时5分钟...>

字符串'[1month]'总是缺失。请检查我是否在代码中丢失了某些东西?

感谢

回答

1

在代码中,你有.appendSuffix("month", "months")其中"month"是单数形式,"months"是复数形式。

您的测试只能通过解析复数形式:

else if(token.contains("months")) { 
    ... 
} 

在这种情况下,因为只有1个月,因此单一测试失败。

更新您的测试代码来解析单数和复数形式,它应该工作!

Documentation