Как создать coutdown на конкретную дату c? - PullRequest
2 голосов
/ 02 августа 2020

Как создать coutdown по указанной c дате?

Я хочу создать обратный отсчет, который отсчитывает обратный отсчет от текущей даты до указанной c даты. Я также пробовал код stackoverflow. Однако у меня было непомерное количество дней или таймер не работал.

My TimeFragment. java

import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.os.CountDownTimer;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.kalirobot.daring.R;
import java.util.Calendar;
import java.util.concurrent.TimeUnit;


public class TimeFragment extends Fragment {

    private TextView timer;
    public static TimeFragment newInstance() {
        return new TimeFragment();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_time, container, false);
        timer = view.findViewById(R.id.textView3);

        Calendar start_calendar = Calendar.getInstance();
        Calendar end_calendar = Calendar.getInstance();
        // end DAY
        end_calendar.set(2020, 8, 23);

        long start_millis = start_calendar.getTimeInMillis();
        long end_millis = end_calendar.getTimeInMillis();
        long total_millis = (end_millis - start_millis);


        CountDownTimer cdt = new CountDownTimer(total_millis, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                long days = TimeUnit.MILLISECONDS.toDays(millisUntilFinished);
                millisUntilFinished -= TimeUnit.DAYS.toMillis(days);
                long hours = TimeUnit.MILLISECONDS.toHours(millisUntilFinished);
                millisUntilFinished -= TimeUnit.HOURS.toMillis(hours);
                long minutes = TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished);
                millisUntilFinished -= TimeUnit.MINUTES.toMillis(minutes);
                long seconds = TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished);
                timer.setText(days + ":" + hours + ":" + minutes + ":" + seconds);
            }

            @Override
            public void onFinish() {
                timer.setText("Finish!");
            }
        };
        cdt.start();
        return view;
    }
}

Теперь результат 51:23:59:41 в timer, а 21 будет ожидаемым значением для части «дней» вместо 51.

Подсказка - если вам нужен обратный отсчет с синхронизированным временем

GitHub

1 Ответ

3 голосов
/ 02 августа 2020

Ваша проблема в том, что 8 представляет не август, а сентябрь, а 23 сентября примерно через 52 дня. Месяц проиндексирован с помощью 0.

Решение: используйте 7 для августа.

См., Например, { ссылка }, чтобы попытаться объяснить почему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...