Начало и конец недели с ThreeTenBackport - PullRequest
0 голосов
/ 24 июня 2019

В настоящее время я изменяю некоторый код из Joda-Time для использования Three-Ten Android Backport.

Все следующие методы принимают long в качестве параметра и возвращают long

Получение конца и начала недели с JodaTime было простым с Joda-Time:

LocalDate(long time).dayOfWeek().withMaximumValue()
LocalDate(long time).dayOfWeek().withMinimumValue()

Та же проблема присутствует с концом и началом дня с Joda-Time:

DateTime(long time).withTimeAtStartOfDay().getMillis() + DateUtils.DAY_IN_MILLIS - 1
DateTime(long time).withTimeAtStartOfDay().getMillis()

Однако я не понимаю, как использовать threeTenAbp таким образом.

Одна мысль о конце и начале дней:

КОНЕЦ ДНЯ:

LocalDateTime dt = DateTimeUtils.toLocalDateTime(new Timestamp(time));
ZonedDateTime zdt = ZonedDateTime.of(dt, ZoneId.systemDefault());
return zdt.with(LocalTime.MAX).toEpochSecond();

НАЧАЛО ДНЯ:

LocalDateTime dt = DateTimeUtils.toLocalDateTime(new Timestamp(long time));
ZonedDateTime zdt = ZonedDateTime.of(dt, ZoneId.systemDefault());
return zdt.toLocalDate().atStartOfDay(ZoneId.systemDefault()).toEpochSecond();

Это выглядит довольнозамысловатый и на самом деле не дает мне никаких подсказок о том, как получить и время начала и конца недели в соответствии с long time, переданным функциям.

Ответы [ 2 ]

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

Мы не получаем полную картину, поэтому мои предложения, возможно, не имеют смысла, но позвольте мне попытаться.

    long millisSinceEpoch = 1_555_555_555_555L;
    LocalDate date = Instant.ofEpochMilli(millisSinceEpoch)
            .atZone(ZoneId.systemDefault())
            .toLocalDate();
    LocalDate firstDayOfWeek = date.with(DayOfWeek.MONDAY);
    LocalDate lastDayOfWeek = date.with(DayOfWeek.SUNDAY);
    System.out.println("Week is from " + firstDayOfWeek + " through " + lastDayOfWeek);

Неделя с 2019-04-15 по 2019-04-21

Я предполагаю, что вы хотите недели ISO, то есть понедельник - первый день недели (я думаю, это то, что вам дал ваш код Joda-Time). Если нет, вам нужно ввести объект WeekFields, как в ответе Бена П. Я полагаю, что вы не хотите конвертировать обратно в long. A LocalDate приятнее работать с движением вперед.

Для начала дня:

    ZonedDateTime startOfDay = date.atStartOfDay(ZoneId.systemDefault());
    System.out.println("Start of day: " + startOfDay);

В моем часовом поясе я получаю:

Начало дня: 2019-04-18T00: 00 + 02: 00 [Европа / Копенгаген]

Опять же, сохраняйте объект ZonedDateTime вместо преобразования в миллисекунды.

Не рассчитывайте конец дня. Для точки, в которой день переворачивается («полночь»), всегда используйте начало дня.

    ZonedDateTime startOfNextDay = date.plusDays(1)
            .atStartOfDay(ZoneId.systemDefault());
    System.out.println("Day is from " + startOfDay + " inclusive to " + startOfNextDay + " exclusive");

День с 2019-04-18T00: 00 + 02: 00 [Европа / Копенгаген] включительно 2019-04-19T00: 00 + 02: 00 [Европа / Копенгаген] эксклюзив

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

Чтобы получить начало и конец дня, я бы использовал метод with(), передавая один из предопределенных LocalTime экземпляров:

LocalDateTime ldt = LocalDateTime.now();
LocalDateTime startOfDay = ldt.with(LocalTime.MIN); // 00:00:00
LocalDateTime endOfDay = ldt.with(LocalTime.MAX); // 23:59:59

Чтобы получить первый и последний день недели, вы можете делать то же самое, но сначала вам нужно определить, что вы подразумеваете под «неделей». Некоторые страны считают, что неделя начинается в понедельник, а другие считают, что она начинается в воскресенье.

В США недели начинаются в воскресенье. Мы можем получить TemporalField, который представляет это, используя WeekFields.of():

WeekFields usWeek = WeekFields.of(Locale.US);

Затем мы можем получить первый и последний день недели, установив для этого поля значение 1 и 7 соответственно:

LocalDateTime firstDayOfWeek = ldt.with(usWeek.dayOfWeek(), 1);
LocalDateTime lastDayOfWeek = ldt.with(usWeek.dayOfWeek(), 7);
...