如何获得上个月的第一个日期和最后日期? (JAVA)

时间:2012-05-31 06:18:58

标签: java datetime date

今天的日期,我应该得到上个月的第一个日期和最后日期。我无法想出任何逻辑。

例如,在传递05/30/2012时,我应该04/01/201204/30/2012

任何帮助将不胜感激。感谢。

9 个答案:

答案 0 :(得分:29)

Calendar

Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, -1);
cal.set(Calendar.DATE, 1);
Date firstDateOfPreviousMonth = cal.getTime();

cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DATE)); // changed calendar to cal

Date lastDateOfPreviousMonth = cal.getTime();

查看

答案 1 :(得分:6)

TL;博士

YearMonth.now().minusMonths( 1 ).atDay( 1 )

...和...

YearMonth.now().minusMonths( 1 ).atEndOfMonth()

避免使用j.u.Date

避免使用捆绑的java.util.Date和.Calendar类,因为它们非常麻烦。而是在Java 8及更高版本中使用java.time package

java.time

Java 8中的新java.time frameworkTutorial)具有此命令。

恰当命名的YearMonth课程代表一年中的一个月,没有任何特定的日期或时间。从那里我们可以要求这个月的第一天和最后一天。

ZonedId zoneId = ZoneId.of( "America/Montreal" );
YearMonth yearMonthNow = YearMonth.now( zoneId );
YearMonth yearMonthPrevious = yearMonthNow.minusMonths( 1 );
LocalDate firstOfMonth = yearMonthPrevious.atDay( 1 );
LocalDate lastOfMonth = yearMonthPrevious.atEndOfMonth();

约达时间

更新 Joda-Time项目现在位于maintenance mode,团队建议迁移到java.time课程。请参阅Tutorial by Oracle

Joda-Time 2.8中,如果您不关心时间,请使用LocalDate课程。

LocalDate today = LocalDate.now( DateTimeZone.forID( "Europe/Paris" ) );
LocalDate firstOfThisMonth = today.withDayOfMonth( 1 );
LocalDate firstOfLastMonth = firstOfThisMonth.minusMonths( 1 );
LocalDate endOfLastMonth = firstOfThisMonth.minusDays( 1 );

关于 java.time

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

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

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

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

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 2 :(得分:3)

使用JodaTime

DateMidnight now = new DateMidnight();
DateMidnight beginningOfLastMonth = now.minusMonths(1).withDayOfMonth(1);
DateMidnight endOfLastMonth = now.withDayOfMonth(1).minusDays(1);
System.out.println(beginningOfLastMonth);
System.out.println(endOfLastMonth);

输出:

  

2012-04-01T00:00:00.000 + 02:00
  2012-04-30T00:00:00.000 + 02:00

说明:DateMidnight对象是一个没有时间信息的日期对象,看起来就像您需要的那样。如果没有,请在上面的代码中用DateTime替换所有出现的DateMidnight。

答案 3 :(得分:2)

你可以创建一个日历对象,将日期设置为当前月份的第一天(应该是第一个:P)然后你可以做两个操作: 从您的日历对象中,您可以减去特定的时间段,例如一个月(这会给你上个月的第一个日期,或一天,这将给你上个月的最后一天。我没有尝试,但这将是我的第一步。

答案 4 :(得分:2)

//在模式中,您可以使用所需的格式。

  DateTimeFormatter format = DateTimeFormatter.ofPattern("MM/dd/yyyy");
                LocalDate now = LocalDate.now();
                String startDate = now.minusMonths(1).with(TemporalAdjusters.firstDayOfMonth()).format(format);
                String endDate = now.minusMonths(1).with(TemporalAdjusters.lastDayOfMonth()).format(format);

答案 5 :(得分:1)

还想为Jigar的答案添加一些东西。使用DateFormat类以问题中指定的格式获取日期:

DateFormat df = DateFormat.getInstance(DateFormat.SHORT);
System.out.println(df.format(firstDateOfPreviousMonth));
System.out.println(df.format(lastDateOfPreviousMonth));

输出:

04/01/12
04/30/12

答案 6 :(得分:1)

public static LocalDate getPreviousMonthStartDate() {

    return LocalDate.now().minusMonths(1).with(TemporalAdjusters.firstDayOfMonth());
}

public static LocalDate getPreviousMonthLastDate() {

    return LocalDate.now().minusMonths(1).with(TemporalAdjusters.lastDayOfMonth());
}

使用Java.Time非常容易编写代码。 java.time程序包具有更好的设计,更多的线程安全性,许多支持常用操作的实用程序方法,并且易于使用Local和ZonedDate / Time API处理时区。

答案 7 :(得分:0)

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.DATE, 1);
    cal.add(Calendar.DAY_OF_MONTH, -1);
    Date lastDateOfPreviousMonth = cal.getTime();
    cal.set(Calendar.DATE, 1);
    Date firstDateOfPreviousMonth = cal.getTime();

答案 8 :(得分:0)

<!DOCTYPE html>
    <head>
        <meta charset="UTF-8">
        <title>Test</title>
        <script type="text/javascript">
            function concatme()
            {
                var num1 = document.getElementById("num1").value;
                var num2 = document.getElementById("num2").value;
                document.getElementById("response").innerText = num1 + ' ' +num2;
            }
        </script>
    </head>
    <body>

    <form method="GET">
        <input type="text" name="num1" id="num1" placeholder="Number 1">
        <input type="text" name="num2" id="num2" placeholder="Number 2">
    </form>
    <br>
    <button  value="submit" onclick="concatme()">Generate</button>
    <p id="response"></p>
    </body>
</html>