Есть ли хороший способ получить дату предстоящей среды?

Есть ли хороший способ получить дату предстоящей среды? То есть, если сегодня вторник, я хочу получить дату среды на этой неделе; если сегодня среда, я хочу получить дату следующей среды; если сегодня четверг, я хочу получить дату среды на следующей неделе.

Спасибо.

Ответ 1

Основной алгоритм заключается в следующем:

  • Получить текущую дату
  • Получи свой день недели
  • Найди отличия со средой
  • Если разница не является положительной, добавьте 7 (то есть настаивайте на следующей наступающей/будущей дате)
  • Добавьте разницу

Вот фрагмент, чтобы показать, как это сделать с java.util.Calendar:

import java.util.Calendar;

public class NextWednesday {
    public static Calendar nextDayOfWeek(int dow) {
        Calendar date = Calendar.getInstance();
        int diff = dow - date.get(Calendar.DAY_OF_WEEK);
        if (diff <= 0) {
            diff += 7;
        }
        date.add(Calendar.DAY_OF_MONTH, diff);
        return date;
    }
    public static void main(String[] args) {
        System.out.printf(
            "%ta, %<tb %<te, %<tY",
            nextDayOfWeek(Calendar.WEDNESDAY)
        );
    }
}

Относительно моего здесь и сейчас, вывод приведенного выше фрагмента: "Wed, Aug 18, 2010".

API ссылки

Ответ 2

ТЛ; др

LocalDate                        // Represent a date-only value, without time-of-day and without time zone.
.now()                           // Capture the current date as seen in the wall-clock time used by the people of a specific region (a time zone). The JVMs current default time zone is used here. Better to specify explicitly your desired/expected time zone by passing a 'ZoneId' argument. Returns a 'LocalDate' object.
.with(                           // Generate a new 'LocalDate' object based on values of the original but with some adjustment. 
    TemporalAdjusters            // A class that provides some handy pre-defined implementations of 'TemporalAdjuster' (note the singular) interface.
    .next(                       // An implementation of 'TemporalAdjuster' that jumps to another date on the specified day-of-week.
        DayOfWeek.WEDNESDAY      // Pass one of the seven predefined enum objects, Monday-Sunday.
    )                            // Returns an object implementing 'TemporalAdjuster' interface.
)                                // Returns a 'LocalDate' object.

подробности

Используя Java8 Date time API, вы можете легко найти наступающую среду.

LocalDate nextWed = LocalDate.now().with(TemporalAdjusters.next(DayOfWeek.WEDNESDAY));

next (DayOfWeek dayOfWeek) - возвращает корректор следующего дня недели, который корректирует дату в соответствии с первым появлением указанного дня недели после корректируемой даты.

Предположим, если вы хотите получить предыдущую среду,

LocalDate prevWed = LocalDate.now().with(TemporalAdjusters.previous(DayOfWeek.WEDNESDAY));

previous (DayOfWeek dayOfWeek) - Возвращает предыдущий регулятор дня недели, который корректирует дату в соответствии с первым вхождением указанного дня недели перед корректируемой датой.

Предположим, если вы хотите получить следующую или текущую среду, то

LocalDate nextOrSameWed = LocalDate.now().with(TemporalAdjusters.nextOrSame(DayOfWeek.WEDNESDAY));

nextOrSame (DayOfWeek dayOfWeek) - возвращает корректор следующего дня или того же дня недели, который корректирует дату к первому вхождению указанного дня недели после корректируемой даты, если только он не находится в тот день, в который В случае, если тот же объект возвращается.

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

ZoneId zoneId = ZoneId.of("UTC");
LocalDate nextWed = LocalDate.now(zoneId).with(TemporalAdjusters.next(DayOfWeek.WEDNESDAY));

Для получения дополнительной информации обратитесь к TemporalAdjusters

Ответ 3

Использование JodaTime:

    LocalDate date = new LocalDate(System.currentTimeMillis());
    Period period = Period.fieldDifference(date, date.withDayOfWeek(DateTimeConstants.WEDNESDAY));
    int days = period.getDays();
    if (days < 1) {
        days = days + 7;
    }
    System.out.println(date.plusDays(days));

Ответ 4

Используйте java.util.Calendar. Вы получаете текущую дату/время следующим образом:

Calendar date = Calendar.getInstance();

Оттуда, получите date.get(Calendar.DAY_OF_WEEK), чтобы получить текущий день недели и получить значение Calendar.WEDNESDAY и добавить его.

Ответ 5

Calendar c= Calendar.getInstance();
c.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY);
c.add(Calendar.DAY_OF_MONTH, 7);
c.getTime();

Ответ 6

public static void nextWednesday() throws ParseException 
    {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        int weekday = calendar.get(Calendar.DAY_OF_WEEK);
        int days = Calendar.WEDNESDAY - weekday;
        if (days < 0)
        {
            days += 7;
        }
        calendar.add(Calendar.DAY_OF_YEAR, days);

        System.out.println(sdf.format(calendar.getTime()));
    }