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

Дата ввода ввода следующая:

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" .

Java 8 и выше.

Используя LocalDate . LocalDate convertedDate.getMonth().length(convertedDate.isLeapYear()) где LocalDate является экземпляром 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)); 

Это похоже на ваши потребности:

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 

С 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); 

ИЛИ

 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().maxLength()); System.out.println(newDate); 

Вывод:

 2012-01-31 

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

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

 String date = "1/13/2012"; LocalDate localDate = LocalDate.parse(date,DateTimeFormatter.ofPattern("MM/dd/yyyy")); lastDayOfMonth = localDate.with(TemporalAdjusters.lastDayOfMonth()); 

Самый простой способ – создать новый экземпляр 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 в календаре. Значение месяца равно 0, например, 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)

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

 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; } 

Прекрасно работает для меня с этим

  Calendar cal = Calendar.getInstance(TimeZone.getTimeZone()); cal.set(Calendar.MONTH, month-1); cal.set(Calendar.YEAR, year); cal.add(Calendar.DATE, -1); cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); return cal.getTimeInMillis(); 
 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

Я использую этот однострочный слой в своих отчетах JasperServer:

 new SimpleDateFormat("yyyy-MM-dd").format(new SimpleDateFormat("yyyy-MM-dd").parse(new java.util.Date().format('yyyy') + "-" + (new Integer (new SimpleDateFormat("MM").format(new Date()))+1) + "-01")-1) 

Не выглядит красиво, но работает для меня. В основном это добавление 1 к текущему месяцу, получение первого дня этого месяца и вычитание в один день.

  • Проверка входного сигнала сканера во время цикла
  • Есть ли у Java переполнение буфера?
  • Как использовать файл в банке как javax.net.ssl.keystore?
  • Как вставить PDPage в другой PDPage с помощью pdfbox
  • Каков наилучший способ загрузить JSONObject из текстового файла json?
  • Java 8: Ссылка на неоднозначна
  • Как установить фоновое изображение в JPanel
  • Почему Java не имеет составных версий условных и условных операторов или операторов? (&& =, || =)
  • Как компилировать .java с поддержкой более старых версий Java?
  • Преобразование Word в HTML с помощью Apache POI
  • Сертификаты клиента Java через HTTPS / SSL
  • Давайте будем гением компьютера.