如何在特定日期创建倒计时?

huangapple go评论110阅读模式
英文:

How do you create a coutdown on a specific date?

问题

如何在特定日期创建倒计时?

我想创建一个从当前日期倒数到特定日期的倒计时。
我还尝试了stackoverflow上的代码。然而,我得到了大量的天数或计时器不工作的问题。

我的TimeFragment.java

  1. import android.os.Bundle;
  2. import androidx.fragment.app.Fragment;
  3. import android.os.CountDownTimer;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.widget.TextView;
  8. import com.kalirobot.daring.R;
  9. import java.util.Calendar;
  10. import java.util.concurrent.TimeUnit;
  11. public class TimeFragment extends Fragment {
  12. private TextView timer;
  13. public static TimeFragment newInstance() {
  14. return new TimeFragment();
  15. }
  16. @Override
  17. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  18. View view = inflater.inflate(R.layout.fragment_time, container, false);
  19. timer = view.findViewById(R.id.textView3);
  20. Calendar start_calendar = Calendar.getInstance();
  21. Calendar end_calendar = Calendar.getInstance();
  22. // end DAY
  23. end_calendar.set(2020, 8, 23);
  24. long start_millis = start_calendar.getTimeInMillis();
  25. long end_millis = end_calendar.getTimeInMillis();
  26. long total_millis = (end_millis - start_millis);
  27. CountDownTimer cdt = new CountDownTimer(total_millis, 1000) {
  28. @Override
  29. public void onTick(long millisUntilFinished) {
  30. long days = TimeUnit.MILLISECONDS.toDays(millisUntilFinished);
  31. millisUntilFinished -= TimeUnit.DAYS.toMillis(days);
  32. long hours = TimeUnit.MILLISECONDS.toHours(millisUntilFinished);
  33. millisUntilFinished -= TimeUnit.HOURS.toMillis(hours);
  34. long minutes = TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished);
  35. millisUntilFinished -= TimeUnit.MINUTES.toMillis(minutes);
  36. long seconds = TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished);
  37. timer.setText(days + ":" + hours + ":" + minutes + ":" + seconds);
  38. }
  39. @Override
  40. public void onFinish() {
  41. timer.setText("Finish!");
  42. }
  43. };
  44. cdt.start();
  45. return view;
  46. }
  47. }

现在timer中的输出是51:23:59:41,而期望的"天"部分应该是21而不是51

提示 - 如果您想要一个带有同步时间的倒计时

GitHub

英文:

How do you create a coutdown on a specific date?

I want to create a countdown that counts down from the current date to a specific date.
I've also tried stackoverflow code. However, I had an exorbitant number of days or that the timer didn't work.

My TimeFragment.java

  1. import android.os.Bundle;
  2. import androidx.fragment.app.Fragment;
  3. import android.os.CountDownTimer;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.widget.TextView;
  8. import com.kalirobot.daring.R;
  9. import java.util.Calendar;
  10. import java.util.concurrent.TimeUnit;
  11. public class TimeFragment extends Fragment {
  12. private TextView timer;
  13. public static TimeFragment newInstance() {
  14. return new TimeFragment();
  15. }
  16. @Override
  17. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  18. View view = inflater.inflate(R.layout.fragment_time, container, false);
  19. timer = view.findViewById(R.id.textView3);
  20. Calendar start_calendar = Calendar.getInstance();
  21. Calendar end_calendar = Calendar.getInstance();
  22. // end DAY
  23. end_calendar.set(2020, 8, 23);
  24. long start_millis = start_calendar.getTimeInMillis();
  25. long end_millis = end_calendar.getTimeInMillis();
  26. long total_millis = (end_millis - start_millis);
  27. CountDownTimer cdt = new CountDownTimer(total_millis, 1000) {
  28. @Override
  29. public void onTick(long millisUntilFinished) {
  30. long days = TimeUnit.MILLISECONDS.toDays(millisUntilFinished);
  31. millisUntilFinished -= TimeUnit.DAYS.toMillis(days);
  32. long hours = TimeUnit.MILLISECONDS.toHours(millisUntilFinished);
  33. millisUntilFinished -= TimeUnit.HOURS.toMillis(hours);
  34. long minutes = TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished);
  35. millisUntilFinished -= TimeUnit.MINUTES.toMillis(minutes);
  36. long seconds = TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished);
  37. timer.setText(days + ":" + hours + ":" + minutes + ":" + seconds);
  38. }
  39. @Override
  40. public void onFinish() {
  41. timer.setText("Finish!");
  42. }
  43. };
  44. cdt.start();
  45. return view;
  46. }
  47. }

The output now is 51:23:59:41 in the timer while 21 would be the expected value for the "days" portion instead of 51.

Hint - If you want a countdown with synchronized time

GitHub

答案1

得分: 3

你的问题是8代表的不是八月,而是九月,而九月23日距今大约还有52天。月份是从0开始计数的。

解决方案:使用7代表八月。

参考:https://stackoverflow.com/a/344400/2442804,尝试解释为什么这样做。

英文:

Your problem is that 8 does not represent August but September, and the 23rd of September is more or less 52 days from now. The month is 0-indexed.

Solution: use 7 for August.

See e.g. https://stackoverflow.com/a/344400/2442804 for an attempt at explaining why.

huangapple
  • 本文由 发表于 2020年8月3日 02:12:10
  • 转载请务必保留本文链接:https://go.coder-hub.com/63219498.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定