所以,我想提出一个Android应用程序,我需要做的当前日期和当前月份的最后日期之间的天数计算。
假设今天是2017年1月11日和本月的最后日期是30/11/2017。所以天数将30因为30天后将于下月开始。
Calendar calendar = Calendar.getInstance();
int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
int currentDay = calendar.get(Calendar.DAY_OF_MONTH);
int daysLeft = lastDay - currentDay;
System.out.println("Last Day: " + lastDay);
System.out.println("Current Day : " + currentDay);
System.out.println("There are " + daysLeft + " days left in the month.");
产量
Last Day: 30
Current Day : 1
There are 29 days left in the month.
ChronoUnit.DAYS.between( today , firstOfNextMonth )
确定当前日期,需要一个时区。对于任何给定的时刻,该日期时区全球各地的变化。
在proper time zone name的格式指定一个continent/region
,如America/Montreal
,Africa/Casablanca
,或Pacific/Auckland
。切勿使用3-4个字母的缩写,如EST
或IST
,因为它们不是真正的时区,不规范,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "Africa/Casablanca" ) ;
LocalDate today = LocalDate.now( z ) ;
从这一点,得到一个对象来表示整月,目前YearMonth
。
YearMonth ym = YearMonth.from( today ) ;
从这一点,要求下月一日。一般处理时间跨度最好的做法是半开的方法。刚开始是包容性的,而结局是排他的。所以,当月运行到,但是包括,第一下一个月的。
LocalDate firstOfNextMonth = ym.plusMonths( 1 ).atDay( 1 ) ;
要获得的天数总共使用ChronoUnit
枚举。
long days = ChronoUnit.DAYS.between( today , firstOfNextMonth ) ;
转储到控制台。
System.out.println( days + " days between " + today + " and " + firstOfNextMonth ) ;
看到这个code run live at IdeOne.com。
2017年11月1日和2017年12月1日达到30天
仅供参考,您可以使用Period
追踪的时间跨度。可用于其他目的,而不是天的计数。
Period p = Period.between( today , firstOfNextMonth ) ;
该java.time框架是建立在Java 8和更高版本。这些类取代的麻烦老legacy日期时间类,如java.util.Date
,Calendar
,与SimpleDateFormat
。
该项目Joda-Time,现在在maintenance mode,建议迁移到java.time类。
要了解更多信息,请参见Oracle Tutorial。和搜索堆栈溢出了很多例子和解释。规格是JSR 310。
从哪里获取java.time类?
我不肯定是否java.time
可以用Android
,但如果它是你可以使用LocalDate
和ChronoUnit
:
LocalDate today = LocalDate.now();
LocalDate lastDayOfMonth = today.withDayOfMonth(today.lengthOfMonth());
System.out.println(today); // 2017-11-01
System.out.println(lastDayOfMonth); // 2017-11-30
System.out.println(ChronoUnit.DAYS.between(today,lastDayOfMonth)); // 29