Как проверить, является ли определенная дата выходным с учетом текущей локали в Java?

Я пишу программу на Java, и мне нужно определить, является ли определенная дата выходным или нет. Однако мне нужно учитывать, что в разных странах выходные приходятся на разные дни, т.е. в Израиле это пятница и суббота, а в некоторых исламских странах - четверг и пятница. Более подробную информацию вы можете найти в этой статье Википедии. Есть ли простой способ сделать это?


person Bartek    schedule 29.07.2013    source источник
comment
Мне не кажется, что эта информация хранится в локали.   -  person Sotirios Delimanolis    schedule 29.07.2013
comment
Вам действительно следует подумать о переходе на JodaTime вместо использования даты/времени Java. (Если вы не используете Java 8 и вам не нужно поддерживать предыдущие платформы Java — JodaTime более или менее встроен в Java 8 под другим именем.)   -  person RenniePet    schedule 27.09.2014
comment
@RenniePet Да Joda-Time — замечательная библиотека. Но я не вижу, как это поможет в этом вопросе. Насколько я знаю, Joda-Time не содержит никакой информации о локали относительно будних и выходных дней. Joda-Time поддерживает стандартные недели ISO 8601, но не недели других культур. Пожалуйста, опубликуйте ответ, если у вас есть понимание или пример кода, которым вы можете поделиться.   -  person Basil Bourque    schedule 28.09.2014
comment
возможный дубликат примера java, чтобы получить все даты выходных в данном месяце   -  person Basil Bourque    schedule 28.09.2014
comment
@BasilBourque: Хорошо, извините, я исправлен. Я довольно новичок в Java, и мне стало известно о различных проблемах со встроенными функциями даты/времени и календаря Java, и стандартный совет всегда переключаться на JodaTime (что я сделал в своем маленьком приложении), поэтому я просто предполагал, что это также поможет здесь. Спасибо, что сообщили мне.   -  person RenniePet    schedule 28.09.2014
comment
@RenniePet Не нужно извиняться. Мы здесь, чтобы учиться и исследовать. Я спрашивал, а не критиковал. Joda-Time — это огромный проект со множеством закоулков. И теперь проект java.time добавляет еще одно измерение. Если есть какое-то решение этой проблемы выходных и праздников, я хотел бы его услышать. Пока кажется, что есть только два решения: Jollyday и самостоятельный.   -  person Basil Bourque    schedule 28.09.2014


Ответы (4)


Основываясь на присланной вами вики, я решил это для себя с помощью следующего кода:

private static final List<String> sunWeekendDaysCountries = Arrays.asList(new String[]{"GQ", "IN", "TH", "UG"});
private static final List<String> fryWeekendDaysCountries = Arrays.asList(new String[]{"DJ", "IR"});
private static final List<String> frySunWeekendDaysCountries = Arrays.asList(new String[]{"BN"});
private static final List<String> thuFryWeekendDaysCountries = Arrays.asList(new String[]{"AF"});
private static final List<String> frySatWeekendDaysCountries = Arrays.asList(new String[]{"AE", "DZ", "BH", "BD", "EG", "IQ", "IL", "JO", "KW", "LY", "MV", "MR", "OM", "PS", "QA", "SA", "SD", "SY", "YE"});

public static int[] getWeekendDays(Locale locale) {
    if (thuFryWeekendDaysCountries.contains(locale.getCountry())) {
        return new int[]{Calendar.THURSDAY, Calendar.FRIDAY};
    }
    else if (frySunWeekendDaysCountries.contains(locale.getCountry())) {
        return new int[]{Calendar.FRIDAY, Calendar.SUNDAY};
    }
    else if (fryWeekendDaysCountries.contains(locale.getCountry())) {
        return new int[]{Calendar.FRIDAY};
    }
    else if (sunWeekendDaysCountries.contains(locale.getCountry())) {
        return new int[]{Calendar.SUNDAY};
    }
    else if (frySatWeekendDaysCountries.contains(locale.getCountry())) {
        return new int[]{Calendar.FRIDAY, Calendar.SATURDAY};
    }
    else {
        return new int[]{Calendar.SATURDAY, Calendar.SUNDAY};
    }
}
person João Rebelo    schedule 27.09.2014

Вы можете получить день недели (см.: Как определить день недели, передав конкретную дату?)

Затем просто проверьте, является ли этот день выходным в зависимости от выбранной страны.

person Orch    schedule 29.07.2013

Класс Java Calendar имеет эту функциональность, getFirstDayOfWeek метод. Цитата из документации Calendar:

Календарь определяет семидневную неделю для конкретной локали с использованием двух параметров: первый день недели и минимальное количество дней в первой неделе (от 1 до 7). Эти числа берутся из данных ресурса локали при создании календаря. Они также могут быть указаны явно через методы установки их значений.

Таким образом, с этой информацией вы сможете рассчитать, является ли день выходным или нет.

    final Calendar cal = Calendar.getInstance(new Locale("he_IL"));
    System.out.println("Sunday is the first day of the week in he_IL? " + (Calendar.SUNDAY == cal.getFirstDayOfWeek()));

Выход:

Sunday is the first day of the week in he_IL? true
person drvdijk    schedule 29.07.2013
comment
судя по этому, в en_US воскресенье. Большой недостаток здесь: getFirstDayOfWeek возвращает день, который обычно является первым в печатных календарях, а не первый день рабочей недели. ideone.com/zX4Pcc - person zapl; 29.07.2013

Библиотека Jollyday может быть полезна для расчета праздников, http://jollyday.sourceforge.net/index.html

person Shamim Ahmmed    schedule 29.07.2013