java - 为如何在 Java 中比较不同时区的时间而苦恼?

标签 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 日历上苦苦挣扎了一个多星期,但没有成功!

最佳答案

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);

关于java - 为如何在 Java 中比较不同时区的时间而苦恼?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2911924/

相关文章:

java - 循环和封装的使用

Excel 返回一个日期范围的多个值,其中单个日期项相加

java - 运行 Java 工件时显示 Unicode 字符出现问题,但在 IntelliJ IDEA 中运行时一切正常

Java 日期解析器在时区 UT 和 UTC 上失败

java - 为日期格式声明字符串常量,而不是显式地编写字符串值

php - 如何使用 1and1 数据库和 Dreamweaver 设置 PHP 发布日期?

java - 如何设置<aui :input> tag's calendar date and locale in Liferay 6. 2 CE GA2?

javascript - Jquery - 选择星期的日历小部件

java - 未调用 Onsavedinstancestate 时写入 outState

java - 通过浏览器传送 csv 文件时出错