android/java 中两个日期与今天相比的百分比

Nar*_*rov 1 java android date percentage android-date

如何在 android/java 中找到两个日期与今天相比的百分比?这个问题是基于这个问题

我想做这样的事情:

    Calendar c = Calendar.getInstance();
    yeartoday = c.get(Calendar.YEAR);
    monthtoday = c.get(Calendar.MONTH);
    daytoday = c.get(Calendar.DAY_OF_MONTH);
...

    Date datestart = getDate(styear,(stmonth-1),stday);
    Date dateend = getDate(year,(month-1),day);
    Date datetoday = getDate(yeartoday,monthtoday,daytoday);
    double percent = (((datetoday - datestart) / (dateend - datestart)) * 100);
...
public Date getDate(int year,int month,int day){
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.YEAR, year);
    calendar.set(Calendar.MONTH, month);
    calendar.set(Calendar.DAY_OF_MONTH, day);
    Date date = calendar.getTime();
    return date;
}
Run Code Online (Sandbox Code Playgroud)

Bas*_*que 5

太长了;博士

\n\n
( ChronoUnit.DAYS.between( start , today ) * 100 ) \n/ \nChronoUnit.DAYS.between( start , stop )\n
Run Code Online (Sandbox Code Playgroud)\n\n

java.time

\n\n

您正在使用糟糕的日期时间类,这些类在几年前就被JSR 310 中定义的java.time类所取代。

\n\n

LocalDate

\n\n

该类LocalDate表示仅日期值,没有时间、时区相对于 UTC 的偏移量

\n\n

时区对于确定日期至关重要。对于任何特定时刻,全球各地的日期都会因地区而异。例如,法国巴黎午夜过后几分钟是新的一天,而Montr\xc3\xa9al Qu\xc3\xa9bec中仍然是 \xe2\x80\x9cyesterday\xe2\x80\x9d 。

\n\n

如果未指定时区,JVM 会隐式应用其当前的默认时区。该默认值可能在运行时随时更改(!),因此您的结果可能会有所不同。最好明确指定您想要/预期的时区作为参数。如果重要,请与您的用户确认该区域。

\n\n

以、、 或 等格式指定正确的时区名称。切勿使用 2-4 个字母的缩写,例如或,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。Continent/RegionAmerica/MontrealAfrica/CasablancaPacific/AucklandESTIST

\n\n
ZoneId z = ZoneId.of( "America/Montreal" ) ;  \nLocalDate today = LocalDate.now( z ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您想使用 JVM\xe2\x80\x99s 当前默认时区,请询问它并作为参数传递。如果省略,代码读起来会变得不明确,因为我们不确定您是否打算使用默认值,或者您是否像许多程序员一样没有意识到这个问题。

\n\n
ZoneId z = ZoneId.systemDefault() ;  // Get JVM\xe2\x80\x99s current default time zone.\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者指定一个日期。您可以用数字设置月份,1 月至 12 月的合理编号为 1-12。

\n\n
LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者,更好的是,使用Month预定义的枚举对象,一个对应一年中的每个月。提示:Month在整个代码库中使用这些对象而不仅仅是整数,可以使您的代码更加自文档化,确保值有效并提供类型安全Year对于&同上YearMonth

\n\n
LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

经过的天数

\n\n

您似乎想要一个基于天数的百分比。要获取经过的天数,请使用枚举类between上的方法ChronoUnit

\n\n
long days = ChronoUnit.DAYS.between( earlier , later ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用这些整数对,您可以计算您的百分比。

\n\n

例子

\n\n
ZoneId z = ZoneId.of( "America/Montreal" ) ;\nLocalDate today = LocalDate.now( z ) ;\nLocalDate start = today.minusDays( 5 ) ;\nLocalDate stop = today.plusDays( 15 ) ;\n\nlong totalDays = ChronoUnit.DAYS.between( start , stop ) ;\nlong elapsedDays = ChronoUnit.DAYS.between( start , today ) ;\n\nlong percentComplete = ( elapsedDays * 100 ) / totalDays ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

转储到控制台。

\n\n
System.out.println( "start.toString(): " + start ) ;\nSystem.out.println( "today.toString(): " + today ) ;\nSystem.out.println( "stop.toString(): " + stop ) ;\nSystem.out.println( "totalDays: " + totalDays ) ;\nSystem.out.println( "elapsedDays: " + elapsedDays ) ;\nSystem.out.println( percentComplete + "%" ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

请参阅在 IdeOne.com 上实时运行的代码

\n\n
\n

开始.toString(): 2019-06-04

\n\n

今天.toString(): 2019-06-09

\n\n

stop.toString(): 2019-06-24

\n\n

总天数:20

\n\n

经过天数:5

\n\n

25%

\n
\n\n

验证输入

\n\n

当然,为了真正的工作,你需要做更多的事情。

\n\n

您应该验证开始时间在停止时间之前。

\n\n
boolean startIsBeforeStop = start.isBefore( stop ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

您需要验证今天是否在这两个日期之间。

\n\n
boolean todayIsWithinRange = ( ! today.isBefore( start ) ) && today.isBefore( stop ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

三十额外

\n\n

如果您的工作经常涉及日期范围,请将ThreeTen-Extra库添加到您的项目中。这为您提供了方便的LocalDateRange课程。

\n\n
LocalDateRange range = LocalDateRange.of( start , stop ) ;\nboolean startIsBeforeStop = ( range.lengthInDays() > 0 ) ; // A negative number beens the start is *not* before the stop.\nboolean todayIsWithinRange = range.contains( today ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

关于java.time

\n\n

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

\n\n

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

\n\n

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

\n\n

您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC 驱动程序。不需要字符串,不需要类。java.sql.*

\n\n

从哪里获取 java.time 类?

\n\n\n