У меня есть 2 объекта даты в базе данных, которые представляют рабочее время компании.
Мне только требуются часы, но так как я должен сохранить дату. это появляется как это:
Date companyWorkStartHour;
Date companyWorkEndHour;
запустите часы: 12-12-2001-13:00:00 заканчивают часы: 12-12-2001-18:00:00
У меня есть часовой пояс компании и пользователя. (мой сервер может быть в другом часовом поясе).
TimeZone userTimeZone;
TimeZone companyTimeZone;
Я должен проверить, ли текущее время пользователя (рассматривающий его часовой пояс) в течение рабочего времени компании (рассматривающий часовой пояс компании).
Как я могу сделать это? Я борюсь больше недели с календарем Java и без успеха!
Класс 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);
Попробуйте что-то вроде этого:
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) {
...
}
Эй, я не уверен, как вы сделаете это, используя календарь Java, но я бы настоятельно рекомендовал использовать пакет Joda Time. Это гораздо более простая в использовании система, и она дает вам прямые методы для извлечения всех субкомпонентов данных и времени и даже просто для создания простых временных объектов без участия даты. Тогда, я думаю, это будет просто сравнение разницы между двумя часовыми поясами и вычитание разницы из объекта JodaTime.
Я не пробовал использовать библиотеку 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 Обновил код, чтобы отразить комментарии Бруно. Не следует брать даты рабочего тайминга компании.