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

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

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

Date companyWorkStartHour; 
Date companyWorkEndHour;

запустите часы: 12-12-2001-13:00:00 заканчивают часы: 12-12-2001-18:00:00

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

TimeZone userTimeZone;
TimeZone companyTimeZone;

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

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

7
задан Joachim Sauer 26 May 2010 в 10:09
поделиться

4 ответа

Класс java.util.Date - это контейнер, в котором хранится число миллисекунд с 1 января 1970 года, 00:00:00 UTC. Обратите внимание, что класс Date не знает ничего о часовых поясах. Используйте класс Calendar, если вам нужно работать с часовыми поясами. (edit 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);
6
ответ дан 7 December 2019 в 05:18
поделиться

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

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) {
  ...
}
2
ответ дан 7 December 2019 в 05:18
поделиться

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

0
ответ дан 7 December 2019 в 05:18
поделиться

Я не пробовал использовать библиотеку 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;
}

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

0
ответ дан 7 December 2019 в 05:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: