Есть ли хороший способ получить дату предстоящей среды?
Есть ли хороший способ получить дату предстоящей среды?
То есть, если сегодня вторник, я хочу получить дату среды на этой неделе; если сегодня среда, я хочу получить дату следующей среды; если сегодня четверг, я хочу получить дату среды на следующей неделе.
Спасибо.
Ответы
Ответ 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()));
}