Борьба с тем, как сравнить часы с различными часовыми поясами в 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.