如何在Java中比较不同时区的小时数?

我在数据库中有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类是一个容器,自1970年1月1日00:00:00 UTC以来保持若干毫秒。 请注意,类Date不知道任何关于时区的信息。 如果需要使用时区,请使用class级Calendar 。 ( 编辑 2017年1月19日:如果您使用的是Java 8,请在java.time包中使用新的日期和时间API)。

Date不适合持有没有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 Time软件包。 它是一个使用起来更简单的系统,它为您提供了直接的方法来提取数据和时间的所有子组件,甚至只是创建简单的时间对象而不涉及日期。 然后我想象这将是比较2个时区差异并从JodaTime对象中减去差异的问题。