我目前正在尝试在用户可以输入日期的功能中加入一个功能,然后当他们保存日期时,我想计算从今天开始到该日期的剩余天数。我的代码如下:
public void daysLeft(String dateSent){
String []ar = dateSent.split("[/]");
int mDay = Integer.parseInt(ar[1]);
int mMonth = Integer.parseInt(ar[0]);
int mYear = Integer.parseInt(ar[2]);
Time TimerSet = new Time();
TimerSet.set(0, 5, 0, mDay, mMonth, mYear); //day month year
TimerSet.normalize(true);
long millis = TimerSet.toMillis(true);
Time TimeNow = new Time();
TimeNow.setToNow(); // set the date to Current Time
TimeNow.normalize(true);
long millis2 = TimeNow.toMillis(true);
long millisset = millis - millis2; //subtract current from future to set the time remaining
final int smillis = (int) (millis); //convert long to integer to display conversion results
final int smillis2 = (int) (millis2);
new CountDownTimer(millisset, 1000) {
public void onTick(long millisUntilFinished) {
mText = (TextView)findViewById(R.id.DateData);
// decompose difference into days, hours, minutes and seconds
int weeks = (int) ((millisUntilFinished / 1000) / 604800);
int days = (int) ((millisUntilFinished / 1000) / 86400);
int hours = (int) (((millisUntilFinished / 1000) - (days * 86400)) / 3600);
int minutes = (int) (((millisUntilFinished / 1000)
- ((days * 86400) + (hours * 3600))) / 60);
int seconds = (int) ((millisUntilFinished / 1000) % 60);
int millicn = (int) (millisUntilFinished / 1000);
mText.setText(" " + days);
saveDate(String.valueOf(days));
}
public void onFinish() {}
}.start();
}
当我运行此代码并说日期为2015年7月19日,然后剩下的日子回到760,他们本应该是730.我认为有一些计算略有偏离,真的很感激一些帮助有这个。
由于
答案 0 :(得分:1)
错误在月计算中。在java中,Months从0开始(0表示1月)。
因此,
int mMonth = Integer.parseInt(ar[0]);
在您的示例中不正确,它被解释为8月。
您需要减去1:
int mMonth = Integer.parseInt(ar[0]) - 1;
TimerSet.set(0, 5, 0, mDay, mMonth, mYear);
需要一个基于0的月份。 7,在您的示例中,被理解为August,这就是您需要将1减去您解析的基于1的值的原因。
答案 1 :(得分:0)
您可以使用我的TimeSpan
课程:
Calendar future = Calendar.getInstance();
future.set(2015, 6, 19); // month is zero based
Date now = Calendar.getInstance().getTime();
TimeSpan timeSpan = TimeSpan.fromMiliseconds(future.getTimeInMillis() - now.getTime());
Log.d(TAG, "Days left : " + timeSpan.getDays()); // "Days left : 730"
TimeSpan
上课:
public class TimeSpan implements Comparable<TimeSpan> {
Long days;
Long hours;
Long minutes;
Long seconds;
Long milliseconds;
public TimeSpan() {
days = hours = minutes = seconds = milliseconds = 0l;
}
public TimeSpan(long _days, long _hours, long _minutes, long _seconds, long _milliseconds) {
long totalMS = _days * 86400000 + _hours * 3600000 + _minutes * 60000 + _seconds * 1000 + _milliseconds;
days = Long.valueOf(totalMS / 86400000);
totalMS -= days * 86400000;
hours = Long.valueOf((int) totalMS / 3600000);
totalMS -= hours * 3600000;
minutes = Long.valueOf((int) totalMS / 60000);
totalMS -= minutes * 60000;
seconds = Long.valueOf((int) totalMS / 1000);
totalMS -= seconds * 1000;
milliseconds = Long.valueOf((int) totalMS);
}
public static TimeSpan fromSeconds(int _seconds) {
return new TimeSpan(0, 0, 0, _seconds, 0);
}
public static TimeSpan fromMiliseconds(long _miliseconds) {
return new TimeSpan(0, 0, 0, 0, _miliseconds);
}
@Override
public String toString() {
return Long.toString(getTotalMilliseconds());
}
public String toSimpleShortString() {
if (hours > 0)
return String.format("%d:%d:%02d", hours, minutes, seconds);
else
return String.format("%d:%02d", minutes, seconds);
}
public String toShortString() {
return String.format("%02d:%02d:%02d", hours, minutes, seconds);
}
public String toLongString() {
return String.format("%02d:%02d:%02d:%02d", hours, minutes, seconds, milliseconds);
}
public long getHours() {
return hours;
}
public long getDays() {
return days;
}
public long getMinutes() {
return minutes;
}
public long getSeconds() {
return seconds;
}
public long getMilliseconds() {
return milliseconds;
}
public long getTotalMilliseconds() {
return days * 86400000 + hours * 3600000 + minutes * 60000 + seconds * 1000 + milliseconds;
}
@Override
public int compareTo(TimeSpan another) {
return (int) (getTotalMilliseconds() - another.getTotalMilliseconds());
}
}