Nextrp [CPP] RU + Many GEOs Игра на карте России | NEXTRP

Получить последнюю пятницу месяца в Java

java date calendar

28685 просмотра

19 ответа

3988 Репутация автора

Я работаю над проектом, в котором требование должно быть рассчитано как последняя пятница данного месяца. Я думаю, что у меня есть решение, которое использует только стандартную 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());
    }
Автор: Nick Klauer Источник Размещён: 16.09.2008 07:51

Ответы (19)


0 плюса

45889 Репутация автора

Существует множество полезных методов расчета дня недели . С небольшим количеством добавленной алгебры один из них должен быть адаптирован к вашей проблеме.

Автор: Daniel Spiewak Размещён: 16.09.2008 07:55

1 плюс

10297 Репутация автора

Это выглядит вполне приемлемым решением. Если это работает, используйте его. Это минимальный код, и нет никаких оснований для его оптимизации, если вам не нужно.

Автор: scubabbl Размещён: 16.09.2008 07:56

0 плюса

0 Репутация автора

Это не сработает. Ваш цикл будет цикл 13 раз (от 0 до 12).

Автор: Howard Johnson Размещён: 16.09.2008 08:03

1 плюс

10533 Репутация автора

Немного легче читать, грубая сила:

public 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 friday = -1;
    while (cal.get(Calendar.MONTH) == month) { 
        if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY) { // is it a friday?
            friday = cal.get(Calendar.DAY_OF_MONTH);
            cal.add(Calendar.DAY_OF_MONTH, 7); // skip 7 days
        } else {
            cal.add(Calendar.DAY_OF_MONTH, 1); // skip 1 day
        }
    }
    return friday;
}
Автор: Binil Thomas Размещён: 16.09.2008 08:09

7 плюса

1233 Репутация автора

Я бы использовал библиотеку 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);
Автор: Hans Doggen Размещён: 16.09.2008 08:13

9 плюса

0 Репутация автора

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

Автор: marked23 Размещён: 16.09.2008 08:14

1 плюс

9112 Репутация автора

Хотя я согласен с scubabbl, вот версия без внутреннего.

int year = 2008;
for (int m = Calendar.JANUARY; m <= Calendar.DECEMBER; m++) {
    Calendar cal = new GregorianCalendar(year, m, 1);
    cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
    int diff = Calendar.FRIDAY - cal.get(Calendar.DAY_OF_WEEK);
    if (diff > 0) {
        diff -= 7;
    }
    cal.add(Calendar.DAY_OF_MONTH, diff);
    System.out.println(cal.getTime());
}
Автор: Benno Richters Размещён: 16.09.2008 08:15

2 плюса

67633 Репутация автора

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

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

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

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

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

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

-Адам

Автор: Adam Davis Размещён: 16.09.2008 08:36

24 плюса

90860 Репутация автора

Решение

Основываясь на предположении mark23 :

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();
}
Автор: ColinD Размещён: 16.09.2008 09:04

0 плюса

3563 Репутация автора

Решение ColinD не должно работать: попробуйте запустить его с декабря 2008 года, и он попытается установить 13-й месяц в году. Однако замена "cal.set (...)" на "cal.add (Calendar.MONTH, 1)" должна работать нормально.

Автор: Nikolai Prokoschenko Размещён: 16.09.2008 09:12

2 плюса

606 Репутация автора

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

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?");
}}
Автор: Aaron Размещён: 16.09.2008 09:27

0 плюса

0 Репутация автора

Надеюсь это поможет..

public static void getSundaysInThisMonth(int monthNumber, int yearNumber){
    //int year =2009;
    //int dayOfWeek = Calendar.SUNDAY;
    // instantiate Calender and set to first Sunday of 2009
    Calendar cal = new GregorianCalendar();
    cal.set(Calendar.MONTH, monthNumber-1);
    cal.set(Calendar.YEAR, yearNumber);
    cal.set(Calendar.DATE, 1);
    int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
    int dateOfWeek = cal.get(Calendar.DATE);
    while (dayOfWeek  != Calendar.SUNDAY) {
       cal.set(Calendar.DATE, ++dateOfWeek);
       dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
      }
    cal.set(Calendar.DATE, dateOfWeek);

    int i = 1;
    while (cal.get(Calendar.YEAR) == yearNumber && cal.get(Calendar.MONTH)==monthNumber-1)
    {
            System.out.println("Sunday " + " " + i + ": " + cal.get(Calendar.DAY_OF_MONTH));
            cal.add(Calendar.DAY_OF_MONTH, 7);
            i++;
    }

  }
  public static void main(String args[]){
    getSundaysInThisMonth(1,2009);
  }
Автор: nivedita Размещён: 01.07.2009 07:19

34 плюса

0 Репутация автора

Пусть Calendar.class сделает для вас свою магию;)

pCal.set(GregorianCalendar.DAY_OF_WEEK,Calendar.FRIDAY);
pCal.set(GregorianCalendar.DAY_OF_WEEK_IN_MONTH, -1);
Автор: user305153 Размещён: 30.03.2010 01:49

1 плюс

7327 Репутация автора

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

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.
Автор: josephus Размещён: 18.10.2011 10:55

0 плюса

31 Репутация автора

public static Calendar getNthDow(int month, int year, int dayOfWeek, int n) {
    Calendar cal = Calendar.getInstance();
    cal.set(year, month, 1);
    cal.set(Calendar.DAY_OF_WEEK, dayOfWeek);
    cal.set(Calendar.DAY_OF_WEEK_IN_MONTH, n);
    return (cal.get(Calendar.MONTH) == month) && (cal.get(Calendar.YEAR) == year) ? cal : null;
}
Автор: Alexeyy Alexeyy Размещён: 27.02.2012 05:22

1 плюс

11 Репутация автора

Ниже программа предназначена для последней пятницы каждого месяца. его можно использовать для получения последнего из любого дня недели в любой месяц. Переменная 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
  }

}
Автор: akshay jangid Размещён: 06.06.2012 09:54

0 плюса

1 Репутация автора

public static int lastSundayDate()
{
    Calendar cal = getCalendarInstance();
    cal.setTime(new Date(getUTCTimeMillis()));
    cal.set( Calendar.DAY_OF_MONTH , 25 );
    return (25 + 8 - (cal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY ? cal.get(Calendar.DAY_OF_WEEK) : 8));
}
Автор: Dhananjay Chauhan Размещён: 14.03.2014 06:01

7 плюса

3281 Репутация автора

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
Автор: Przemek Размещён: 23.11.2015 09:51

1 плюс

3471 Репутация автора

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

LocalDate lastFridayOfMonth = LocalDate
                                    .now()
                                    .with(lastDayOfMonth())
                                    .with(previous(DayOfWeek.FRIDAY));
Автор: KayV Размещён: 06.12.2016 11:11
32x32