如果当月是2月,如何获得下个月的开始日期和结束日期?

时间:2014-05-06 11:16:19

标签: java date

   String febSt = "02/01/2014" ;
   String febEnd = "02/28/2014" ;

以上代码是我需要的输入" 03/01/2014"和" 03/31/2014"作为输出。  我尝试了更多代码并使用了日历功能,但没有结果。从这个程序我需要下个月的开始和结束日期。

    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.GregorianCalendar;

    public class MonthCalculation {


        public void getNextMonth(String date) throws ParseException{


            DateFormat format = new SimpleDateFormat("MM/dd/yyyy");
            Date dt = format.parse(date);


            Date begining, end;

            {
                Calendar calendar = getCalendarForNow(dt);
                calendar.set(Calendar.DAY_OF_MONTH,calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
                setTimeToEndofDay(calendar);
                end = calendar.getTime();

                SimpleDateFormat endDt = new SimpleDateFormat("MM/dd/yyyy");
                String endStrDt = endDt.format(end);
                if(date != null && date.equalsIgnoreCase(endStrDt)){
                    System.out.println("Ending of the month");
                    calendar.add(Calendar.DAY_OF_MONTH, 1);
                    Date lastDate = calendar.getTime();
                    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
                    String lastDateofNextMonth = sdf.format(lastDate);
                    System.out.println("Next Month :"+lastDateofNextMonth);

                    Calendar c = getCalendarForNow(new Date(lastDateofNextMonth));
                    calendar.set(Calendar.DAY_OF_MONTH,calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
                    setTimeToEndofDay(calendar);
                    end = calendar.getTime();

                    SimpleDateFormat sfd = new SimpleDateFormat("MM/dd/yyyy");
                    String lastDated = endDt.format(end);
                    System.out.println("Testing side :"+lastDated);

                }else if (findLeapYear(dt)){
                    Calendar calendar3 = getCalendarForNow(dt);
                    calendar3.add(Calendar.YEAR, 1);
                    Date ds = calendar3.getTime();
                    SimpleDateFormat dtft = new SimpleDateFormat("MM/dd/yyyy");
                    String dates = dtft.format(ds);
                    dtft.setLenient(false);
                    System.out.println("YEAR : "+dates);

                }else{
                                    SimpleDateFormat dtft = new SimpleDateFormat("MM/dd/yyyy");
                    Calendar calendar2 = getCalendarForNow(dt);
                    System.out.println(" Calendar time :->> " + dtft.format(calendar2.getTime()));
                    int curre_month = calendar2.get(Calendar.MONTH);
                    int curre_day = calendar2.get(Calendar.DAY_OF_MONTH);
                    int curre_year = calendar2.get(Calendar.YEAR);

                    Date dat = calendar2.getTime();
                    calendar2.add(Calendar.DATE, 31);
                    Date ds = calendar2.getTime();
                    String dates = dtft.format(ds);
                    dtft.setLenient(false);
                    System.out.println("OTHER DAYS : "+dates);

                }
            }

        }

        private static boolean findLeapYear(Date dt){
            boolean isLeapYr = false;
            int yr = dt.getYear();
            if ((yr%4 == 0 && yr%100!=0)){
                isLeapYr = true;
               }
            return isLeapYr;
        }

        private static Calendar getCalendarForNow(Date dt) {
            Calendar calendar = GregorianCalendar.getInstance();
            calendar.setTime(dt);
            return calendar;
        }

        private static void setTimeToBeginningOfDay(Calendar calendar) {
            calendar.set(Calendar.HOUR_OF_DAY, 0);
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.SECOND, 0);
            calendar.set(Calendar.MILLISECOND, 0);
            calendar.set(Calendar.DAY_OF_MONTH, 1);
        }

        private static void setTimeToEndofDay(Calendar calendar) {
            System.out.println("For feb calling");
            calendar.set(Calendar.HOUR_OF_DAY, 23);
            calendar.set(Calendar.MINUTE, 59);
            calendar.set(Calendar.SECOND, 59);
            calendar.set(Calendar.MILLISECOND, 999);
        }


        public static void main(String[] args) {

            try {
                String janSt = "01/01/2014" ;
                    String janEnd = "01/31/2014" ;

                    String febSt = "02/01/2014" ;
                    String febEnd = "02/28/2014" ;

                    String marSt = "03/01/2014" ;
                    String marEnd = "03/31/2014" ;

                    String aprilSt = "04/01/2014" ;
                    String aprilEnd = "04/30/2014" ;

                    String maySt = "05/01/2014" ;
                    String mayEnd = "05/31/2014" ;

                    String juneSt = "06/01/2014" ;
                    String juneEnd = "06/30/2014" ;

                    String julySt = "07/01/2014" ;
                    String julyEnd = "07/31/2014" ;

                    String augSt = "08/01/2014" ;
                    String augEnd = "08/31/2014" ;

                    String sepSt = "09/01/2014" ;
                    String sepEnd = "09/30/2014" ;

                    String octSt = "10/01/2014" ;
                    String octEnd = "10/31/2014" ;

                    String novSt = "11/01/2014" ;
                    String novEnd = "11/30/2014" ;

                    String deceSt = "12/01/2014" ;
                    String deceEnd = "12/31/2014" ;

                    String jan15St="01/01/2015";
                    String jan15End="01/31/2015";

                    String leapyr = "02/29/2016";
                    String notaleapyr = "02/28/2015";

                new MonthCalculation().getNextMonth(febSt);
            } catch (ParseException e) {
                e.printStackTrace();
            }


        }

我尝试了更多的样本输入,因为2月,4月,6月开始日期不起作用,如果我将这些日期作为输入传递,它将在下个月的第二天返回     建议继续前进。我正在努力解决这个问题。     提前致谢

5 个答案:

答案 0 :(得分:22)

试试这个:

Calendar calendar = Calendar.getInstance();         
calendar.add(Calendar.MONTH, 1);
calendar.set(Calendar.DATE, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
Date nextMonthFirstDay = calendar.getTime();
calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
Date nextMonthLastDay = calendar.getTime();

答案 1 :(得分:7)

TL;博士

LocalDate.parse( "02/14/2014" , DateTimeformatter.ofPattern( "MM/dd/uuuu" ) )
         .with( TemporalAdjusters.firstDayOfNextMonth() )  // Stop here for first of next month.
         .with( TemporalAdjusters.lastDayOfMonth() )  // Include this for last day of next month.

java.time

现代的方式是与Java 8捆绑的新java.time package(受Joda-Time启发,由JSR 310定义)。

LocalDate类表示没有时间且没有时区的仅限日期的值。

DateTimeFormatter f = DateTimeformatter.ofPattern( "MM/dd/uuuu" );
LocalDate ld = LocalDate.parse( "02/14/2014" , f );

TemporalAdjuster接口定义了实现操作日期时间值的方法。 TemporalAdjusters类提供了几个方便的实现。

LocalDate firstOfMonth = ld.with( TemporalAdjusters.firstDayOfMonth() );
LocalDate firstOfNextMonth = ld.with( TemporalAdjusters.firstDayOfNextMonth() );

该问题要求下个月的第一个和最后一个月,在这种情况下是三月。我们有下个月的第一个,所以我们只需要在那个月结束。

LocalDate lastOfNextMonth = firstOfNextMonth.with( TemporalAdjusters.lastDayOfMonth() );

顺便说一句,如下所述,定义时间跨度的最佳实践是半开放式方法。这意味着一个月是本月的第一个月,但是不是,包括,一个月后的第一个月。在这种方法中,我们不打算确定一个月的最后一天。

约达时间

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

使用Joda-Time库及其LocalDate类时很容易。

DateTimeFormatter formatter = DateTimeFormat.forPattern( "MM/dd/yyyy" );
LocalDate localDate = formatter.parseLocalDate( "02/14/2014" ); 
LocalDate firstOfMonth = localDate.withDayOfMonth( 1 ); 
LocalDate nextMonth = localDate.plusMonths(1); // Use this for "half-open" range.
LocalDate endOfMonth = nextMonth.minusDays(1); // Use this for "fully-closed" range.

半开

提示:不要只关注一段时间的最后一刻,更好的做法是使用“半开”方法。

半开放时,开头是包容性的,结尾是独家的。因此,对于“一个月”,我们从所需月份的第一个开始,然后运行但不包括 next 月的第一个。

February 2014 = 2014-02-01/2014-03-01

时间跨度

请注意,Joda-Time提供了三个方便的类来处理一段时间:IntervalPeriodDuration

这些类只适用于日期时间对象(DateTime类)而不是上面代码中显示的仅限日期(LocalDate类)。

虽然与您的问题没有直接关系,但我怀疑这些跨时间课程可能会有所帮助。


关于 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)

我很快为你写的东西 - 所以可以清理干净。检查这是否有帮助:

    String string = "02/01/2014"; //assuming input
    DateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
    Date dt = sdf .parse(string);
    Calendar c = Calendar.getInstance();
    c.setTime(dt);
    c.add(Calendar.MONTH, 1);  //adding a month directly - gives the start of next month.
    String firstDate = sdf.format(c.getTime());
    System.out.println(firstDate);

    //get last day of the month - add month, substract a day.
    c.add(Calendar.MONTH, 1);
    c.add(Calendar.DAY_OF_MONTH, -1);
    String lastDate = sdf.format(c.getTime());
    System.out.println(lastDate);

答案 3 :(得分:2)

因为很难进入你的代码我已经为你写了一些函数。请看看..

Date today = new Date();  

Calendar calendar = Calendar.getInstance();  
calendar.setTime(today);  

calendar.add(Calendar.MONTH, 1);  
calendar.set(Calendar.DAY_OF_MONTH, 1);  
calendar.add(Calendar.DATE, -1);  

Date lastDayOfMonth = calendar.getTime();  

DateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");  
System.out.println("Today            : " + sdf.format(today));  
System.out.println("Last Day of Month: " + sdf.format(lastDayOfMonth));

答案 4 :(得分:1)

我看到问题已经过时了。但是我使用了DateUtils静态方法 ceiling truncate 。非常方便,而不是使用多行代码。

Date today = new Date();

DateUtils.truncate(new Date(), Calendar.MONTH) // Thu Dec 01 00:00:00 EET 2016
DateUtils.ceiling(new Date(), Calendar.MONTH) // Sun Jan 01 00:00:00 EET 2017
相关问题