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

时间:2010-05-26 10:08:38

标签: java date calendar timezone

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

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

Date companyWorkStartHour; 
Date companyWorkEndHour;

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

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

TimeZone userTimeZone;
TimeZone companyTimeZone;

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

我该怎么办?我在Java日历上挣扎了一个多星期而没有成功!

4 个答案:

答案 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的评论。不应该采取公司工作时间的日期。