Java 使用joda格式化特定时间跨度时的奇怪之处

Java 使用joda格式化特定时间跨度时的奇怪之处,java,android,jodatime,Java,Android,Jodatime,我很难理解这里发生了什么。。。我试图将时间跨度转换为字符串(即“2年6天4小时23秒”) 我得到的数字示例如下: 开始:1309605480723结束:1341227880000 开始时间:2011年7月2日上午4:18:00 完:2012年7月2日上午4:18:00 span.toString:PT8783H59M59.277S 格式化程序。打印(跨度):0年,0个月,1天,23小时,59分钟,59秒 span.toString(格式化程序):0年0月1天23小时59分59秒 产生上述结果的代

我很难理解这里发生了什么。。。我试图将时间跨度转换为字符串(即“2年6天4小时23秒”)

我得到的数字示例如下:

开始:1309605480723结束:1341227880000
开始时间:2011年7月2日上午4:18:00
完:2012年7月2日上午4:18:00
span.toString:PT8783H59M59.277S
格式化程序。打印(跨度):0年,0个月,1天,23小时,59分钟,59秒
span.toString(格式化程序):0年0月1天23小时59分59秒

产生上述结果的代码是:

Period span = new Period(mEndTime - mStartTime);
PeriodFormatter formatter = new PeriodFormatterBuilder()
    .printZeroAlways()
    .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();
Log.d(LOGTAG, "formatter.print: " + formatter.print(span.normalizedStandard()));
Log.d(LOGTAG, "span.toString: " + span.normalizedStandard().toString(formatter));
有人能解释这些数字吗?
也许我在做一些愚蠢的事情,看不见(毕竟现在是凌晨4点),但我就是不明白为什么这8783个小时不能转换成几天?


谢谢。

为救援提供文档!:)

org.joda.time.Period.Period(长持续时间)

使用标准字段集从给定的毫秒持续时间创建一个周期

将仅使用句点类型中的精确字段。对于标准时段类型,这仅是时间字段。因此,年、月、周和日字段将不会填充

尝试:


您得到的日志与代码应该打印的不匹配:它应该打印“formatter.print:”,并且它打印“formatter.print(span)”。你确定你正在查看正确的日志(或运行正确的代码)?复制+粘贴。。。日志和代码被裁剪为只显示解释所需的+1,但您建议使用的构造函数也使用stabdard字段集。您应该添加第三个参数:PeriodType.yearMonthDayTime(),它在我剪切和粘贴解决方案时起作用。是的,许多构造函数确实使用标准的细粒度字段,但我认为Period(long,long)将始终有效。我使用的是jodatime版本1.6.2,但使用的是jmmv。这是一种说法,因为这个构造函数的javadoc说:“使用标准字段集从给定的间隔端点创建一个周期。”这是有效的:周期跨度=新周期(mStartTime,mEndTime);这也起作用了:Period span=new Period(mStartTime、mEndTime、PeriodType.yearMonthDayTime());谢谢
Period span = new Period(mStartTime, mEndTime);