Как получить порядковые будни в месяце - PullRequest
1 голос
/ 09 ноября 2010

Привет, я хочу создать программу в Java, где дни, weekNo является параметром. Как первая пятница месяца или второй понедельник месяца.

Ответы [ 4 ]

5 голосов
/ 09 ноября 2010

Вот вспомогательный метод, который делает это, используя DateUtils из Apache Commons / Lang :

/**
 * Get the n-th x-day of the month in which the specified date lies.  
 * @param input the specified date
 * @param weeks 1-based offset (e.g. 1 means 1st week)
 * @param targetWeekDay (the weekday we're looking for, e.g. Calendar.MONDAY
 * @return the target date
 */
public static Date getNthXdayInMonth(final Date input,
    final int weeks,
    final int targetWeekDay){

    // strip all date fields below month
    final Date startOfMonth = DateUtils.truncate(input, Calendar.MONTH);
    final Calendar cal = Calendar.getInstance();
    cal.setTime(startOfMonth);
    final int weekDay = cal.get(Calendar.DAY_OF_WEEK);
    final int modifier = (weeks - 1) * 7 + (targetWeekDay - weekDay);
    return modifier > 0
        ? DateUtils.addDays(startOfMonth, modifier)
        : startOfMonth;
}

Тестовый код:

// Get this month's third thursday
System.out.println(getNthXdayInMonth(new Date(), 3, Calendar.THURSDAY));

// Get next month's second wednesday:
System.out.println(getNthXdayInMonth(DateUtils.addMonths(new Date(), 1),
    2,
    Calendar.WEDNESDAY)
);

Вывод:

Четверг 18 00:00:00 CET 2010
Ср. 08 декабря 00:00:00 CET 2010


И вот версия того же кода JodaTime (я никогда раньше не использовал JodaTime, поэтому, вероятно, существует более простой способ сделать это):

/**
 * Get the n-th x-day of the month in which the specified date lies.
 * 
 * @param input
 *            the specified date
 * @param weeks
 *            1-based offset (e.g. 1 means 1st week)
 * @param targetWeekDay
 *            (the weekday we're looking for, e.g. DateTimeConstants.MONDAY
 * @return the target date
 */
public static DateTime getNthXdayInMonthUsingJodaTime(final DateTime input,
    final int weeks,
    final int targetWeekDay){

    final DateTime startOfMonth =
        input.withDayOfMonth(1).withMillisOfDay(0);
    final int weekDay = startOfMonth.getDayOfWeek();
    final int modifier = (weeks - 1) * 7 + (targetWeekDay - weekDay);
    return modifier > 0 ? startOfMonth.plusDays(modifier) : startOfMonth;
}

Код теста:

// Get this month's third thursday
System.out.println(getNthXdayInMonthUsingJodaTime(new DateTime(),
    3,
    DateTimeConstants.THURSDAY));

// Get next month's second wednesday:
System.out.println(getNthXdayInMonthUsingJodaTime(new DateTime().plusMonths(1),
    2,
    DateTimeConstants.WEDNESDAY));

Выход:

2010-11-18T00: 00: 00.000+01: 00
2010-12-08T00: 00: 00.000 + 01: 00

1 голос
/ 09 ноября 2010
  public static Date getDate(int day, int weekNo, int month, int year) {
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.DATE,1);
    cal.set(Calendar.YEAR, year);
    cal.set(Calendar.MONTH, month);
    for (int i = 0; i < 31; i++) {
        if (cal.get(Calendar.WEEK_OF_MONTH) == weekNo
                && cal.get(Calendar.DAY_OF_WEEK) == day) {
            return cal.getTime();
        }
        cal.add(Calendar.DATE,1);
    }
    return null;
  }

Телефонный код

System.out.println(""+getDate(Calendar.MONDAY, 2, Calendar.DECEMBER,2010));

Выход

Mon Dec 06 15:09:00 IST 2010
0 голосов
/ 01 февраля 2017

tl; dr

LocalDate firstFridayThisMonth =
    LocalDate.now( ZoneId.of( "America/Montreal" ) )
             .with( TemporalAdjusters.firstInMonth( DayOfWeek.FRIDAY ) )

Использование java.time

Остальные ответы теперь устарели.Проблемные старые классы даты и времени (Date, Calendar и т. Д.) Теперь legacy , вытесненные классами java.time.

LocalDate

Класс LocalDate представляет значение только для даты без времени суток и без часового пояса.

Aчасовой пояс имеет решающее значение при определении даты.В любой момент времени дата меняется по всему земному шару в зависимости от зоны.Например, через несколько минут после полуночи в Париж Франция - это новый день, в то время как "вчера" в Монреаль Квебек .

Укажите надлежащий часовой поясимя в формате continent/region, например America/Montreal, Africa/Casablanca или Pacific/Auckland.Никогда не используйте 3-4-буквенное сокращение, например EST или IST, поскольку они не истинных часовых поясов, не стандартизированы и даже не уникальны (!).

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

TemporalAdjuster

Интерфейс TemporalAdjuster позволяет управлять значениями даты и времени.Классы java.time используют неизменяемые объекты, поэтому результатом всегда является новый новый объект со значениями, основанными на оригинале.

Класс TemporalAdjusters (обратите внимание на имя во множественном числе) предоставляет несколько удобныхреализации.Среди них можно получить порядковый день недели в течение месяца: firstInMonth(), lastInMonth() и dayOfWeekInMonth().Все они принимают аргумент объекта перечисления DayOfWeek.

LocalDate firstFridayOfThisMonth = 
    today.with(
        TemporalAdjusters.firstInMonth( DayOfWeek.FRIDAY ) 
    )
;

… и…

LocalDate secondMondayOfThisMonth = 
    today.with(
        TemporalAdjusters.dayOfWeekInMonth( 2 , DayOfWeek.MONDAY ) 
    )
;

… и…

LocalDate thirdWednesdayOfNextMonth = 
    today.plusMonths( 1 )
         .with(  
             TemporalAdjusters.dayOfWeekInMonth( 3 , DayOfWeek.WEDNESDAY )  
         )
;

О java.time

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

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

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

Где получить классы java.time?

  • Java SE 8 и SE 9 и более поздних версий
    • Встроенный,
    • Часть стандартного Java API с встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • Большая часть функций java.time перенесена на Java 6 & 7 в ThreeTen-Backport .
  • Android

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

0 голосов
/ 09 ноября 2010
Calendar cal = Calendar.getInstance();
int dayofweek = cal.get(Calendar.DAY_OF_WEEK);

это должно делать то, что вы хотите.
редактировать : с помощью еще нескольких шагов вычисления вы можете получить результат :) (извините за путаницу в названии)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...