当前位置: 首页 > 面试题库 >

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

顾斌
2023-03-14
问题内容

我在数据库中有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月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);


 类似资料:
  • 我试图在elasticsearch查询中使用无痛语言来比较小时数。我想问一下这样的问题: 但我有错误: 无法应用 [ 嵌套文档的方案是: (这些值的格式为“2:00”或“18:00”)。 我尝试过使用< code >。日期 或<代码>。value,但它不起作用,因为我的变量只包含小时而不是日期时间。 有人能帮帮我吗:)

  • 问题内容: 例如,假设我有 我如何确定现在是否在这个时间之前?我努力了 但是日期为1970年,因此比较失败 问题答案: 您总是可以做相反的事情:

  • 问题内容: 我看到可以进行日期比较,也可以进行日期比较,但是我一直在努力寻找如何检查当前时间()是否早于指定时间(例如上午8点),还是晚于指定时间(例如上午8点),而不管日期如何。 问题答案: 您 无法 将特定时间点(例如“现在”)与一个固定的重复发生的事件(每天早上8点发生)进行比较。 您可以检查是否现在之前或之后, 今天 上午8点:

  • 问题内容: 同时执行: 我目前正在学习do-while vs while,并且想用while重写上面的java片段(已经声明和初始化)。以下重写的代码是否正确: 而: 干杯 问题答案: 之间的区别和是 当 比较完成。使用,您将在最后进行比较,因此至少要进行一次迭代。 您的示例的等效代码 等效于: 一般理解 甲环是一个 出口控制的循环 ,这意味着它离开末。甲环是一个 条目控制的循环 ,这意味着该条件

  • 本文向大家介绍我们如何在Java中使字符串比较不区分大小写?,包括了我们如何在Java中使字符串比较不区分大小写?的使用技巧和注意事项,需要的朋友参考一下 我们可以通过各种方式比较Java中的字符串- 使用方法-的的compareTo()方法两个字符串按字典顺序进行比较。比较是基于字符串中每个字符的Unicode值。在字典上比较此String对象表示的字符序列与自变量字符串表示的字符序列。 示例

  • 问题内容: 我有时间,必须由用户以这种格式输入。 但是,我想比较上午10点到下午6点之间的时间(例如11:22)?但是,我该如何比较呢? 问题答案: Java还没有一个好的内置类(它有一个用于JDBC查询的类,但这不是你想要的)。 一种选择是使用JodaTime API和它的本地时间类。 只使用内置的Java API,就只能使用java.util.Date。你可以使用SimpleDateForma