gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:52:44 24 4
gpt4 key购买 nike

奇怪的是,我遇到的问题与许多类似的帖子相反;我正在尝试使用 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,表示耗时(以毫秒为单位),在本例中值为 2045489151。

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

探索期间的 iType 成员的结构,我看到一个包含元素“年”、“月”等的数组 iTypes。我还看到一个数组 iIndices,它似乎将类型映射到其他数组中的元素。大多数指数都有意义,但与“天数”对应的指数是 -1。所以看起来 PeriodType.yearMonthDayTime() 没有按照我认为文档所说的那样去做。

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

想知道从我相当任意(选择一个数字并不断添加零)1500000ms 得到恰好 25 小时的巧合,我尝试了 1510000 并得到 25h 10m 0s。但是,当您手动进行转换时,这些实际上都没有任何意义!

这是在 Android 上,最新的 Android Studio 1.3.2,不确定如何判断我使用的是哪个版本的 JodaTime,但它是在过去几个月内,这看起来有点太明显而不是一个模糊的错误 -我认为更多的是误解和我挖掘得太深的结合。

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

最佳答案

好吧,Joda-Time 说的是 normalization of a millisecond-based period :

Creates a period from the given millisecond duration. Only precise fields in the period type will be used. Imprecise fields will not be populated.

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

如何才能得到想要的归一化效果?只需执行此推荐方法(在构建周期时不进行标准化):

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-constructor 进行了部分规范化,这是为了辩论。在我看来,要么使用给定的周期类型进行完全规范化,要么根本不进行规范化(我更喜欢 - 只是将毫秒保留为毫秒,但第二个构造函数参数简直是愚蠢的)将是一个更明智的设计决定。有趣的是(也令人困惑),没有显式句点类型参数的构造函数也进行了部分规范化。为避免构造函数中过早的不完全规范化,您必须将周期类型显式指定为 PeriodType.millis()。对于您的困惑,我们深表歉意。

关于android - JodaTime:打印周期为天:小时:分钟:秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32765456/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com