【问题标题】:How to get number of days between today's date and last date of the current month? [closed]如何获取今天日期和当月最后一天之间的天数? [关闭]
【发布时间】:2018-04-14 01:06:15
【问题描述】:

所以我正在制作一个 Android 应用程序,我需要计算当前日期和当前月份最后一个日期之间的天数。

假设今天是 2017 年 1 月 11 日,当月的最后一天是 2017 年 11 月 30 日。所以天数是 30。因为 30 天后下个月开始。

【问题讨论】:

  • 请提供您已经尝试过的一些内容,以便我们帮助调试您的问题。
  • 带有公历的日历实例将在这里为您提供帮助。
  • 在编写任何代码之前,您需要定义“间隔天数”的含义,因为该短语不明确。
  • 嗨@DeepPomal 我知道你是初学者,每个人都从那里开始:-) 但是,作为未来开发人员,你最强大的工具之一将能够解决你的问题,而无需有人拼出确切的答案.例如,您是否在 Google 上搜索过“android,计算两个日期之间的天数”?这样做会产生很多结果,让您开始并提供您需要的信息。如果您遇到奇怪的问题,请发布问题,我们可以提供更多帮助。
  • @DeepPomal 确定你想要什么。如果今天是 2017 年 11 月 30 日,您希望结果为 1?这不是严格意义上的“间隔天数”,因为它包括范围的两个端点。在处理任何类型的范围时,您必须非常清楚地指定是否在范围中包含一个或两个端点。

标签: java android date calendar


【解决方案1】:
    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.

【讨论】:

  • 工作是一回事。你提到你是一个新的开发者。了解它的工作方式和原因是另一回​​事。不要只是窃取代码并继续你的生活,学习!
  • 这个答案使用了麻烦的旧日期时间类,这些类现在是遗留的,被 java.time 类所取代。对于 Android,请参阅 ThreeTen-Backport 和 ThreeTenABP 项目。
【解决方案2】:

tl;博士

ChronoUnit.DAYS.between( today ,  firstOfNextMonth )

java.time

确定当前日期需要时区。对于任何给定的时刻,日期在全球范围内因时区而异。

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

ZoneId z = ZoneId.of( "Africa/Casablanca" ) ; 
LocalDate today = LocalDate.now( z ) ;

从中获取一个对象来表示整个月份,即当前YearMonth

YearMonth ym = YearMonth.from( today ) ;

从那时起,要求下个月的第一天。通常,处理时间跨度的最佳实践是半开方法。开头是inclusive,而结尾是exclusive。因此,当前月份运行到但确实包括下个月的第一个月。

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-01 和 2017-12-01 之间的 30 天

仅供参考,您可以使用Period 来跟踪时间跨度。可用于其他目的,但 用于数天。

Period p = Period.between( today , firstOfNextMonth ) ;

关于java.time

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

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

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

从哪里获得 java.time 类?

【讨论】:

    【解决方案3】:

    我不太确定java.time 是否在Android 上可用,但如果是,您可以使用LocalDateChronoUnit

    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
    

    【讨论】:

    • 大部分 java.time 功能在 ThreeTen-Backport 项目中被反向移植到 Java 6 和 Java 7。在 ThreeTenABP 项目中进一步适用于 Android。
    • 您误用了getDays 方法。该方法仅返回Period部分,即 之后的天数,计算年数和月数。在这种特殊情况下,您的代码有效,但这只是因为我们碰巧不到一个月。但那是巧合的好运气,而不是好的编程。 Period 类是这个问题的错误类。
    • @BasilBourque,是的,你完全正确,这对我们更好ChronoUnit.DAYS
    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    相关资源
    最近更新 更多