我在数据库中有2个代表公司工作时间的日期对象。
我只需要几个小时,但因为我必须保存日期。它看起来像这样:
Date companyWorkStartHour;
Date companyWorkEndHour;
开始时间:12-12-2001-13:00:00 完成时间:12-12-2001-18:00:00
我有公司和用户的时区。 (我的服务器可能在另一个时区)。
TimeZone userTimeZone;
TimeZone companyTimeZone;
我需要检查用户当前时间(考虑他的时区)是否在公司工作时间内(考虑公司的时区)。
我该怎么办?我在Java日历上挣扎了一个多星期而没有成功!
答案 0 :(得分:6)
java.util.Date
类是自1970年1月1日00:00:00 UTC以来持有若干毫秒的容器。请注意,类Date
不知道任何关于时区的信息。如果您需要使用时区,请使用课程Calendar
。 (编辑 2017年1月19日:如果您使用的是Java 8,请使用包java.time
中的新日期和时间API)。
类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);
答案 1 :(得分:2)
尝试这样的事情:
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 :(得分:0)
嘿我不确定如何使用Java日历这样做,但我强烈建议使用Joda Time软件包。这是一个使用起来更简单的系统,它为您提供了直接的方法来提取数据和时间的所有子组件,甚至只是创建简单的时间对象而不涉及日期。然后我想这将是比较2个时区差异并从JodaTime对象中减去差异的问题。
答案 3 :(得分: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;
}
修改强> 更新了代码以反映Bruno的评论。不应该采取公司工作时间的日期。