PHP在数据库中存储和比较工作时间

时间:2018-03-27 07:39:22

标签: php laravel php-carbon

我需要存储营业时间并进行比较以查看我应该更新的时间(星期几)并确定它们当前是打开还是关闭。

现在问题在于,对于我的一些场地,时间可能是晚上8点到凌晨2点,这意味着我不能自动认为Carbon::now()会告诉我他们是第二天关闭,因为它会在它运行当天凌晨2点(当前它的前一天)看到它,所以它会告诉我它们已关闭。

我无法在所有关闭时间中添加一天,因为有些时间会在晚上10点,晚上11点或者凌晨12:00之前结束,这会再次给我错误的比较

将这些时间存储在数据库中的最佳方法是什么,以便我可以轻松比较地点是否开放?

这是你需要知道的任何事情

barDays - 表I将这些存储在

我使用Laravel,因此对数据库的所有查询都在Laravel中,但barDays的字段如下:

'day_id', 'bar_id', 'type', 'musicType', 'hours'

小时以X:XX AM/PM - X:XX AM/PM的格式存储,其中X是0-9的整数,这是我知道存储它们最干净的,我不能使用TimeStamps,因为这些是每周价值并且不太可能改变。

我使用Carbon作为我的查询,因为它内置于Laravel

感谢任何帮助人员,过去6天我一直在努力解决这个问题,而且我正处于一个严重的驼峰

  • 扎克

1 个答案:

答案 0 :(得分:0)

我几年前建造的东西略有相似之处。 我的方法是将开放时间从会场桌上分开,因为他们大多数每天有2或3个单独的开放/关闭时间,即:

  • 办公室:上午2点至下午1点,下午2点至下午6点,
  • 酒吧:上午11点至下午2点,晚上8点至23点59分,上午12点至凌晨2点,

在DB上它类似于:

Bars
id | name | type
1  | Bar1 | A
2  | Bar2 | B

bar_days
id | bar_id | day_id | music_type | start    | end
1  | 1      | 1      | Z          |  9.00 PM | 10.00 PM
2  | 1      | 1      | Q          |  2.00 PM | 11.00 PM
3  | 2      | 1      | X          |  8.00 PM | 9.00 PM
4  | 2      | 1      | Y          |  9.00 PM | 10.00 PM
5  | 2      | 1      | Z          | 10.00 PM | 11.59 AM
5  | 2      | 2      | Z          | 12.00 AM | 2.00 AM

如果你只需要检查一个小时来决定是否关闭,它应该已经有效了。

如果您必须检查地点是否在某个时间范围内开放,那么连接变得有点复杂但仍然可行,因为相同的music_type,day_id和bar_id不应超过2个开放时间是连续的(午夜)

要计算比较此表中日期时要添加的天数,您可以使用与此类似的内容:

<?php
$today = 2;
for ($i = 0; $i < 7; $i++){
    $eventDay = ( $i+$today ) % 7;
    $daysToAdd = $eventDay - $today;
    $daysToAdd = $daysToAdd < 0 ? (7+$daysToAdd) : $daysToAdd;
    $format = "event day %d - today %d we should add %d\n";

    echo sprintf($format, $eventDay, $today, $daysToAdd);
}

希望它有所帮助!