Android的日子还剩下



我需要做从一个日期到第二个日期的CountDown Days

e。g

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);
}

有更好的方法来实现这些吗?

使用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))) );
}

输出:Days Left: 17

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

        day.add(Calendar.YEAR, 1);

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

  • PrettyTime
  • JodaTime

我使用这个类

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

br

java.time.temporal.ChronoUnit.DAYS.between( 
    LocalDate.now() , 
    LocalDate.of( 2013 , Month.JANUARY , 21 ) 
) 
<标题> java.time h1> 代方法使用java。时间类。

LocalDate

LocalDate类表示一个只有日期的值,没有时间和时区。

确定你的日期。

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

今天的日期

在确定日期时,时区是至关重要的。对于任何给定的时刻,全球不同地区的日期都是不同的。例如,在法国巴黎,午夜过后几分钟是新的一天,而在montrsamal qusambec中仍然是"昨天"。

如果没有指定时区,JVM隐式地应用其当前默认时区。这个默认值可能随时改变,因此您的结果可能会有所不同。最好显式地指定您想要的/期望的时区作为参数。

请指定合适的时区名称,格式为continent/region,如America/MontrealAfrica/CasablancaPacific/Auckland。不要使用3-4个字母的缩写,如ESTIST,因为它们是而不是真正的时区,不是标准化的,甚至不是唯一的(!)。

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枚举计算不同粒度的运行时间。

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

关于java.time

java。时间框架内置于Java 8及以后版本中。这些类取代了麻烦的旧的遗留日期时间类,如java.util.Date, Calendar, &SimpleDateFormat .

Joda-Time项目现在处于维护模式,建议迁移到java。时间类。

要了解更多信息,请参阅Oracle教程。并搜索Stack Overflow以获得许多示例和解释。规格为JSR 310。

从哪里获取java。时间类?

  • Java SE 8Java SE 9,以及更高版本
    • 内置。
    • 标准Java API的一部分,捆绑实现。
  • Java 9增加了一些小的特性和修复。
  • Java SE 6Java SE 7
    • 大部分java。时间功能向后移植到Java 6;7在 ThreeTen-Backport
  • Android
    • Android版本的java bundle实现。时间类。
    • 对于早期的Android, ThreeTenABP项目适应ThreeTen-Backport(如上所述)。参见如何使用ThreeTenABP…
  • 我在网上搜索了这个代码,但没有找到。虽然我回复晚了,但这将是一段有用的代码。

    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;
        }
    }
    

    其他答案忽略了时区,这可能是至关重要的,这取决于您希望倒计时的准确性。如果不指定时区,则使用JVM的默认时区。

    java.util.Date &日历类是出了名的麻烦。避免它们。使用jdbc - time或新的java。Java 8中的time包。

    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。您也可以创建其他格式

    最新更新