Я пытаюсь сделать обратный отсчет в днях, часах, минутах, секундах от начальной даты, и по какой-то причине я ошибаюсь в днях, которую не могу найти.
String givenDateString = "2019-05-15T09:00:00";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
try {
Date mDate = sdf.parse(givenDateString);
timeInMilliseconds = mDate.getTime();
} catch (ParseException e) {
e.printStackTrace();
}
new CountDownTimer(timeInMilliseconds, 1000) {
@Override
public void onTick(long millisUntilFinished) {
long day = TimeUnit.MILLISECONDS.toDays(millisUntilFinished);
millisUntilFinished -= TimeUnit.DAYS.toMillis(day);
long hour = TimeUnit.MILLISECONDS.toHours(millisUntilFinished);
millisUntilFinished -= TimeUnit.HOURS.toMillis(hour);
long minute = TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished);
millisUntilFinished -= TimeUnit.MINUTES.toMillis(minute);
long second = TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished);
prueba.setText("Days: "+day+" Hours: "+hour+" Minutes: "+minute+" Seconds: "+second);
}
@Override
public void onFinish() {
// What ever you want !
}
}.start();
И я получаю этот результат:
Новая ошибка android.view.ViewRootImpl$CalledFromWrongThreadException: только исходный поток, создавший иерархию представлений, может касаться своих представлений.
TextView prueba;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
prueba = findViewById(R.id.prueba);
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
Date currentDate = null;
Date destinationDate = null;
try {
currentDate = Calendar.getInstance().getTime();
destinationDate = sdf.parse("2019-05-15T09:00:00");
} catch (ParseException e) {
e.printStackTrace();
}
calculateDifference(currentDate, destinationDate);
}
}, 0, 1000);//Update text every second
}
public void calculateDifference(Date startDate, Date endDate) {
long different = endDate.getTime() - startDate.getTime();
long secondsInMilli = 1000;
long minutesInMilli = secondsInMilli * 60;
long hoursInMilli = minutesInMilli * 60;
long daysInMilli = hoursInMilli * 24;
long days = different / daysInMilli;
different = different % daysInMilli;
long hours = different / hoursInMilli;
different = different % hoursInMilli;
long minutes = different / minutesInMilli;
different = different % minutesInMilli;
long seconds = different / secondsInMilli;
Log.e("calculation", "Days: " + days + " Hours: " + hours + " Minutes: " + minutes + " Seconds: " + seconds);
prueba.setText("Days: " + days + " Hours: " + hours + " Minutes: " + minutes + " Seconds: " + seconds);
}
Я хочу рассчитать оставшееся время от даты, указанной в моем коде, до текущей даты.
например, если вы выберете 1 мая, он рассчитает разницу между текущей датой и 1 мая? правильно ? а также вы выбираете дату будущего, она остается прежней, но в плюсе?
Да, я хочу этого @ArbazPirwani




Здравствуйте, вот как вы можете этого добиться
Вот метод, который вычисляет разницу между двумя датами.
public void calculateDifference(Date startDate, Date endDate) {
long different = endDate.getTime() - startDate.getTime();
long secondsInMilli = 1000;
long minutesInMilli = secondsInMilli * 60;
long hoursInMilli = minutesInMilli * 60;
long daysInMilli = hoursInMilli * 24;
long days = different / daysInMilli;
different = different % daysInMilli;
long hours = different / hoursInMilli;
different = different % hoursInMilli;
long minutes = different / minutesInMilli;
different = different % minutesInMilli;
long seconds = different / secondsInMilli;
Log.e("calculation", "Days: " + days + " Hours: " + hours + " Minutes: " + minutes + " Seconds: " + seconds);
}
Вы можете установить текст вашего текстового представления вместо журнала
И вот как вы можете вызвать таймер с датой
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
Date currentDate = null;
Date destinationDate = null;
try {
currentDate = Calendar.getInstance().getTime();
destinationDate = sdf.parse("2019-05-15T09:00:00");
} catch (ParseException e) {
e.printStackTrace();
}
calculateDifference(currentDate, destinationDate);
}
}, 0, 1000);//Update text every second
}
Я получаю эту ошибку: android.view.ViewRootImpl$CalledFromWrongThreadException: только исходный поток, создавший иерархию представлений, может касаться своих представлений.
Вы можете попробовать это с таймером, который вы создали, это происходит из-за таймера, я думаю
Теперь я просто отредактировал то, что у меня есть, и у меня не работает.
О, но вы знаете, что это на самом деле работает здесь ? и показывает мне, что осталось 11 дней и т. д.
Да, теперь он хорошо вычисляется, но я получаю сообщение об ошибке, когда пытаюсь поместить текст в TextView.
он также настраивается на textview
с какой даты начала вы хотите, чтобы таймер был статистикой, потому что вы не можете рассчитать счетчик всей жизни, поскольку он показывает вам 18000 с лишним дней