2014-01-06 83 views
1

是否有更好的方法將某個時間單位添加到DateTime對象?將時間單位添加到Joda DateTime對象

我願做類似的東西:

TimeUnit unit = TimeUnit.valueOf("days"); 
DateTime date = new DateTime().add(unit, 20); 

這是我目前的執行情況。

int number = 20; 
MutableDateTime now = new MutableDateTime(); 
String timeUnit = getTimeUnit(); // returns "days", "months", "years" 
if (timeUnit.equals("days")) 
    now.addDays(number); 
else if (timeUnit.equals("months")) 
    now.addMonths(number); 
else 
    now.addYears(number); 
return now.toDateTime(); 

回答

2

我不知道一個內置的方式來做到這一點。相反,您可以創建映射到對應的DurationFieldType對象的String名稱的Map。例如

static Map<String, DurationFieldType> durationFieldTypes = new HashMap<>(); 
static { 
    durationFieldTypes.put("days", DurationFieldType.days()); 
    durationFieldTypes.put("months", DurationFieldType.months()); 
    ... 
} 

然後只需查詢該Map爲合適的對象

MutableDateTime dateTime = new MutableDateTime(); 
String timeUnit = getTimeUnit(); // returns "days", "months", "years" 
dateTime.add(durationFieldTypes.get(timeUnit), amount); 

你可能會需要一些失敗的無效timeUnit值是安全的。

4

Sotirios Delimanolis的答案是正確的。 JodaTime沒有枚舉類概念,因爲它是在JDK5中引入Java泛型和枚舉之前開發的。在Java 8你也可以走這條路或類似:

String name = "days"; // or months or years 
ChronoUnit unit = ChronoUnit.valueOf(name.toUpperCase()); 
LocalDateTime ldt = LocalDateTime.of(...); 
ldt = ldt.plus(number, unit); 

或考慮使用的ZonedDateTime代替LocalDateTime。新方法更加優雅(是的,JodaTime變老了)。