【问题标题】:CountDown Timer not showing number of days left倒计时计时器不显示剩余天数
【发布时间】:2014-08-01 10:00:42
【问题描述】:

我正在编写一个程序,我在其中使用倒计时直到特定日期和时间,结果我得到以小时、分钟、秒格式倒计时,但我也想显示天数

得到这个:

       Time remaining: 630 hours, 57 minutes, 25 seconds

需要这个:

       Time remaining: 26 days, 11 hours, 57 minutes, 25 seconds

活动代码:-

    public void onTick(long millisUntilFinished) {
                String result = ToReadableString(new org.joda.time.Period(millisUntilFinished));                   
                countdown.setText("Time remaining: " + result);
            }

    private String ToReadableString(Period period) {

        int days = period.get(DurationFieldType.days());

        int hours = period.get(DurationFieldType.hours());
        int minutes = period.getMinutes();
        int seconds = period.getSeconds();

        StringBuilder sb = new StringBuilder();

        if (days > 0) {
            sb.append(days);
            if (days == 1) {
                sb.append(" day, ");
            } else {
                sb.append(" days, ");
            }
        }

        if (hours > 0) {
            sb.append(hours);
            if (hours == 1) {
                sb.append(" hour, ");
            } else {
                sb.append(" hours, ");
            }
        }

        if (minutes > 0) {
            sb.append(minutes);
            if (minutes == 1) {
                sb.append(" minute, ");
            } else {
                sb.append(" minutes, ");
            }
        }

        if (seconds > 0) {
            sb.append(seconds);
            if (seconds == 1) {
                sb.append(" second, ");
            } else {
                sb.append(" seconds, ");
            }
        }

        String result = sb.toString().trim();

        if (result.endsWith(","))
            result = result.substring(0, result.length() - 1);

        return result;
    }
}

【问题讨论】:

  • 在您的 ToReadableString 函数中,您可以获得小时数 - 您不能自己将它们转换为天数并使用余数来计算小时数吗?

标签: android datetime timer countdown countdowntimer


【解决方案1】:

在您的 ToReadableString 函数中,只需执行以下操作即可从小时数中获取天数 - 您还必须计算出其他差异:

int days = hours/24;
hours = hours % 24;


//rest of conversion code

【讨论】:

  • 我觉得你弄错了小时数,为什么要乘以 24?
  • 例如。我们知道的 73 小时是 3 天零 1 小时。所以 73/24 = 3.04166667 这给了我们 3 天的时间。然后你将余数乘以 24。所以 0.04166667*24 = 1。希望能解决这个问题
  • 73%24=1,不需要乘以24
  • 顺便说一句,我使用了这些行:int days = hours/24;小时 = 小时 % 24;并获得更好的结果
  • 根据反馈编辑
【解决方案2】:

编辑:

我正在编辑此内容以强调为什么让 Jodatime 承担繁重的工作可能是更好的选择。您可以完全删除ToReadableString,您所需要的只是(我将一些变量提取到常量中,这不是绝对必要的):

private static final PeriodType PERIOD_TYPE = PeriodType.dayTime().withMillisRemoved();
private static final PeriodFormatter PERIOD_FORMATTER = PeriodFormat.getDefault();

public void onTick(long millisUntilFinished) {
    Period period = new Period(millisUntilFinished, PERIOD_TYPE);
    countdown.setText("Time remaining: " + PERIOD_FORMATTER.print(period));
}

最重要的是,您可以毫不费力地获得 Jodatime 的所有好东西。更少的代码,更少的错误。

编辑结束;

Joda time 的 public Period(long duration) 构造函数使用标准字段集,因此不包括年/日等,您应该使用替代构造函数 public Period(long duration, PeriodType type)

为您的示例替换:

String result = ToReadableString(new org.joda.time.Period(millisUntilFinished));

与:

String result = ToReadableString(new org.joda.time.Period(millisUntilFinished, org.joda.time.PeriodType.dayTime().withMillisRemoved()));

作为旁注,Jodatime 可以消除将句点转换为字符串的麻烦。为此使用PeriodFormatter。例如:

String yourOutputString = PeriodFormat.getDefault().print(period);

您可能希望修复导入以提高可读性。

朋友:Joda time Javadoc

【讨论】:

    【解决方案3】:

    您可以手动计算。 我粘贴下面的方法,根据 MillSecond 的差异计算天小时分钟和秒。

    public static String getDateHourMinSecond(long diffMillis) {
    
        long days = TimeUnit.MILLISECONDS.toDays(diffMillis);
        diffMillis -= TimeUnit.DAYS.toMillis(days);
        long hours = TimeUnit.MILLISECONDS.toHours(diffMillis);
        diffMillis -= TimeUnit.HOURS.toMillis(hours);
        long minutes = TimeUnit.MILLISECONDS.toMinutes(diffMillis);
        diffMillis -= TimeUnit.MINUTES.toMillis(minutes);
        long seconds = TimeUnit.MILLISECONDS.toSeconds(diffMillis);
        String dhms = days + " : " + hours + " : " + minutes + " : " + seconds;
        return dhms;
    }
    

    【讨论】:

      【解决方案4】:

      试试这个功能

      public void clockCounter(Date startTime) {
      Date currentDate =null;
      SimpleDateFormat dateFormat = new SimpleDateFormat(
                          "yyyy-MM-dd HH:mm:ss");
      
                  Calendar cal = Calendar.getInstance();
                  currentDate = dateFormat.parse(dateFormat.format(cal.getTime()));
      
              long diffInSec = startTime.getTime() - currentDate.getTime();
      
              long seconds = diffInSec % 60;
              diffInSec /= 60;
              long minutes = diffInSec % 60;
              diffInSec /= 60;
              long hours = diffInSec % 24;
              diffInSec /= 24;
              long days = diffInSec;
      
              Log.i("Difference", days+":"+hours+":"+minutes+":"+seconds);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-22
        • 1970-01-01
        • 2019-11-30
        • 1970-01-01
        • 1970-01-01
        • 2018-06-07
        • 1970-01-01
        相关资源
        最近更新 更多