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)
( ChronoUnit.DAYS.between( start , today ) * 100 ) \n/ \nChronoUnit.DAYS.between( start , stop )\nRun Code Online (Sandbox Code Playgroud)\n\n您正在使用糟糕的日期时间类,这些类在几年前就被JSR 310 中定义的java.time类所取代。
\n\nLocalDate该类LocalDate表示仅日期值,没有时间、时区或相对于 UTC 的偏移量。
时区对于确定日期至关重要。对于任何特定时刻,全球各地的日期都会因地区而异。例如,法国巴黎午夜过后几分钟是新的一天,而Montr\xc3\xa9al Qu\xc3\xa9bec中仍然是 \xe2\x80\x9cyesterday\xe2\x80\x9d 。
\n\n如果未指定时区,JVM 会隐式应用其当前的默认时区。该默认值可能在运行时随时更改(!),因此您的结果可能会有所不同。最好明确指定您想要/预期的时区作为参数。如果重要,请与您的用户确认该区域。
\n\n以、、 或 等格式指定正确的时区名称。切勿使用 2-4 个字母的缩写,例如或,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。Continent/RegionAmerica/MontrealAfrica/CasablancaPacific/AucklandESTIST
ZoneId z = ZoneId.of( "America/Montreal" ) ; \nLocalDate today = LocalDate.now( z ) ;\nRun Code Online (Sandbox Code Playgroud)\n\n如果您想使用 JVM\xe2\x80\x99s 当前默认时区,请询问它并作为参数传递。如果省略,代码读起来会变得不明确,因为我们不确定您是否打算使用默认值,或者您是否像许多程序员一样没有意识到这个问题。
\n\nZoneId z = ZoneId.systemDefault() ; // Get JVM\xe2\x80\x99s current default time zone.\nRun Code Online (Sandbox Code Playgroud)\n\n或者指定一个日期。您可以用数字设置月份,1 月至 12 月的合理编号为 1-12。
\n\nLocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ; // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.\nRun Code Online (Sandbox Code Playgroud)\n\n或者,更好的是,使用Month预定义的枚举对象,一个对应一年中的每个月。提示:Month在整个代码库中使用这些对象而不仅仅是整数,可以使您的代码更加自文档化,确保值有效并提供类型安全。Year对于&同上YearMonth。
LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;\nRun Code Online (Sandbox Code Playgroud)\n\n您似乎想要一个基于天数的百分比。要获取经过的天数,请使用枚举类between上的方法ChronoUnit。
long days = ChronoUnit.DAYS.between( earlier , later ) ;\nRun Code Online (Sandbox Code Playgroud)\n\n使用这些整数对,您可以计算您的百分比。
\n\nZoneId 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 ;\nRun Code Online (Sandbox Code Playgroud)\n\n转储到控制台。
\n\nSystem.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 + "%" ) ;\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n\n\n开始.toString(): 2019-06-04
\n\n今天.toString(): 2019-06-09
\n\nstop.toString(): 2019-06-24
\n\n总天数:20
\n\n经过天数:5
\n\n25%
\n
当然,为了真正的工作,你需要做更多的事情。
\n\n您应该验证开始时间在停止时间之前。
\n\nboolean startIsBeforeStop = start.isBefore( stop ) ;\nRun Code Online (Sandbox Code Playgroud)\n\n您需要验证今天是否在这两个日期之间。
\n\nboolean todayIsWithinRange = ( ! today.isBefore( start ) ) && today.isBefore( stop ) ;\nRun Code Online (Sandbox Code Playgroud)\n\n如果您的工作经常涉及日期范围,请将ThreeTen-Extra库添加到您的项目中。这为您提供了方便的LocalDateRange课程。
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 ) ;\nRun Code Online (Sandbox Code Playgroud)\n\njava.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat。
要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
\n\nJoda -Time项目现在处于维护模式,建议迁移到java.time类。
\n\n您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC 驱动程序。不需要字符串,不需要类。java.sql.*
从哪里获取 java.time 类?
\n\n| 归档时间: |
|
| 查看次数: |
1223 次 |
| 最近记录: |