Ответ 1
Измените YYYY
на YYYY
DateFormat DATE_FORMAT = new SimpleDateFormat("MM/dd/yyyy");
YYYY
неверно dateformat
Для получения последней даты месяца я написал эту функцию
/**
* @param month integer value of month
* @param year integer value of month
* @return last day of month in MM/dd/YYYY format
*/
private static String getDate(int month, int year) {
Calendar calendar = Calendar.getInstance();
// passing month-1 because 0-->jan, 1-->feb... 11-->dec
calendar.set(year, month - 1, 1);
calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
Date date = calendar.getTime();
DateFormat DATE_FORMAT = new SimpleDateFormat("MM/dd/YYYY");
return DATE_FORMAT.format(date);
}
для всех входов его работающий штраф с одним исключением, когда месяц декабрь, т.е. getDate (12, 2012) возвращает 12/31/2013, но он должен вернуться 12/31/2012. Пожалуйста, объясните поведение и решение.
Измените YYYY
на YYYY
DateFormat DATE_FORMAT = new SimpleDateFormat("MM/dd/yyyy");
YYYY
неверно dateformat
Попробуйте это
calendar.add(Calendar.MONTH, month);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.add(Calendar.DATE, -1);
Date date = calendar.getTime();
Попробуйте использовать Joda-Time, это проще:
private static String getLastDayOfMonth(int month, int year) {
LocalDate lastDayOfMonth = new LocalDate(year, month, 1).dayOfMonth().withMaximumValue();
return lastDayOfMonth.toString("MM/dd/yyyy");
}
private static String getDate(int month, int year) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.MONTH, month);
calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
Date date = calendar.getTime();
DateFormat DATE_FORMAT = new SimpleDateFormat("MM/dd/yyyy");
return DATE_FORMAT.format(date);
}
YearMonth.of( 2016 , 6 )
.atEndOfMonth()
.toString()
2016-06-30
Очень легко с java.time классы, встроенные в Java 8 и более поздние версии. Back-ported на Java 6 и 7, и далее адаптирован для Android.
YearMonth
Используйте удобный YearMonth
класс.
Совет. Передавайте объекты этого класса вокруг вашей базы кода, а не просто целые, чтобы воспользоваться безопасностью типа, гарантированными действительными значениями и более самодокументируемым кодом.
YearMonth yearMonth = YearMonth.of( 2016 , 6 );
... или...
YearMonth yearMonth = YearMonth.of( 2016 , Month.JUNE );
LocalDate
Затем попросите последний день этого месяца, представленный LocalDate
.
LocalDate endOfMonth = yearMonth.atEndOfMonth();
2016-06-30
Результат toString
, который вы видите выше, где String была сгенерирована с использованием стандартного ISO 8601. Вы можете использовать другое форматирование.
Класс DateTimeFormatter
может автоматически переводить на человеческий язык и применять культурные нормы к таким вопросам, как период против запятой или порядок год-месяц-день.
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT );
formatter = formatter.withLocale( Locale.US ); // Re-assign JVM’s current default Locale that was implicitly applied to the formatter.
String output = localDate.format( formatter );
Locale.US
дает нам формат месяц/день/год. Вы также можете указать явный шаблон, вызвав DateTimeFormatter.ofPattern
.
private static String getDate(int month, int year)
{
Calendar dateCal = Calendar.getInstance();
dateCal.set(year, month, 2);
int maxDay = dateCal.getActualMaximum(Calendar.DAY_OF_MONTH);
String pattern = "MMMM";
SimpleDateFormat obDateFormat = new SimpleDateFormat(pattern);
String monthName = obDateFormat.format(dateCal.getTime());
return "Last date of " + monthName + " " + year + " : " + maxDay;
}
With Java 8 DateTime / LocalDateTime :
private static String getDate(int month, int year) {
Month monthObj = Month.of(month);
LocalDate date = LocalDate.of(year, month, monthObj.maxLength());
return date.format(DateTimeFormatter.ofPattern("MM/dd/yyyy", Locale.US));
}
Вы можете использовать следующий код для получения последнего дня месяца
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;
}
Вы тоже рассматриваете високосный год? если нет, то вы можете попробовать под кодом:
public static Date calculateMonthEndDate(int month, int year) {
int[] daysInAMonth = { 29, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int day = daysInAMonth[month];
boolean isLeapYear = new GregorianCalendar().isLeapYear(year);
if (isLeapYear && month == 2) {
day++;
}
GregorianCalendar gc = new GregorianCalendar(year, month - 1, day);
Date monthEndDate = new Date(gc.getTime().getTime());
return monthEndDate;
}