Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android JodaTime:打印周期为天:小时:分钟:秒_Android_Jodatime - Fatal编程技术网

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

Android JodaTime:打印周期为天:小时:分钟:秒,android,jodatime,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 _form

奇怪的是,我在许多类似的帖子中都遇到了反问题;我试图使用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是一个整数,表示以毫秒为单位的运行时间,在本例中的值为2045489151

如果数字的大小有点奇怪,而且它是一个int而不是long,我尝试创建一个
新的周期(1500000L,PeriodType.yearMonthDayTime())
,得到了0天25小时0分零秒的周期

在探索该时期的iType成员的结构时,我看到了一个数组iTypes,其中包含“年”、“月”等元素。我还看到了一个数组indices,它似乎将类型映射到其他数组中的元素。大多数指数都有意义,但与“天”对应的指数是-1。因此,
PeriodType.yearMonthDayTime()
似乎没有像我认为的那样做

如果我尝试
PeriodType.yearWeekDayTime
我会得到相同的结果。如果我尝试
PeriodType.yearWeekDay
,则这三个字段与我的25小时测试值为零。所以,这不仅仅是一个周期类型的行为不端

我很想知道,从我相当随意(选择一个数字并不断添加零)的150000ms中得到正好25小时的巧合,于是我尝试了1510000次,得到了25小时1000毫秒。但是,当您手动进行转换时,这两种方法实际上都没有任何意义

这是安卓上的,最新的安卓Studio 1.3.2,不知道如何告诉我使用的是什么版本的JodaTime,但这是在过去几个月内,这似乎有点太明显了,不可能是一个模糊的错误-我想更多的是我的误解和挖掘太深的结合


有人对正在发生的事情有什么想法吗?

好吧,Joda Time说:

从给定的毫秒持续时间创建一个周期。唯一精确的 将使用期间类型中的字段。不精确的字段将不会被删除 人口稠密

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

如何获得所需的规范化效果?只需执行建议的方法(构建周期时不进行规范化):


您使用的
Period
-constructor进行部分规范化是为了解决这个问题。在我看来,要么使用给定的句点类型进行完全规范化,要么根本不进行规范化(我更喜欢——只将毫秒保留为毫秒,但第二个构造函数参数很愚蠢),这将是一个更明智的设计决策。有趣的是(也是令人困惑的),没有显式句点类型参数的构造函数也进行了部分规范化。为了避免构造函数中过早的不完全规范化,必须将句点类型显式指定为
PeriodType.millis()
。很抱歉让您感到困惑。

一段简短但完整的可编译代码就好了;-)。如何构造“_格式化程序…”?这是一个
PeriodFormatter
?好吧,正如我在文章中所说的那样,我发现问题在格式化程序之前,所以发布它真的没有意义!你是对的。在我写了我的评论之后,我终于明白你的问题与格式无关,而与句点的规范化有关。
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)