JodaTime:打印周期为天:小时:分钟:秒

时间:2015-09-24 15:36:39

标签: android jodatime

奇怪的是,我对很多类似的帖子都有反问题;我试图使用JodaTime(在Android上)给我一个dd:hh:mm:ss输出并且失败了。代码是;

public String GetEventTimeString(boolean withMS, int eventTime)
{
    Period p = new Period(eventTime, PeriodType.yearMonthDayTime());
    if (withMS)
        return _formatter_withms.print(p);
    else return _formatter_withoutms.print(p);

}

当我在设置p后使用调试器暂停时,我看到p本身的小时值设置为568且天数值为零,所以我没有发布创建的代码格式化程序。 eventTime是一个int,表示以ms为单位的经过时间,在这种情况下的值为2045489151。

如果数字的大小有些奇怪,而且事实上它是一个int而不是long,我尝试制作new Period(1500000L, PeriodType.yearMonthDayTime())并获得0天的时间, 25小时0分秒。

探索期间iType成员的结构,我看到一个包含元素的数组iTypes" years"," months"我还看到了一个数组iIndices,它似乎将类型映射到其他数组中的元素。大多数指数都有意义,但指数对应于" Days"是-1。所以似乎PeriodType.yearMonthDayTime()并没有做我认为文档应该做的事情。

如果我尝试PeriodType.yearWeekDayTime,我会得到相同的结果。如果我尝试PeriodType.yearWeekDay,那么我的25小时测试值就会使这三个字段为零。因此,不仅仅是一个PeriodType行为不正常。

想知道从我相当随意的25个小时(选择一个数字并保持加零)1500000毫秒的巧合,我尝试1510000并获得25小时10分0秒。但是当你手动完成转换时,这些都没有任何意义!

这是在Android上,最新的Android Studio 1.3.2,不知道如何判断我使用的JodaTime版本,但在过去的几个月里,这似乎有点过于明显了这是一个模糊的错误 - 我认为更多的是误解和深入挖掘的组合。

有没有人对正在发生的事情有任何想法?

1 个答案:

答案 0 :(得分:1)

嗯,Joda-Time谈到了normalization of a millisecond-based period

  

从给定的毫秒持续时间创建一个句点。只有精确   将使用句点类型中的字段。不精确的字段不会   填充。

这里出现的问题是:在Joda-Time的背景下,日单位是一个精确的字段吗?不,因为在许多国家/地区开启/关闭日光节目时间的一天可以有23或25小时(实际上还有更多的可能性,如23.5小时等)。因此,您调用的构造函数不会填充day-unit-field。

如何获得所需的归一化效果?只是做这个推荐的方法(在构建期间没有规范化):

long eventTime = 2045489151;
Period p = new Period(eventTime, PeriodType.millis());
System.out.println(p); // PT2045489.151S (no normalization)

System.out.println(p.normalizedStandard(PeriodType.dayTime()));
// P23DT16H11M29.151S
System.out.println(p.normalizedStandard(PeriodType.yearMonthDayTime()));
// P23DT16H11M29.151S ( the same result as one line before, not the best period type)

对于恕我直言的问题,Period - 构造函数用于进行部分规范化。在我看来,使用给定周期类型的完全标准化或根本没有标准化(我更喜欢 - 只是将毫秒作为毫秒,但第二个构造函数参数只是愚蠢)将是一个更明智的设计决策。有趣的是(也是令人困惑的),没有显式句点类型参数的构造函数也会进行部分规范化。为避免构造函数中的过早不完全规范化,您必须将句点类型明确指定为PeriodType.millis()。抱歉你的困惑。