Android天还剩下

时间:2013-01-04 11:04:49

标签: java android time

我需要从一个日期到第二个日期执行CountDown Days

例如

CURRENT_DATE:3/1/2013 NEXT_DATE:21/01/2013

然后显示:: 17 DAYS LEFT

我实现了像这样的代码

String inputDateString = "01/22/2013";
Calendar calCurr = Calendar.getInstance();
Calendar calNext = Calendar.getInstance();
calNext.setTime(new Date(inputDateString)); 

if(calNext.after(calCurr)) 
{
    long timeDiff = calNext.getTimeInMillis() - calCurr.getTimeInMillis();
    int daysLeft = (int) (timeDiff/DateUtils.DAY_IN_MILLIS);
    dni.setText("Days Left: "+daysLeft);
}
else
{
    long timeDiff = calCurr.getTimeInMillis() - calNext.getTimeInMillis();
    timeDiff = DateUtils.YEAR_IN_MILLIS - timeDiff;
    int daysLeft = (int) (timeDiff/DateUtils.DAY_IN_MILLIS);
}

有没有更好的方法来实现这些目标?

6 个答案:

答案 0 :(得分:4)

使用Calendar的方法:

String inputDateString = "01/22/2013";
Calendar calCurr = Calendar.getInstance();
Calendar day = Calendar.getInstance();
day.setTime(new SimpleDateFormat("MM/dd/yyyy").parse(inputDateString));
if(day.after(calCurr)){
               System.out.println("Days Left: " + (day.get(Calendar.DAY_OF_MONTH) -(calCurr.get(Calendar.DAY_OF_MONTH))) );
}

输出:剩余天数:17

要将年份增加1,您可以使用Calendar.add()方法

        day.add(Calendar.YEAR, 1);

答案 1 :(得分:2)

有几个库可将日期转换为n days格式:

答案 2 :(得分:1)

我使用这个类

import android.text.format.DateUtils;

import java.util.Date;

import static android.text.format.DateUtils.FORMAT_NUMERIC_DATE;
import static android.text.format.DateUtils.FORMAT_SHOW_DATE;
import static android.text.format.DateUtils.FORMAT_SHOW_YEAR;
import static android.text.format.DateUtils.MINUTE_IN_MILLIS;

/**
 * Utilities for dealing with dates and times
 */
public class TimeUtils {

    /**
     * Get relative time for date
     *
     * @param date
     * @return relative time
     */
    public static CharSequence getRelativeTime(final Date date) {
        long now = System.currentTimeMillis();
        if (Math.abs(now - date.getTime()) > 60000)
            return DateUtils.getRelativeTimeSpanString(date.getTime(), now,
                    MINUTE_IN_MILLIS, FORMAT_SHOW_DATE | FORMAT_SHOW_YEAR
                    | FORMAT_NUMERIC_DATE);
        else
            return "Just now";
    }
}

TimeUtils.getRelativeTime(date)返回类似
的文字 刚才,
2分钟以前,
2小时前,
2天前,
04.11.2013

答案 3 :(得分:0)

我在互联网上搜索了这段代码,但没找到。虽然我回复的很晚,但这段代码很有用。

public static String getTimeLeft(String date) { // dateFormat = "yyyy-MM-dd"
    String[] DateSplit = date.split("-");
    int month = Integer.parseInt(DateSplit[1]) - 1, // if month is november  then subtract by 1
    year = Integer.parseInt(DateSplit[0]), day = Integer
            .parseInt(DateSplit[2]), hour = 0, minute = 0, second = 0;
    Calendar now = Calendar.getInstance();

    int sec = second - Calendar.getInstance().get(Calendar.SECOND), min = minute
            - Calendar.getInstance().get(Calendar.MINUTE), hr = hour
            - Calendar.getInstance().get(Calendar.HOUR_OF_DAY), dy = day
            - Calendar.getInstance().get(Calendar.DATE), mnth = month
            - Calendar.getInstance().get(Calendar.MONTH), daysinmnth = 32 - dy;

    Calendar end = Calendar.getInstance();

    end.set(year, month, day);

    if (mnth != 0) {
        if (dy != 0) {
            if (sec < 0) {
                sec = (sec + 60) % 60;
                min--;
            }
            if (min < 0) {
                min = (min + 60) % 60;
                hr--;
            }
            if (hr < 0) {
                hr = (hr + 24) % 24;
                dy--;
            }
            if (dy < 0) {
                dy = (dy + daysinmnth) % daysinmnth;
                mnth--;
            }
            if (mnth < 0) {
                mnth = (mnth + 12) % 12;
            }
        }
    }

    String hrtext = (hr == 1) ? "hour" : "hours", dytext = (dy == 1) ? "day"
            : "days", mnthtext = (mnth == 1) ? "month" : "months";

    if (now.after(end)) {
        return "";
    } else {
        String months = "", days = "", hours = "";
        months = (mnth > 0) ? mnth + " " + mnthtext : "";
        if (mnth <= 0) {
            days = (dy > 0) ? dy + " " + dytext : "";
            if (dy <= 0) {
                hours = (hr > 0) ? hr + " " + hrtext : "";
            }
        }
        //Log.d("DATE", months + " 1 " + days + " 2 " + hours);
        return months + days + hours;
    }
}

答案 4 :(得分:0)

其他答案会忽略时区,这可能至关重要,具体取决于您想要倒计时的准确程度。如果您未指定时区,则会获得JVM的默认值。

java.util.Date&amp; .Calendar类是出了名的麻烦。避免他们。在Joda-Time中使用java.time package或新Java 8

Joda-Time 2.3中的一些代码,未经测试(在我的脑海中)。搜索StackOverflow以获取许多更多示例。

String input = "01/22/2013";
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTimeFormatter formatterInput = DateTimeFormat.forPattern( "MM/dd/yyyy" ).withZone( timeZone );
DateTime future = formatterInput.parseDateTime( input );

DateTime now = new DateTime( timeZone );

int days = Days.daysBetween( now, future ).getDays();
Interval interval = new Interval( now, future );
Period period = new Period( interval );

对这些变量进行一些System.out.println调用并感到惊讶。

您将看到的字符串格式是ISO 8601。您也可以创建其他格式。

答案 5 :(得分:0)

TL;博士

java.time.temporal.ChronoUnit.DAYS.between( 
    LocalDate.now() , 
    LocalDate.of( 2013 , Month.JANUARY , 21 ) 
) 

java.time

现代方法使用 java.time 类。

LocalDate

LocalDate类表示没有时间且没有时区的仅限日期的值。

确定您的日期。

LocalDate start = LocalDate.of( 2013 , Month.JANUARY , 3 ) ;  // 3/1/2013
LocalDate stop = LocalDate.of( 2013 , Month.JANUARY , 21 ) ; // 21/01/2013

今天的日期

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。

如果未指定时区,则JVM会隐式应用其当前的默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好明确指定您期望/预期的时区作为参数。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Montreal" ) ;  // Or `ZoneId.systemDefault()` to indicate explicitly that you want the JVM’s current default time zone. Beware of that default changing *during* runtime.
LocalDate today = LocalDate.now( z ) ;

经过的日子

ChronoUnit enum以各种粒度计算已用时间。

long daysElapsed = ChronoUnit.DAYS.between( start , stop ) ;

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?