business_time, 在营业时间和工作日中,支持时间数学

分享于 

13分钟阅读

GitHub

  繁體 雙語
Support for doing time math in business hours and days
  • 源代码名称:business_time
  • 源代码网址:http://www.github.com/bokmann/business_time
  • business_time源代码文档
  • business_time源代码下载
  • Git URL:
    git://www.github.com/bokmann/business_time.git
    Git Clone代码到本地:
    git clone http://www.github.com/bokmann/business_time
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/bokmann/business_time
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    business_time

    ActiveSupport给了我们一些有用的帮助,所以我们可以做如下事情:

    
    
    
    
    5.days.ago
    
    
    
    

    
    
    
    
    8.hours.from_now
    
    
    
    

    以及帮助者从任何提供的日期或者时间来做。

    我需要这个,但考虑到了营业时间/天数和假日。

    用法

    安装 gem

    
    
    
    
    gem install business_time
    
    
    
    

    打开控制台

    
    
    
    
    # if in irb, add these lines:
    
    
    
    require 'business_time'
    
    
    
    # try these examples, using the current time:
    
    
    
    1.business_hour.from_now
    
    
    4.business_hours.from_now
    
    
    8.business_hours.from_now
    
    
    
    1.business_hour.ago
    
    
    4.business_hours.ago
    
    
    8.business_hours.ago
    
    
    
    1.business_day.from_now
    
    
    4.business_days.from_now
    
    
    8.business_days.from_now
    
    
    
    1.business_day.ago
    
    
    4.business_days.ago
    
    
    8.business_days.ago
    
    
    
    Date.today.workday?
    
    
    Date.parse("2015-12-09").workday?
    
    
    Date.parse("2015-12-12").workday?
    
    
    
    

    我们可以从任何日期或者时间对象来完成。

    
    
    
    
    my_birthday = Date.parse("August 4th, 1969")
    
    
    8.business_days.after(my_birthday)
    
    
    8.business_days.before(my_birthday)
    
    
    
    my_birthday = Time.parse("August 4th, 1969, 8:32 am")
    
    
    8.business_days.after(my_birthday)
    
    
    8.business_days.before(my_birthday)
    
    
    
    

    我们可以调整工作时间的开始和结束时间。

    
    
    
    
    BusinessTime::Config.beginning_of_workday ="8:30 am"
    
    
    BusinessTime::Config.end_of_workday ="5:30 pm"
    
    
    
    

    and add add add add add add add add add add add add add add add add add add add add add。

    
    
    
    
    three_day_weekend = Date.parse("July 5th, 2010")
    
    
    BusinessTime::Config.holidays <<three_day_weekend
    
    
    friday_afternoon = Time.parse("July 2nd, 2010, 4:50 pm")
    
    
    tuesday_morning = 1.business_hour.after(friday_afternoon)
    
    
    
    

    另外,我们可以改变工作周:

    
    
    
    
    # July 9th in 2010 is a Friday.
    
    
    BusinessTime::Config.work_week = [:sun, :mon, :tue, :wed, :thu]
    
    
    thursday_afternoon = Time.parse("July 8th, 2010, 4:50 pm")
    
    
    sunday_morning = 1.business_hour.after(thursday_afternoon)
    
    
    
    

    作为替代,我们还可以更改每个工作日的营业时间:

    
    
    
    
    BusinessTime::Config.work_hours = {
    
    
     :mon=>["9:00","17:00"],
    
    
     :fri=>["9:00","17:00"],
    
    
     :sat=>["10:00","15:00"]
    
    
    }
    
    
    friday = Time.parse("December 24, 2010 15:00")
    
    
    monday = Time.parse("December 27, 2010 11:00")
    
    
    working_hours = friday.business_time_until(monday) # 9.hours
    
    
    
    

    你还可以计算两个日期之间的业务持续时间

    
    
    
    
    friday = Date.parse("December 24, 2010")
    
    
    monday = Date.parse("December 27, 2010")
    
    
    friday.business_days_until(monday) #=> 1
    
    
    
    

    或者你可以计算两个时间对象之间的业务持续时间

    
    
    
    
    ticket_reported = Time.parse("February 3, 2012, 10:40 am")
    
    
    ticket_resolved = Time.parse("February 4, 2012, 10:50 am")
    
    
    ticket_reported.business_time_until(ticket_resolved) #=> 8.hours + 10.minutes
    
    
    
    

    你还可以确定给定时间是否在业务时间内

    
    
    
    
    Time.parse("February 3, 2012, 10:00 am").during_business_hours?
    
    
    
    

    请注意,在涉及周末时,counterintuitively可能并不完全是你所期望的。 请考虑以下示例:

    
    
    
    
    ticket_reported = Time.parse("February 3, 2012, 10:40 am")
    
    
    ticket_resolved = Time.parse("February 4, 2012, 10:40 am")
    
    
    ticket_reported.business_time_until(ticket_resolved) # will equal 6 hours and 20 minutes!
    
    
    
    

    为什么发生这种情况Feb 4 2012是一个星期六。 该时间将滚动到星期一,月6日 2012,9: 00am。 10: 40am星期五和 上午9点 星期一之间的业务时间为 6小时和 20分钟。 通过快速检查代码,它看起来应该是 8小时。

    或者你可以在两个日期之间计算业务日期

    
    
    
    
    monday = Date.parse("December 20, 2010")
    
    
    wednesday = Date.parse("December 22, 2010")
    
    
    monday.business_dates_until(wednesday) #=> [Mon, 20 Dec 2010, Tue, 21 Dec 2010]
    
    
    
    

    你可以在一个时间后获得第一个工作日,或者如果它是工作日就返回自己

    
    
    
    
    saturday = Time.parse("Sat Aug 9, 18:00:00, 2014")
    
    
    monday = Time.parse("Mon Aug 11, 18:00:00, 2014")
    
    
    Time.first_business_day(saturday) #=>"Mon Aug 11, 18:00:00, 2014"
    
    
    Time.first_business_day(monday) #=>"Mon Aug 11, 18:00:00, 2014"
    
    
    
    # similar to Time#first_business_day Time#previous_business_day only cares about
    
    
    # workdays:
    
    
    saturday = Time.parse("Sat Aug 9, 18:00:00, 2014")
    
    
    monday = Time.parse("Mon Aug 11, 18:00:00, 2014")
    
    
    Time.previous_business_day(saturday) #=>"Fri Aug 8, 18:00:00, 2014"
    
    
    Time.previous_business_day(monday) #=>"Mon Aug 11, 18:00:00, 2014"
    
    
    
    

    Rails 发生器

    
    
    
    
    rails generate business_time:config
    
    
    
    

    生成器将添加一个./config/business_time.yml 和./config/initializers/business_time.rb 文件,这将导致业务日。业务日结束和你的假日加载。

    你可能想从一个数据库表加载假日,但是你需要注意初始化器如何工作- 你要确保初始化器在mongrels或者乘客instances正确的数据时设置正确的数据。

    支持的时区支持

    这里 gem 努力成为时区不可识别的。 由于在生成时间类中处理时间,以及timeWithZone类中的某些复杂的( Bug),这是比预期更困难的。 但这是个想法:

    • 当你配置 gem 以像 9: 00am一样配置时,这是不可以知的时区。

    • 当处理时间或者TimeWithZone类时,时区将保留,并且业务日的开始和结束时间将在该时区中引用。

    如果你在东部时区,但是在UTC时间内执行所有操作,这会导致一些奇怪的效果。 工作日将显示在 9: 00和 5: 日期开始和结束。 如果这对你来说是令人困惑的,我几乎可以保证你在它的他地方与时间相同。 时区相对日期处理每次查看时变得越来越复杂,在它开始看起来很简单之前需要很长时间。

    与假日的集成

    Chris明智地写了一篇关于如何使用 business_time gem 与假日插件的文章。 它归结为:

    
    
    
    
    Holidays.between(Date.civil(2013, 1, 1), 2.years.from_now, :ca_on, :observed).map do |holiday|
    
    
     BusinessTime::Config.holidays <<holiday[:date]
    
    
     # Implement long weekends if they apply to the region, eg:
    
    
     # BusinessTime::Config.holidays <<holiday[:date].next_week if!holiday[:date].weekday?
    
    
    end
    
    
    
    

    贡献者

    
    
    
    
    * David Bock http://github.com/bokmann
    
    
    * Enrico Bianco http://github.com/enricob
    
    
    * Arild Shirazi http://github.com/ashirazi
    
    
    * Piotr Jakubowski http://github.com/piotrj
    
    
    * Glenn Vanderburg http://github.com/glv
    
    
    * Michael Grosser http://github.com/grosser
    
    
    * Michael Curtis http://github.com/mcurtis
    
    
    * Brian Ewins http://github.com/bazzargh
    
    
    
    (Special thanks for Arild on the complexities of dealing with TimeWithZone)
    
    
    
    

    在补丁/拉请求上的注释

    • fork 项目。

    • 使你的功能添加或者 Bug 修复。

    • 为它添加测试。这很重要,所以我不会在以后的版本中无意中。

    • 提交,不要与 rakefile,版本或者历史混淆。 ( 如果你想有自己的版本,那么在提交过程中,我可以忽略它,我可以忽略。)

    • 向我发送请求请求。 主题分支的加分。

    待办事项

    • Arild指出,关于beginning_of_workday和end_of工作日时间的一些逻辑不一致性在工作日内实际上没有被考虑。 我想确保它们正好工作,如果包括 beginning_of_workday,并且不包括 end_of_workday,就像 ruby 中的'。'范围运算符一样。

    不做

    • 我在前面的java程序员生命构建框架中花费了太多的时间,从而为开发人员提供了'表面积'的最终灵活性。 再一次- 我将尽快限制功能到 80%,这样一些东西就可以使用了,让人们 fork。

    • 虽然有请求添加'业务分钟'和'业务秒'到这个 gem,但是我不会在这样的情况下招聘请求请求。 如果你觉得有用的话。 大多数用户不会,也不需要行李。

    关于稳定性和更改的注释

    有时候人们问我为什么这个 gem 不经常发布。 我在友好讨论中最好讨论了我的观点,但我会在这里尝试一些。

    首先,大部分原因是我使用这个 gem的项目对于它的当前功能很高兴。 我发布它的是'适用于目的',因这里我在这个 gem 上做的维护是对社区的礼物。

    第二,从 ~1.3 百万下载( 根据 rubygems.org),的实际情况'问题中,这个问题已经最小了。 我认为 opened'下班时间'是我在open工作中not的问题,如果只是意见差异,我想解释这些选择。 即使如此,我也乐意接受将这种意见差异作为配置选项解决的请求请求。 不要让我为你做你的工作。 我已经给了你你需要的90%。

    第三,业务时间 gem 是与业务相关的。 许多企业不迅速移动。 我的政府客户移动得更慢。 稳定性在这些环境中受到青睐。

    第四,新功能可以。 对于添加他们的人来说,可以是任务关键,但是现代包装过程可以使用它们的版本。 它们的更改不会破坏你的代码。

    我对 gem的工作感到自豪,稳定性是其中的一个重要部分。 这个 gem 已经超过了许多试图做同样事情的人。 当 ruby 成为下一个COBOL时,我希望它是在这里的chugging。

    版权

    版权所有 © 2010 -2017 bokmann。 详细信息请参阅许可证。


    SUP  时间  MAT  总线  数学  DAYS