Борьба с тем, как сравнить часы с различными часовыми поясами в Java?

у меня есть 2 объекта даты в базе данных, которые представляют рабочие часы компании.

мне нужны только часы, но так как я должен сохранить дату. он выглядит так:

Date companyWorkStartHour; 
Date companyWorkEndHour;

часы работы: 12-12-2001-13: 00: 00 часы работы: 12-12-2001-18:00: 00

у меня есть пояс компании и пользователя. (мой сервер может находиться в другом часовом поясе).

TimeZone userTimeZone;
TimeZone companyTimeZone;

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

Как я могу это сделать? Я борюсь больше недели с календарем Java и без успеха!

4 ответов


The java.util.Date class-это контейнер, который содержит несколько миллисекунд с 1 января 1970 года, 00:00: 00 UTC. Обратите внимание, что класс Date ничего не знает о часовых поясах. Использовать класс Calendar если вам нужно работать с часовых поясов. (редактировать 19-Jan-2017: если вы используете Java 8, используйте новый API даты и времени в пакете java.time).

класс Date - это не совсем подходит для проведения час (например 13:00 или 18:00) без даты. Он просто не создан для поэтому, если вы попытаетесь использовать его таким образом, как вы, кажется, делаете, вы столкнетесь с рядом проблем, и ваше решение не будет элегантным.

если вы забыли об использовании класса Date чтобы сохранить рабочие часы и просто использовать целые числа, это будет намного проще:

Date userDate = ...;
TimeZone userTimeZone = ...;

int companyWorkStartHour = 13;
int companyWorkEndHour = 18;

Calendar cal = Calendar.getInstance();
cal.setTime(userDate);
cal.setTimeZone(userTimeZone);

int hour = cal.get(Calendar.HOUR_OF_DAY);
boolean withinCompanyHours = (hour >= companyWorkStartHour && hour < companyWorkEndHour);

если вы также хотите учитывать минуты (а не только часы), вы можете сделать что-то вроде этого:

int companyWorkStart = 1300;
int companyWorkEnd = 1830;

int time = cal.get(Calendar.HOUR_OF_DAY) * 100 + cal.get(Calendar.MINUTE);
boolean withinCompanyHours = (time >= companyWorkStart && time < companyWorkEnd);

попробуйте что-то вроде этого:

Calendar companyWorkStart = new GregorianCalendar(companyTimeZone);
companyWorkStart.setTime(companyWorkStartHour);

Calendar companyWorkEnd = new GregorianCalendar(companyTimeZone);
companyWorkEnd.setTime(companyWorkEndHour);

Calendar user = new GregorianCalendar(userTimeZone);
user.setTime(userTime);

if(user.compareTo(companyWorkStart)>=0 && user.compareTo(companyWorkEnd)<=0) {
  ...
}

Я не пробовал библиотеку Joda. Этот код должен работать.

public boolean checkUserTimeZoneOverLaps(TimeZone companyTimeZone,
        TimeZone userTimeZone, Date companyWorkStartHour,
        Date companyWorkEndHour, Date userCurrentDate) {

    Calendar userCurrentTime = Calendar.getInstance(userTimeZone);
    userCurrentTime.setTime(userCurrentDate);
    int year = userCurrentTime.get(Calendar.YEAR);
    int month = userCurrentTime.get(Calendar.MONTH);
    int day = userCurrentTime.get(Calendar.DAY_OF_MONTH);

    Calendar startTime = Calendar.getInstance(companyTimeZone);
    startTime.setTime(companyWorkStartHour);
    startTime.set(Calendar.YEAR, year);
    startTime.set(Calendar.MONTH, month);
    startTime.set(Calendar.DAY_OF_MONTH, day);

    Calendar endTime = Calendar.getInstance(companyTimeZone);
    endTime.setTime(companyWorkEndHour);
    endTime.set(Calendar.YEAR, year);
    endTime.set(Calendar.MONTH, month);
    endTime.set(Calendar.DAY_OF_MONTH, day);

    if (userCurrentTime.after(startTime) && userCurrentTime.before(endTime)) {
        return true;
    }
    return false;
}

редактировать Обновил код, чтобы отразить комментарии Бруно. Не следует брать даты рабочих графиков компании.


Эй, я не уверен, как вы это сделаете, используя календарь Java, но я бы настоятельно рекомендовал использовать пакет времени Joda. Это гораздо более простая система, и она дает вам прямые методы для извлечения всех подкомпонентов данных и времени и даже просто для создания простых объектов времени без даты. Тогда я предполагаю, что это будет вопрос сравнения 2 разностей часовых поясов и вычитания разницы из объекта JodaTime.