显示具有天,小时,分钟和秒的时段

时间:2010-11-10 13:32:47

标签: java formatting jodatime period

我有以下时间1个月5d 22h 35m 39s,我想格式化为35d 22h 35m 39s。但是,在使用以下格式化程序时,月份将被删除,并且尚未添加到日期中:

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

经过一些搜索,我发现一个人应该在Period上使用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)

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

像Elijah Cornell一样悲伤,一般将月数转换为几天是没有意义的,因为月份的长度不同。

然而,可以设想一个应用程序,其中将句点加上特定的开始DateTime(例如当前时间),从开始到结果计算Duration并将持续时间转换为{{1 }}:

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

答案 1 :(得分: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:无法转换为Days,因为此句点包含的月份和月份长度不同