Получить последнюю пятницу месяца в Java - PullRequest
15 голосов
/ 16 сентября 2008

Я работаю над проектом, в котором требуется, чтобы дата рассчитывалась как последняя пятница данного месяца. Я думаю, что у меня есть решение, которое использует только стандартную Java, но мне было интересно, знает ли кто-нибудь что-нибудь более краткое или эффективное. Вот что я тестировал в этом году:

    for (int month = 0; month < 13; month++) {
        GregorianCalendar d = new GregorianCalendar();
        d.set(d.MONTH, month);
        System.out.println("Last Week of Month in " + d.getDisplayName(d.MONTH, Calendar.LONG, Locale.ENGLISH) + ": " + d.getLeastMaximum(d.WEEK_OF_MONTH));
        d.set(d.DAY_OF_WEEK, d.FRIDAY);
        d.set(d.WEEK_OF_MONTH, d.getActualMaximum(d.WEEK_OF_MONTH));
        while (d.get(d.MONTH) > month || d.get(d.MONTH) < month) {
            d.add(d.WEEK_OF_MONTH, -1);
        }
        Date dt = d.getTime();
        System.out.println("Last Friday of Last Week in  " + d.getDisplayName(d.MONTH, Calendar.LONG, Locale.ENGLISH) + ": " + dt.toString());
    }

Ответы [ 16 ]

34 голосов
/ 30 марта 2010

Пусть Calendar.class сделает свое волшебство за вас;)

pCal.set(GregorianCalendar.DAY_OF_WEEK,Calendar.FRIDAY);
pCal.set(GregorianCalendar.DAY_OF_WEEK_IN_MONTH, -1);
25 голосов
/ 17 сентября 2008

На основании отмеченных 23 предложений:

public Date getLastFriday( int month, int year ) {
   Calendar cal = Calendar.getInstance();
   cal.set( year, month + 1, 1 );
   cal.add( Calendar.DAY_OF_MONTH, -( cal.get( Calendar.DAY_OF_WEEK ) % 7 + 1 ) );
   return cal.getTime();
}
9 голосов
/ 23 ноября 2015

java.time

Используя java.time библиотеку, встроенную в Java 8 и выше, вы можете использовать TemporalAdjusters.lastInMonth:

val now = LocalDate.now() 
val lastInMonth = now.with(TemporalAdjusters.lastInMonth(DayOfWeek.FRIDAY))

Вы можете выбрать любой день из списка DayOfWeek.

Если вам необходимо добавить информацию о времени, вы можете использовать любое доступное преобразование LocalDate в LocalDateTime, например

lastFriday.atStartOfDay() // e.g. 2015-11-27T00:00
9 голосов
/ 17 сентября 2008

Вам никогда не нужно зацикливаться, чтобы это выяснить. Чтобы определить дату «последней пятницы» для этого месяца, начните с первого дня следующего месяца. Вычтите соответствующее количество дней в зависимости от того, на какой (числовой) день недели приходится первый день месяца. Там твоя "последняя пятница". Я почти уверен, что это может быть сведено к длинной строчке, но я не Java-разработчик. Так что я оставлю это кому-то еще.

7 голосов
/ 17 сентября 2008

Я бы использовал библиотеку типа Jodatime . Он имеет очень полезный API и использует обычные номера месяцев. И что самое приятное, он безопасен для потоков.

Я думаю, что у вас может быть решение с (но, возможно, не самым коротким, но, безусловно, более читабельным):

DateTime now = new DateTime();      
DateTime dt = now.dayOfMonth().withMaximumValue().withDayOfWeek(DateTimeConstants.FRIDAY);
if (dt.getMonthOfYear() != now.getMonthOfYear()) {
  dt = dt.minusDays(7);
}       
System.out.println(dt);
2 голосов
/ 17 сентября 2008

код алгоритм Адама Дэвиса

public static int getLastFriday(int month, int year)
{
Calendar cal = Calendar.getInstance();
cal.set(year, month, 1, 0, 0, 0); // set to first day of the month
cal.set(Calendar.MILLISECOND, 0);

int firstDay = cal.get(Calendar.DAY_OF_WEEK);
int daysOfMonth = cal.getMaximum(Calendar.DAY_OF_MONTH);

switch (firstDay)
{
    case Calendar.SUNDAY :
        return 27;
    case Calendar.MONDAY :
        return 26;
    case Calendar.TUESDAY :
        return 25;
    case Calendar.WEDNESDAY :
        if (daysOfMonth == 31) return 31;
        return 24;
    case Calendar.THURSDAY :
        if (daysOfMonth >= 30) return 30;
        return 23;
    case Calendar.FRIDAY :
        if (daysOfMonth >= 29) return 29;
        return 22;
    case Calendar.SATURDAY :
        return 28;
}
throw new RuntimeException("what day of the month?");
}}
2 голосов
/ 17 сентября 2008

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

Если первый день месяца равен

  • Воскресенье, затем последняя пятница всегда 27-го числа.
  • Понедельник, затем последняя пятница всегда 26 числа.
  • вторник, затем последняя пятница всегда 25-е число.
  • Среда, тогда последняя пятница - 24-е, если в месяце 31 день, то это 31-е
  • Четверг, затем последняя пятница - 23-е число, если в месяце 30 или более дней, то это 30-е число.
  • Пятница, затем последняя пятница - 22-е, если в месяце не более 29 или более дней, то это 29-е.
  • суббота, затем последняя пятница всегда 28 числа.

Есть только три особых случая. Один оператор switch и три оператора if (или троичные операторы, если вы хотите, чтобы в каждом случае была одна строка ...)

Работай на бумаге. Не нужны никакие специальные библиотеки, функции, юлианские преобразования и т.д.

Аарон реализовал это на Java.

-Adam

1 голос
/ 06 декабря 2016

В Java 8 мы можем сделать это просто:

LocalDate lastFridayOfMonth = LocalDate
                                    .now()
                                    .with(lastDayOfMonth())
                                    .with(previous(DayOfWeek.FRIDAY));
1 голос
/ 07 июня 2012

Программа ниже для последней пятницы каждого месяца. его можно использовать для получения последнего числа дня недели в любом месяце. Переменная offset=0 означает текущий месяц (системная дата), смещение = 1 означает следующий месяц и т. Д. Метод getLastFridayofMonth(int offset) вернет последнюю пятницу.

import java.text.SimpleDateFormat;
import java.util.Calendar;

public class LastFriday {

  public static Calendar getLastFriday(Calendar cal,int offset){
    int dayofweek;//1-Sunday,2-Monday so on....
    cal.set(Calendar.MONTH,cal.get(Calendar.MONTH)+offset);
    cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); //set calendar to last day of month
    dayofweek=cal.get(Calendar.DAY_OF_WEEK); //get the day of the week for last day of month set above,1-sunday,2-monday etc
    if(dayofweek<Calendar.FRIDAY)  //Calendar.FRIDAY will return integer value =5 
      cal.set(Calendar.DAY_OF_MONTH, cal.get(Calendar.DAY_OF_MONTH)-7+Calendar.FRIDAY-dayofweek);
    else
      cal.set(Calendar.DAY_OF_MONTH, cal.get(Calendar.DAY_OF_MONTH)+Calendar.FRIDAY-dayofweek); 

    return cal;
  }

  public static String  getLastFridayofMonth(int offset) { //offset=0 mean current month
    final String DATE_FORMAT_NOW = "dd-MMM-yyyy";
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
    cal=getLastFriday(cal,offset);
    return sdf.format(cal.getTime()); 

  }

  public static void main(String[] args) {
    System.out.println(getLastFridayofMonth(0)); //0 = current month
    System.out.println(getLastFridayofMonth(1));//1=next month
    System.out.println(getLastFridayofMonth(2));//2=month after next month
  }

}
1 голос
/ 18 октября 2011

вот как узнать последнюю пятницу или любой другой день недели месяца:

Calendar thisMonth = Calendar.getInstance();
dayOfWeek = Calendar.FRIDAY; // or whatever
thisMonth.set(Calendar.WEEK_OF_MONTH, thisMonth.getActualMaximum(Calendar.WEEK_OF_MONTH);;
thisMonth.set(Calendar.DAY_OF_WEEK, dayOfWeek);
int lastDay = thisMonth.get(Calendar.DAY_OF_MONTH); // this should be it.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...