小编典典

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

java

我在数据库中有2个日期对象,它们代表公司的工作时间。

我只需要几个小时,但是因为我必须保存日期。它看起来像这样:

Date companyWorkStartHour; 
Date companyWorkEndHour;

开始时间:12-12-2001-13:00:00完成时间:12-12-2001-18:00:00

我有公司和用户所在的时区。(我的服务器可能在另一个时区)。

TimeZone userTimeZone;
TimeZone companyTimeZone;

我需要检查用户的当前时间(考虑他所在的时区)是否在公司工作时间之内(考虑公司所在的时区)。

我该怎么做?我用Java日历奋斗了一个多星期,但没有成功!


阅读 222

收藏
2020-11-01

共1个答案

小编典典

java.util.Date类是持有1970年1月00:00:00,UTC以来毫秒数的容器。请注意,该类Date对时区一无所知。Calendar如果您需要使用时区,请使用class
。( 编辑 2017年1月19日:如果您使用的是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);
2020-11-01