it-roy-ru.com

Получение последнего дня месяца в заданной строковой дате

Моя дата ввода строки, как показано ниже:

String date = "1/13/2012";

Я получаю месяц, как показано ниже:

SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
Date convertedDate = dateFormat.parse(date);
String month = new SimpleDateFormat("MM").format(convertedDate);

Но как мне получить последний календарный день месяца с заданной строковой датой?

Например: для строкового "1/13/2012" вывод должен быть "1/31/2012".

48
Vicky

Java 8 и выше.

Используя convertedDate.getMonth().length(convertedDate.isLeapYear()), где convertedDate является экземпляром LocalDate.

String date = "1/13/2012";
LocalDate convertedDate = LocalDate.parse(date, DateTimeFormatter.ofPattern("M/d/yyyy"));
convertedDate = convertedDate.withDayOfMonth(
                                convertedDate.getMonth().length(convertedDate.isLeapYear()));

Java 7 и ниже.

Используя getActualMaximum метод Java.util.Calendar:

String date = "1/13/2012";
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
Date convertedDate = dateFormat.parse(date);
Calendar c = Calendar.getInstance();
c.setTime(convertedDate);
c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));
127
Aleksandr M

Это выглядит как ваши потребности:

http://obscuredclarity.blogspot.de/2010/08/get-last-day-of-month-date-object-in.html

код:

import Java.text.DateFormat;  
import Java.text.DateFormat;  
import Java.text.SimpleDateFormat;  
import Java.util.Calendar;  
import Java.util.Date;  

//Java 1.4+ Compatible  
//  
// The following example code demonstrates how to get  
// a Date object representing the last day of the month  
// relative to a given Date object.  

public class GetLastDayOfMonth {  

    public static void main(String[] args) {  

        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("yyyy-MM-dd");  
        System.out.println("Today            : " + sdf.format(today));  
        System.out.println("Last Day of Month: " + sdf.format(lastDayOfMonth));  
    }  

} 

Результат:

Today            : 2010-08-03  
Last Day of Month: 2010-08-31  
22
SG 86

С Java 8 DateTime/LocalDateTime:

String dateString = "01/13/2012";
DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("MM/dd/yyyy", Locale.US); 
LocalDate date = LocalDate.parse(dateString, dateFormat);       
ValueRange range = date.range(ChronoField.DAY_OF_MONTH);
Long max = range.getMaximum();
LocalDate newDate = date.withDayOfMonth(max.intValue());
System.out.println(newDate); 

OR

String dateString = "01/13/2012";
DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("MM/dd/yyyy", Locale.US); 
LocalDate date = LocalDate.parse(dateString, dateFormat);
LocalDate newDate = date.withDayOfMonth(date.getMonth().length(date.isLeapYear()));
System.out.println(newDate);

Результат:

2012-01-31

LocalDateTime следует использовать вместо LocalDate, если у вас есть информация о времени в вашей строке даты. И.Е. 2015/07/22 16:49

5
Zeeshan

Используя Java 8 Java.time.LocalDate

String date = "1/13/2012";
LocalDate lastDayOfMonth = LocalDate.parse(date,DateTimeFormatter.ofPattern("M/dd/yyyy"));
                               .with(TemporalAdjusters.lastDayOfMonth());
4
Gaurav Krishna

Самый простой способ - создать новый экземпляр GregorianCalendar, см. Ниже:

Calendar cal = new GregorianCalendar(2013, 5, 0);
Date date = cal.getTime();
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.println("Date : " + sdf.format(date));

Результат:

Date : 2013-05-31

Внимание:

month значение, используемое для установки поля календаря MONTH в календаре. Значение месяца основано на 0, например 0 за январь.

2
Lebonsun

тЛ; др

YearMonth                                           // Represent the year and month, without a date and without a time zone.
.from(                                              // Extract the year and month from a `LocalDate` (a year-month-day). 
    LocalDate                                       // Represent a date without a time-of-day and without a time zone.
    .parse(                                         // Get a date from an input string.        
        "1/13/2012" ,                               // Poor choice of format for a date. Educate the source of your data about the standard ISO 8601 formats to be used when exchanging date-time values as text.
        DateTimeFormatter.ofPattern( "M/d/uuuu" )   // Specify a formatting pattern by which to parse the input string.
    )                                               // Returns a `LocalDate` object.
)                                                   // Returns a `YearMonth` object.
.atEndOfMonth()                                     // Determines the last day of the month for that particular year-month, and returns a `LocalDate` object.
.toString()                                         // Generate text representing the value of that `LocalDate` object using standard ISO 8601 format.

Смотрите этот код запуска в прямом эфире на IdeOne.com .

2012-01-31

YearMonth

Класс YearMonth делает это легко. Метод atEndOfMonth возвращает LocalDate. Високосный год в феврале учитывается. 

Сначала определите шаблон форматирования в соответствии с вашим вводом строки.

DateTimeFormatter f = DateTimeFormatter.ofPattern ("M/d/uuuu");

Используйте этот форматер, чтобы получить LocalDate из строкового ввода.

String s = "1/13/2012" ;
LocalDate ld = LocalDate.parse( "1/13/2012" , f ) ;

Затем извлеките объект YearMonth.

YearMonth ym = YearMonth.from( ld ) ;

Попросите YearMonth определить последний день месяца в этом году, учитывая високосный год в феврале.

LocalDate endOfMonth = ym.atEndOfMonth() ;

Создать текст, представляющий эту дату, в стандартном формате ISO 8601.

String output = endOfMonth.toString() ;  

О Java.time

Java.time framework встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые унаследованные классы даты и времени, такие как Java.util.Date , Calendar , & SimpleDateFormat .

Проект Joda-Time , теперь находящийся в режиме обслуживания , рекомендует выполнить переход к Java.time классам.

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация это JSR 310 .

Вы можете обмениваться объектами Java.time непосредственно с вашей базой данных. Используйте драйвер JDBC совместимый с JDBC 4.2 или новее. Нет необходимости в строках, нет необходимости в классах Java.sql.*.

Где взять классы Java.time? 

Проект ThreeTen-Extra расширяет Java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к Java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval , YearWeek , YearQuarter , и more .

1
Basil Bourque

Вы можете использовать следующий код, чтобы получить последний день месяца

public static String getLastDayOfTheMonth(String date) {
        String lastDayOfTheMonth = "";

        SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
        try{
        Java.util.Date dt= formatter.parse(date);
        Calendar calendar = Calendar.getInstance();  
        calendar.setTime(dt);  

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

        Java.util.Date lastDay = calendar.getTime();  

        lastDayOfTheMonth = formatter.format(lastDay);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return lastDayOfTheMonth;
    }
1
Tanmay kumar shaw

Java 8 и выше:

import Java.time.LocalDate;
import Java.time.Year;

static int LastDayOfMonth(int Y, int M) {
    return LocalDate.of(Y, M, 1).getMonth().length(Year.of(Y).isLeap());
}

при условии комментария Василия Бурка

import Java.time.YearMonth;

int LastDayOfMonth = YearMonth.of(Y, M).lengthOfMonth();
1
onix

Вы можете использовать методы plusMonths и minusDays в Java 8:

// Parse your date into a LocalDate
LocalDate parsed = LocalDate.parse("1/13/2012", DateTimeFormatter.ofPattern("M/d/yyyy"));

// We only care about its year and month, set the date to first date of that month
LocalDate localDate = LocalDate.of(parsed.getYear(), parsed.getMonth(), 1);

// Add one month, subtract one day 
System.out.println(localDate.plusMonths(1).minusDays(1)); // 2012-01-31
0
Koray Tugay
public static String getLastDayOfMonth(int year, int month) throws Exception{
    DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    Date date = sdf.parse(year+"-"+(month<10?("0"+month):month)+"-01");

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

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

    Date lastDayOfMonth = calendar.getTime();

    return sdf.format(lastDayOfMonth);
}
public static void main(String[] args) throws Exception{
    System.out.println("Last Day of Month: " + getLastDayOfMonth(2017, 1));
    System.out.println("Last Day of Month: " + getLastDayOfMonth(2017, 2));
    System.out.println("Last Day of Month: " + getLastDayOfMonth(2017, 3));
    System.out.println("Last Day of Month: " + getLastDayOfMonth(2017, 4));
    System.out.println("Last Day of Month: " + getLastDayOfMonth(2017, 5));
    System.out.println("Last Day of Month: " + getLastDayOfMonth(2017, 6));
    System.out.println("Last Day of Month: " + getLastDayOfMonth(2017, 7));
    System.out.println("Last Day of Month: " + getLastDayOfMonth(2017, 8));
    System.out.println("Last Day of Month: " + getLastDayOfMonth(2017, 9));
    System.out.println("Last Day of Month: " + getLastDayOfMonth(2017, 10));
    System.out.println("Last Day of Month: " + getLastDayOfMonth(2017, 11));
    System.out.println("Last Day of Month: " + getLastDayOfMonth(2017, 12));
    System.out.println("Last Day of Month: " + getLastDayOfMonth(2018, 1));
    System.out.println("Last Day of Month: " + getLastDayOfMonth(2018, 2));
    System.out.println("Last Day of Month: " + getLastDayOfMonth(2018, 3));

    System.out.println("Last Day of Month: " + getLastDayOfMonth(2010, 2));
    System.out.println("Last Day of Month: " + getLastDayOfMonth(2011, 2));
    System.out.println("Last Day of Month: " + getLastDayOfMonth(2012, 2));
    System.out.println("Last Day of Month: " + getLastDayOfMonth(2013, 2));
    System.out.println("Last Day of Month: " + getLastDayOfMonth(2014, 2));
    System.out.println("Last Day of Month: " + getLastDayOfMonth(2015, 2));
    System.out.println("Last Day of Month: " + getLastDayOfMonth(2016, 2));
    System.out.println("Last Day of Month: " + getLastDayOfMonth(2017, 2));
    System.out.println("Last Day of Month: " + getLastDayOfMonth(2018, 2));
    System.out.println("Last Day of Month: " + getLastDayOfMonth(2019, 2));
    System.out.println("Last Day of Month: " + getLastDayOfMonth(2020, 2));
    System.out.println("Last Day of Month: " + getLastDayOfMonth(2021, 2));
}

Результат:

Последний день месяца: 2017-01-31
Последний день месяца: 2017-02-28
Последний день месяца: 2017-03-31
Последний день месяца: 2017-04-30
Последний день месяца: 2017-05-31
Последний день месяца: 2017-06-30
Последний день месяца: 2017-07-31
Последний день месяца: 2017-08-31
Последний день месяца: 2017-09-30
Последний день месяца: 2017-10-31
Последний день месяца: 2017-11-30
Последний день месяца: 2017-12-31
Последний день месяца: 2018-01-31
Последний день месяца: 2018-02-28
Последний день месяца: 2018-03-31
Последний день месяца: 2010-02-28
Последний день месяца: 2011-02-28
Последний день месяца: 2012-02-29
Последний день месяца: 2013-02-28
Последний день месяца: 2014-02-28
Последний день месяца: 2015-02-28
Последний день месяца: 2016-02-29
Последний день месяца: 2017-02-28
Последний день месяца: 2018-02-28
Последний день месяца: 2019-02-28
Последний день месяца: 2020-02-29
Последний день месяца: 2021-02-28

0
杨尚川

Используйте GregorianCalendar. Установите дату объекта, а затем используйте getActualMaximum(Calendar.DAY_IN_MONTH).

http://docs.Oracle.com/javase/7/docs/api/Java/util/GregorianCalendar.html#getActualMaximum%28int%29 (но это было то же самое в Java 1.4)

0
SJuan76