【问题标题】:Convert hour range to a bitstring将小时范围转换为位串
【发布时间】:2023-04-09 13:04:02
【问题描述】:

我想节省公司的营业时间,我正在考虑为此使用位串。 想象一下公司 A 在星期一上午 8 点到 12 点(中午)和下午 1 点到下午 5 点开放将作为第 0 天(星期一)的位串

0000 0000 1111 0111 1000 0000

这使得将其保存在数据库中并检索它变得非常容易,而无需进行多次连接等。

然而,将用户输入解析到此位串确实变得复杂。 我想给用户 2 个选择列表来选择一个范围,他可以在其中选择开放时间和关闭时间(这里是上午 8 点到中午)。 然后可以复制这 2 个选择列表以创建第二个范围(此处为下午 1 点至下午 5 点)。

如果我可以将一个时间范围解析为一个位串(早上 8 点到中午),那么这些可以很容易地总结为一天的位串。

这就是我的问题。将时间范围解析为位串的最简单/最干净的方法是什么。

非常感谢任何帮助。

【问题讨论】:

  • 为什么不直接保存为 DATETIME 类型?
  • 如何将时间间隔保存为 DATETIME?示例:从 11:00->12:00 和 14:00->18:00
  • 你不能在一个条目中做到这一点,但你可以使用两个并且一切都很好。
  • 是的,但是当有 3 个间隔时呢?还是四个?我想要一个适用于所有情况的解决方案。这些位串就是这样做的
  • 然后给它们编号。例如。列:DayTimeOrder。然后你可以选择一整天,按订单栏排序

标签: php bit-manipulation


【解决方案1】:

您不会将位串存储为字符串,而是将其存储为整数。然后你对它进行按位比较,所以如果你把一天分成 48 个部分,这意味着你需要使用一个 64 位整数,其中最后 16 位根本未使用,或者可以用来表示天数周。

位如下

/** times **/
01 00:00 02 00:30 03 01:00 04 01:30 05 02:00 06 02:30 07 03:00 08 03:30
09 04:00 10 04:30 11 05:00 12 05:30 13 06:00 14 06:30 15 07:00 16 07:30
17 08:00 18 08:30 19 09:00 20 09:30 21 10:00 22 10:30 23 11:00 24 11:30
25 12:00 26 12:30 27 13:00 28 13:30 29 14:00 30 14:30 31 15:00 32 15:30
33 16:00 34 16:30 35 17:00 36 17:30 37 18:00 38 18:30 39 19:00 40 19:30
41 20:00 42 20:30 43 21:00 44 21:30 45 22:00 46 22:30 47 23:00 48 23:30

49-57 unused

/** days of week **/
58 Sunday 59 Monday 60 Tuesday 61 Wednesday 62 Thursday 63 Friday 64 Saturday

好的,现在你如何使用它?

如果您想说一家企业在周日营业 - 周六上午 7 点到 8 点和上午 9 点到 10 点,您可以加起来(使用按位 OR 运算符)

把上面所有的“位”和它们放在一起,这可以通过 2 ^ (bit-1) 来完成

$hours = 2^14 | 2^15 | 2^17 | 2^18 | 2^57 | 2^58 | 2^59 | 2^60 | 2^61 | 2^62 | 2^63;

然后进行查询,您只需按位与。

/** this is checking to see if it's open at 7am and 9am on Thursday **/
$query = (2^14 & 2^17 & 2^61);

/** this will match only if all conditions are true **/
$isOpen = $query & $hours === $query; 

/** this will match if some or all conditions are true **/
$isOpen = $query & $hours > 0; 

希望这可以帮助您并让您走上正确的道路。

【讨论】:

  • 谢谢,这是有道理的!这不会是溢出的问题吗?整数不会走那么远
  • 如果您使用的是 32 位系统,那么是的,这是行不通的,但是现代系统是 64 位和 64 位操作系统,所以应该没有问题。
  • 在 html 中您可以简单地放入 将 2 解析为正确的整数就像 2^2 = 4 = 000 一样简单。 .0100 很棒的东西...在您看来,这似乎是一个好方法吗?就像你展示的那样,很容易检查一家公司是否在某个时间营业
  • 这绝对是一种处理小时数的有趣方式,我通常在一周中的几天使用按位......但由于它的限制性(即只有 30 分钟增量),从不使用时间。但是,如果您对 30 分钟的块没问题,那么它肯定会工作得很好。
猜你喜欢
  • 2010-10-15
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-24
相关资源
最近更新 更多