在Android中获取时间直到某个日期

Tas*_*ons 1 android android-datepicker

我使用日期和时间对话框来获取用户指定的事件的日期和时间.该数据是通过执行以下操作转换的:

int yearE = Integer.valueOf(evntDate.split("/")[2]);
int monthE = Integer.valueOf(evntDate.split("/")[1]);
int dayE = Integer.valueOf(evntDate.split("/")[0]); 
int hour = Integer.valueOf(evntTm.split(":")[0]);
int min = Integer.valueOf(evntTm.split(":")[1]);
Run Code Online (Sandbox Code Playgroud)

价值观:

eventDate = "3/5/2015";
eventTime = "13:2";
Run Code Online (Sandbox Code Playgroud)

然后我获取该数据并将其转换为毫秒并将其存储在数据库中:

newCalendar.set(yearE, monthE, dayE,hour, min, 0);
startTime = newCalendar.getTimeInMillis();
...
Run Code Online (Sandbox Code Playgroud)

当我从数据库加载信息时,我尝试计算到指定日期之前剩余的时间.所以我做了以下事情:

Long timeL = Long.valueOf(time);
Calendar eventDay = Calendar.getInstance();
eventDay.setTimeInMillis(timeL);
Calendar today = Calendar.getInstance();
long diff = eventDay.getTimeInMillis() - today.getTimeInMillis();

// CONVERT:
int seconds = (int) TimeUnit.MILLISECONDS.toSeconds(diff);
int minutes = (int) TimeUnit.MILLISECONDS.toMinutes(diff);
int hours = (int) TimeUnit.MILLISECONDS.toHours(diff);
int days = (int) TimeUnit.MILLISECONDS.toDays(diff);
...
Run Code Online (Sandbox Code Playgroud)

当我记录上述数据时,日期通常在30-32左右,其余数据也不正确.我究竟做错了什么?或者有哪些替代方案?

Jim*_*mmy 5

考虑使用Joda时间库而不是日历,它更容易使用.

当你在Android上时,我会假设你正在使用gradle,所以继续把它放在你的依赖项中

compile 'joda-time:joda-time:2.3'
Run Code Online (Sandbox Code Playgroud)

我已经创建了一个小psvm来演示如何使用它

import org.joda.time.DateTime;
import org.joda.time.Period;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.PeriodFormat;

import static java.lang.String.format;

public class DateTimeDemo {

    public static void main(String[] args) {

        // Your date/time values, I'll assume you missed a digit off the time ;)
        String eventDate = "3/5/2015";
        String eventTime = "13:20";

        // convert these to a DateTime object
        DateTime targetDateTime = DateTime.parse(format("%s %s", eventDate, eventTime), DateTimeFormat.forPattern("dd/MM/yyyy HH:mm"));

        // print out the millis, or in your case, save it to DB
        System.out.println("targetDateTime in millis is " + targetDateTime.getMillis());

        // grab a timestamp
        DateTime now = DateTime.now();

        // print it out, just for demo
        System.out.println("millis for now is " + now.getMillis());

        // create a period object between the two
        Period period = new Period(now, targetDateTime);

        // print out each part
        System.out.println("seconds " + period.getSeconds());
        System.out.println("hours " + period.getHours());
        System.out.println("months " + period.getMonths());

        // convert the period to a printable String
        String prettyPeriod = PeriodFormat.getDefault().print(period);

        // write it out!
        System.out.println(prettyPeriod);


    }
}
Run Code Online (Sandbox Code Playgroud)

输出是

targetDateTime in millis is 1430623200000
millis for now is 1425527593584
seconds 46
hours 22
months 1
1 month, 3 weeks, 6 days, 22 hours, 26 minutes, 46 seconds and 416 milliseconds
Run Code Online (Sandbox Code Playgroud)