Тот же день предыдущего года (предыдущий год, та же неделя и день недели) - PullRequest
0 голосов
/ 30 июня 2019

Я хочу получить тот же день предыдущего года.

например, сегодня 2019-03-30, то есть год 2019, неделя 26 (неделя года), день 7 (день недели).

Мне нужно построить LocalDate, то есть год 2018, неделя 26 (неделя года), день 7 (день недели).

Я не смог найти из java.time пакет, который может собрать LocalDateкак это.

Ответы [ 3 ]

4 голосов
/ 30 июня 2019

Похоже, вы хотите, чтобы дата предыдущего года совпадала с неделей года и днем ​​недели в качестве заданной даты. Ниже код с, чтобы дать вам этот результат.

LocalDate currentLocalDate = LocalDate.now();
int dayOfWeek = currentLocalDate.getDayOfWeek().getValue();
int weekOfYear = currentLocalDate.get(ChronoField.ALIGNED_WEEK_OF_YEAR);
LocalDate resultLocalDate = currentLocalDate
    .minusYears(1)
    .with(ChronoField.ALIGNED_WEEK_OF_YEAR, weekOfYear)
    .with(ChronoField.DAY_OF_WEEK, dayOfWeek);

Полный пример ( живая копия ):

import java.time.*;
import java.time.format.*;
import java.time.temporal.*;

class Example
{
    private static void showDateInfo(LocalDate ld) {
        int weekOfYear = ld.get(ChronoField.ALIGNED_WEEK_OF_YEAR);
        int dayOfWeek = ld.getDayOfWeek().getValue();
        System.out.println(ld.format(DateTimeFormatter.ISO_LOCAL_DATE) + " is week " + weekOfYear + ", day " + dayOfWeek);
    }
    public static void main (String[] args) throws java.lang.Exception
    {
        LocalDate currentLocalDate = LocalDate.of(2019, 6, 30);
        showDateInfo(currentLocalDate);
        int dayOfWeek = currentLocalDate.getDayOfWeek().getValue();
        int weekOfYear = currentLocalDate.get(ChronoField.ALIGNED_WEEK_OF_YEAR);
        LocalDate resultLocalDate = currentLocalDate
            .minusYears(1)
            .with(ChronoField.ALIGNED_WEEK_OF_YEAR, weekOfYear)
            .with(ChronoField.DAY_OF_WEEK, dayOfWeek);
        showDateInfo(resultLocalDate);
    }
}

Выход:

2019-06-30 is week 26, day 7
2018-07-01 is week 26, day 7
0 голосов
/ 30 июня 2019

Я считаю, что другие ответы близки, но еще не совсем там.Насколько я понимаю, вы хотите использовать недельную схему локали по умолчанию, чего нет в других ответах.Мое предложение:

    WeekFields wf = WeekFields.of(Locale.getDefault());
    LocalDate today = LocalDate.now(ZoneId.of("Africa/Casablanca"));
    int week = today.get(wf.weekOfYear());
    int dow = today.get(wf.dayOfWeek());
    System.out.println("Today is " + today + ", "
            + today.getDayOfWeek() + " of week " + week);

    LocalDate correspondingDayLastYear = today.minusYears(1)
            .with(wf.weekOfYear(), week)
            .with(wf.dayOfWeek(), dow);
    System.out.println("Last year was " + correspondingDayLastYear + ", "
            + correspondingDayLastYear.getDayOfWeek()
            + " of week " + correspondingDayLastYear.get(wf.weekOfYear()));

При запуске на моем компьютере только сейчас вывод:

Today is 2019-06-30, SUNDAY of week 26
Last year was 2018-07-01, SUNDAY of week 26

Когда я устанавливаю свой язык в США, я получаю то же самоедата, но другой номер недели, так как американские недели определены по-разному:

Today is 2019-06-30, SUNDAY of week 27
Last year was 2018-07-01, SUNDAY of week 27

Я считаю, что также будут случаи, когда разные локали будут давать вам разные даты.

wf.dayOfWeek() дает вам поле, которое нумерует дни от 1 до 7 в соответствии с первым днем ​​недели в данном конкретном регионе.Важно не просто использовать withDayOfWeek или его эквивалент, иначе вы рискуете перейти на другую неделю, если не будете использовать недели ISO.

Тем не менее мой ответ не всегда будет работать!Если сегодня 53 недели года, вполне может быть, что в прошлом году не было 53 недели. Мы мало что можем с этим поделать.Еще одна проблема, которую мы не можем решить: в американских неделях неделя 1 начинается 1 января. Если это воскресенье, то это первый день недели, но затем неделя 1 предыдущего года начиналась в пятницу или субботу, поэтому неделяУ меня не было воскресенья.

0 голосов
/ 30 июня 2019

Вы можете добавить количество дней с начала года текущей даты до начала года до этого.

Это должно сработать:

String dateStr = "2019-03-30";
LocalDate date = LocalDate.parse(dateStr);
LocalDate newDate = LocalDate.parse(date.getYear() + "-01-01").plusDays(date.getDayOfYear());
System.out.println(newDate);
...