与joda时间保持一致的时间

时间:2014-10-30 16:07:26

标签: android time jodatime

我想在我的Android应用程序中学习剩余时间到18.30。但是,在joda时间码中有年,月和日。我想用joda时间没有约会的剩余时间。

我的代码不会在剩余时间内刷新剩余时间,并且当日期和时间过去时,重新生成时间为负值。所以,我想删除日期值。

DateTime startDate = DateTime.now(); // now() : since Joda Time 2.0
                DateTime endDate = new DateTime(2014, 10, 30, 18, 30);

                Period period = new Period(startDate, endDate, PeriodType.dayTime());

                PeriodFormatter formatter = new PeriodFormatterBuilder()
                        .appendDays().appendSuffix(" day ", " days ")
                        .appendHours().appendSuffix(" hour ", " hours ")
                        .appendMinutes().appendSuffix(" minute ", " minutes ")
                        .appendSeconds().appendSuffix(" second ", " seconds ")
                        .toFormatter();
                 tw.setText(formatter.print(period));

我在http://i.imgur.com/YEjIGFz.png

解释

1 个答案:

答案 0 :(得分:1)

由于一些英语错误,你的文字不太明白。所以这可能是没有答案的主要原因。但是你的图表很清楚并且已经显示了你的努力(所以我想知道为什么到现在为止没有答案)。事实上,您正在搜索剩余时间,直到下一个当地时间18:30

这是一个Joda解决方案:

DateTime startDate = DateTime.now();
DateTime endDate = startDate.withTime(18, 30, 0, 0); // can move back in time!

if (startDate.toLocalTime().isAfter(new LocalTime(18, 30))) {
    endDate = endDate.plusDays(1); // compensation for having moved back
}

Period period = new Period(startDate, endDate, PeriodType.dayTime());

PeriodFormatter formatter = new PeriodFormatterBuilder()
        .appendDays().appendSuffix(" day ", " days ")
        .appendHours().appendSuffix(" hour ", " hours ")
        .appendMinutes().appendSuffix(" minute ", " minutes ")
        .appendSeconds().appendSuffix(" second ", " seconds ")
        .toFormatter();
System.out.println(formatter.print(period));

// output at now about 18:28 => 1 minute 48 seconds 
// output at now about 18:31 => 23 hours 59 minutes 1 second 

正如您所看到的那样,解决方案有点尴尬。这种编码是开发我自己的库Time4J的众多原因之一。它提供了以下更短的解决方案,没有任何if条件:

  PlainTimestamp start = SystemClock.inLocalView().now();
  PlainTimestamp end = 
    start.with(PlainTime.COMPONENT.setToNext(PlainTime.of(18, 30)));
  Duration<ClockUnit> duration = Duration.inClockUnits().between(start, end);

  String p = PrettyTime.of(Locale.UK).print(duration, TextWidth.WIDE, true, 3);
  System.out.println(p); // 23 hours, 40 minutes and 1 second

我个人认为Joda-Time已经过时了,因为大多数人都希望使用Java-8中内置的新库,这些库位于java.time包中(但是不能进行持续时间格式化)。 Joda-Time也没有真正的未来发展(如果我们多年来一直诚实)。根据他的博客文章,Joda-Time的项目负责人似乎希望他的新Threeten-Extra-library能够进一步发展。