2010-11-10 97 views
2

我有以下期間1個月5天22小時35分39秒,我想要格式化爲35天22小時35分39秒。使用以下格式,月份剛剛刪除,並沒有被添加到天然而,當:顯示天數,小時,分鐘和秒數

PeriodFormatter formatter = new PeriodFormatterBuilder() 
    .printZeroAlways() 
    .appendDays().appendSuffix(" d ") 
    .appendHours().appendSuffix(" h ") 
    .appendMinutes().appendSuffix(" m ") 
    .appendSeconds().appendSuffix(" s ") 
    .toFormatter(); 

經過一番搜索,我發現一個應該使用normalizedStandard()方法的時期,但在使用它與period.normalizedStandard(PeriodType.dayTime())我收到以下錯誤:

java.lang.UnsupportedOperationException: Field is not supported 
    at org.joda.time.PeriodType.setIndexedField(PeriodType.java:690) 
    at org.joda.time.Period.withMonths(Period.java:851) 
    at org.joda.time.Period.normalizedStandard(Period.java:1541) 
    at amadeus.bid.wicket.markup.html.CountDownLabel.onComponentTagBody(CountDownLabel.java:34) 

任何想法?

+0

也許thsi幫助http://stackoverflow.com/questions/1440557/joda-time-period-to-string – Thariama 2010-11-10 13:42:08

+0

您使用的月份和分鐘相同的後綴。 – 2010-11-10 14:04:10

+0

吉爾伯特:抱歉意味着要刪除它。 – Kristoffer 2010-11-15 07:35:20

回答

0

我不認爲有可能將某個月份的某個月數轉換回幾天,因爲一個月中的天數會有所不同。

例子:

//From: 1month 5d 22h 35m 39s 
Period period = new Period(0, 1, 0, 5, 22, 35, 39, 0); 
//To: 35d 22h 35m 39s. 
period.toStandardDays(); 

拋出以下異常:java.lang.UnsupportedOperationException:因爲這期間包含了幾個月的時間長短不一

1

以利亞一樣康奈爾傷心,一般無法轉換爲天隨着月份的長度變化,將月份轉換爲日期是沒有意義的。

然而可以想象其中是有意義的應用程序加上週期到一個特定的開始DateTime(例如當前時間),計算值Duration從開始到產生和轉換持續時間,以一個週期的PeriodType.dayTime()

// 1 month 5d 22h 35m 39s 
Period period = new Period(0, 1, 0, 5, 22, 35, 39, 0); 

Instant start = new Instant(); 
// current time => 2011-03-17T22:24:01.848+01:00 
Duration dura = new Duration(start, start.toDateTime().plus(period)); 
Period period2 = new Period(dura).normalizedStandard(PeriodType.dayTime()); 
// => 36d 21h 35m 39s 

雖然結果取決於開始,它的時區,超過夏令時邊界等,並且此時不提供期望的35d 22h 35m 39s,但是36d 21h 35m 39s這對我而言可能是有意義的,因爲它是Period的一般用例加上DateTime產生新的DateTime

+0

感謝您的回覆。從用戶的角度來看,我認爲顯示日期而不是幾個月是有意義的。系統應該更好地計算,而不是將其留給用戶。 我試圖瞭解上面例子中發生了什麼。爲什麼它沒有提供所需的? – Kristoffer 2011-03-18 09:16:36

+0

@Kristoffer讓我們開始使用'Instant start = new Instant(「2011-03-17T00:00:00.000 + 01:00」);''來簡化。然後''start.toDateTime()。plus(句點)'由於'04'在'03'後1個月變成'2011-04-22T22:35:39.000 + 02:00','22'在' 17:和22:35:39'是...... 00:00:00之後。但是1.如果你從「2011-03-17」到「2011-04-22」,你會得到36天。 2.錯過的時間是從'02:00'到'03:00'(夏令時開始)'2011-03-27'的時鐘提前,您可以在將utc時區偏差從' +01:00'到'+02:00'。 – binuWADa 2011-03-19 13:37:10

+0

@Kristoffer如果你用'Instant start = new Instant(「2011-04-01T00:00:00.000 + 02:00」)開始,'在夏令時內,並且有30天長的月份(4月) '35d 22h 35m 39s'。結論:這取決於郵政已經提到的開始時間。 – binuWADa 2011-03-19 13:39:49

相關問題