【问题标题】:Comparing times only, without dates?只比较时间,不比较日期?
【发布时间】:2012-12-29 01:08:38
【问题描述】:

我需要编写一个方法来检查Time.now 是否在商店的营业时间和关闭时间之间。

营业时间和关闭时间保存为 Time 对象,但我无法正确比较它,因为商店将营业时间保存在 2012/2/2,因此营业时间类似于:

2012-02-02 02:30:00 UTC

Time.now 将是:

07:23 +0200

如何只比较时间部分而不比较日期部分?

【问题讨论】:

  • 您先尝试从日期中提取时间如何? stackoverflow.com/a/280464/1004274
  • 有任何答案有帮助吗?
  • 我不相信迄今为止(2018 年 6 月 18 日)的任何答案都是正确的,因为他们没有考虑商店在午夜营业的情况。请参阅this SO 问题。
  • @CarySwoveland 在这种情况下时间是 0,还有什么?
  • @МалъСкрылевъ,我的记忆力在最好的时候不是很好,但我不记得这个两年前的问题了。要回答您的问题,我必须熟悉问题和所有答案,这将花费太多时间。我只能说,我的评论可能与 24 小时制开放时间之前的关闭时间有关。比如20:00开盘,04:00(次日)收盘。

标签: ruby-on-rails ruby


【解决方案1】:

您可以比较不带日期部分的Time,例如,如下:

time1.utc.strftime( "%H%M%S%N" ) <= time2.utc.strftime( "%H%M%S%N" )

【讨论】:

  • 如果开放时间是早上 8 点,关闭时间是早上 1 点。有用吗?
  • @Vishal 但您希望代码如何工作?
  • @МалъСкрылевъ 我使用 postgres 作为数据库。我有两个字段 open_at,close_at ,数据类型是时间。就我而言,商店的营业时间是早上 8 点,关门时间是早上 1:00,这意味着商店将在明天凌晨 1 点关门。所以我的查询失败,因为 ,open_at &lt;= close_at 变为假。你能帮我解决这个问题吗?
  • @Vishal 如果 ruby​​ 中的字段类型是字符串,则无法比较它们,ruby 中的变量类必须只有 Time 或 DateTime 才能进行那种比较跨度>
  • 是的,它是时间课程。它以这种格式存储“2000-01-01 08:00:00”
【解决方案2】:

有一个不错的库 https://github.com/bokmann/business_time 可以为您做这些,甚至更多。

BusinessTime::Config.with(beginning_of_workday: "8:30 am", end_of_workday: "5:30 pm") do
  Time.now.during_business_hours?
end

它将为您做更多事情,例如将时间滚动到下一个或上一个开放时间,计算两个时间戳之间的营业时间等。

【讨论】:

    【解决方案3】:

    您可以将时间分解为小时、分钟和秒。

    Time Class中所述:

    t = Time.now
    hour = t.hour
    minute = t.min
    seconds = t.sec
    

    由于您只需要比较是否在 2 小时内,您可以检查如下。

    if hour > openingHour and hour < closingHour
    

    【讨论】:

    • OP如何比较这三个值?
    • 是的,还有更多:想象一下旧金山的一家商店下午 5 点关门。太平洋,即 00:00:00 UTC。
    【解决方案4】:

    您可以只比较没有日期部分的 Rails 中的时间,例如:--- 这里post_review 是表格,我们只得到post_review 的这些记录,它们是created_at 在任何日期的上午10 点---下午5 点之间

    post_review.where("(created_at::time >= :start_time) AND (created_at::time <= :end_time)", 
        start_time: Time.parse("10 am").strftime("%r"),
        end_time:   Time.parse("5 pm").strftime("%r")
     )
    

    【讨论】:

      【解决方案5】:

      尝试将时间转换为数字并去掉天数。由于时间表示为自 UNIX 纪元以来的秒数,小数点是秒的小数部分,因此您可以将此数字转换为天数,小数部分是一天的小数部分。

      基于日期的数字 = Ruby 时间数字 / 60 / 60 / 24

      然后,您可以使用取模运算符去除日期部分,这样您剩下的就是比较时间了。所以你想要这样的东西:

      def is_open?(time)
        open_h=Time.parse('2012-02-02 02:30:00 UTC')
        close_h=Time.parse('2012-02-02 10:00:00 UTC')
        (((time.to_r / 60 / 60 / 24) % 1) >= ((open_h.to_r / 60 / 60 / 24) % 1)) && (((time.to_r / 60 / 60 / 24) % 1) <= ((close_h.to_r / 60 / 60 / 24) % 1))
      end
      
      is_open? (Time.parse('2013-01-01 09:58:00 UTC'))
      => true
      is_open? (Time.parse('2013-01-01 12:58:00 UTC'))
      => false
      

      【讨论】:

        【解决方案6】:

        您可以比较它们与公共参考(例如午夜)的偏移量,而不是尝试直接比较时间点。您可能需要确保所有时间都使用相同的时区,具体取决于您的用例。

        在 Rails 中,这可以通过 #seconds_since_midnight 等助手之一轻松完成:

        #given
        opening_hour = DateTime.new(2012,2,2,2,30,0)
        
        #compare
        now = DateTime.now.in_time_zone('UTC')
        opening_hour_since_midnight = opening_hour.seconds_since_midnight
        now_since_midnight = now.seconds_since_midnight
        p 'shop opened' if now_since_midnight > opening_hour_since_midnight
        

        【讨论】:

          【解决方案7】:
          close_or_open_time_object.to_a.first(3).reverse <=> Time.now.to_a.first(3).reverse
          

          【讨论】:

          • 那行不通。尝试跨越一天边界的时间来查看。
          【解决方案8】:

          这仅适用于 24 小时格式的时间,并且开始时间小于结束时间。

          Time start = DateUtil.convertStringToTime(Object.getStartTime());
          Time mid = DateUtil.convertStringToTime(time);
          Time end = DateUtil.convertStringToTime(Object.getEndTime());
          
              if(mid.getHours()>start.getHours() && mid.getHours()< end.getHours())
              {
                  flag=true;
              }
              else if(mid.getHours() == start.getHours() && mid.getHours() < end.getHours())
              {
                  if(mid.getMinutes() > start.getMinutes())
                  {               
                      flag=true;              
                  }
                  else if(mid.getMinutes() == start.getMinutes())
                  {               
                      if(mid.getSeconds() >= start.getSeconds())
                      {
                          flag=true;
                      }
                  }
              }
              else if(mid.getHours() > start.getHours() && mid.getHours() == end.getHours())
              {
                  if(mid.getMinutes() < end.getMinutes())
                  {
                      flag=true;
                  }
                  else if(mid.getMinutes() == end.getMinutes())
                  {
                      if(mid.getSeconds() <= end.getSeconds())
                      {
                          flag=true;
                      }
                  }
              }
              else if(mid.getHours() == start.getHours() && mid.getHours() == end.getHours())
              {
                  if(mid.getMinutes() > start.getMinutes() && mid.getMinutes() < end.getMinutes())
                  {
                      flag=true;
                  }           
                  else if(mid.getMinutes() == start.getMinutes() && mid.getMinutes() < end.getMinutes())
                  {
                      if(mid.getSeconds() > start.getSeconds())
                      {
                          flag=true;
                      }
                  }
                  else if(mid.getMinutes() > start.getMinutes() && mid.getMinutes() == end.getMinutes())
                  {
                      if(mid.getSeconds() < end.getSeconds())
                      {
                          flag=true;
                      }
                  }
                  else if(mid.getMinutes() == start.getMinutes() && mid.getMinutes() == end.getMinutes())
                  {
                      if(mid.getSeconds() > start.getSeconds() && mid.getSeconds() < end.getSeconds())
                      {
                          flag=true;
                      }
                  }
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-03-08
            • 1970-01-01
            • 1970-01-01
            • 2011-07-29
            • 2011-04-28
            • 2021-08-17
            相关资源
            最近更新 更多