Java 8 Date API - Получить порядковый номер дня в месяце - PullRequest
0 голосов
/ 06 января 2019

Вдохновлен следующими постами

Мне нужна функция, которая возвращает порядковый номер для данного дня в месяце, например:

01/01/1970 = 1 , потому что это первый четверг января 1970 г.

02/01/1970 = 1 , потому что это первая пятница января 1970 г.

19/01/1970 = 3 , потому что это третий понедельник в январе 1970 года

31/01/1970 = 5 , потому что это пятая суббота января 1970 г.

Что я пробовал? - Ничего ... я даже не знаю с чего начать; API даты / времени Java 8 для меня довольно новый.

В идеале я хочу функцию с такой подписью:

public int getOrdinalPosition(TemporalAccessor temporal) {
    ...
}

Ответы [ 4 ]

0 голосов
/ 06 января 2019

Что вам нужно, это ChronoField.ALIGNED_WEEK_OF_MONTH

LocalDate.of(1970,1,1).get(ChronoField.ALIGNED_WEEK_OF_MONTH)      //1
LocalDate.of(1970,1,2).get(ChronoField.ALIGNED_WEEK_OF_MONTH)      //1
LocalDate.of(1970,1,19).get(ChronoField.ALIGNED_WEEK_OF_MONTH)     //3
LocalDate.of(1970,1,31).get(ChronoField.ALIGNED_WEEK_OF_MONTH)     //5
0 голосов
/ 06 января 2019

Это похоже на работу ...

public int getOrdinalPosition(TemporalAccessor temporal) {
    return ((LocalDate.from(temporal).getDayOfMonth() - 1) / 7) + 1;
}
0 голосов
/ 06 января 2019

ChronoField.ALIGNED_WEEK_OF_MONTH

Вы можете использовать LocalDate.get() и ChronoField.ALIGNED_WEEK_OF_MONTH.

import java.time.LocalDate;
import java.time.temporal.ChronoField;
import java.time.temporal.TemporalAccessor;

/**
 *
 * @author Sedrick
 */
public class JavaApplication19 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        LocalDate localDate1 = LocalDate.of(1970, 01, 01);
        LocalDate localDate2 = LocalDate.of(1970, 02, 01);
        LocalDate localDate3 = LocalDate.of(1970, 01, 19);
        LocalDate localDate4 = LocalDate.of(1970, 01, 31);


        System.out.println(localDate1.get(ChronoField.ALIGNED_WEEK_OF_MONTH));
        System.out.println(localDate2.get(ChronoField.ALIGNED_WEEK_OF_MONTH));
        System.out.println(localDate3.get(ChronoField.ALIGNED_WEEK_OF_MONTH));
        System.out.println(localDate4.get(ChronoField.ALIGNED_WEEK_OF_MONTH));

        System.out.println(getOrdinalPosition(localDate4));
    }

    static public int getOrdinalPosition(TemporalAccessor temporal) {
        return LocalDate.from(temporal).get(ChronoField.ALIGNED_WEEK_OF_MONTH);
    }
}

Выход:

run:
1
1
3
5
5
BUILD SUCCESSFUL (total time: 0 seconds)
0 голосов
/ 06 января 2019

Ну, бери 19.01.1970. Вычтите 7 дней из этого, и это ... все еще январь. Вычтите 7 дней снова и ... все еще январь. Вычтите 7 дней в 4-й раз и ... о, эй, это больше не январь. В четвертый раз, когда вы удалили 7 дней, месяц перестал быть правильным.

Это все, что вам нужно здесь.

Соответствующие методы: цикл for, счетчик и ... метод minusDays(7) и getMonth().

...