Ambition 联合创始人兼首席技术官 Wes Kendall 解释了 Ambition 如何在 Ambition 中设置游戏以在不同时区工作,从而让新加坡的办公室与俄亥俄州克利夫兰的办公室竞争。
196体育刚刚开源了Fleming ,这是一个用于跨时区处理日期时间的 Python 库。希望你喜欢!
196体育在 Ambition 中用 Python 进行了大量的日期时间操作,并且196体育都根据用户的时区进行操作。将时间分块到更大的单元中,汇总地理上分开的成员的团队指标,以及安排比赛和触发器是196体育发现难以解决的一些问题的几个例子。
在 Python 中根据时区操作日期时间对象可能很棘手。幸运的是, pytz解决了从一个时区转换到另一个时区的基本情况。但是,在执行其他类型的日期时间操作时仍然会出现一些常见的陷阱,例如跨夏令时边界的日期时间算术。想要一个例子吗?这是一个直接来自 Ambition 的。
在 Ambition 中安排每周比赛 - 196体育的约会时间问题
如果您还不知道,Ambition 会按照类似足球的时间表为球队安排每周比赛。196体育第一个客户的第一季从 10 月 7 日开始,到 12 月 20 日结束。他们将游戏配置为在东部标准时间 (EST) 每周一的午夜开始,并在每周周五的下午 5 点结束。
196体育的第一个原始代码版本的结构是按如下方式安排他们的游戏:
# 获取美国东部标准时间周一午夜的 UTC 赛季开始时间。 season_start = datetime(2013, 10, 7, 4) # schedule a 10-week season for week_num in range(10): # 每场比赛在星期一午夜开始 EST game_start = season_start + timedelta(weeks=week_num) # 制作游戏美国东部时间周五下午 5 点结束 game_end_ = game_start + timedelta(days=4, hours=17) # 创建游戏 Game.objects.create(...)
每周的游戏开始和结束时间如下所示:
第 1 周:2013-10-07 04:00:00 - 2013-10-11 21:00:00 第 2 周:2013-10-14 04:00:00 - 2013-10-18 21:00:00 第 3 周: 2013-10-21 04:00:00 - 2013-10-25 21:00:00 第 4 周:2013-10-28 04:00:00 - 2013-11-01 21:00:00 第 5 周:2013 年-11-04 04:00:00 - 2013-11-08 21:00:00 第 6 周:2013-11-11 04:00:00 - 2013-11-15 21:00:00 第 7 周:2013-11 -18 04:00:00 - 2013-11-22 21:00:00 第 8 周:2013-11-25 04:00:00 - 2013-11-29 21:00:00 第 9 周:2013-12-02 04:00:00 - 2013-12-06 21:00:00 第 10 周:2013-12-09 04:00:00 - 2013-12-13 21:00:00
在 Python 中处理过 datetime 算法的程序员可能已经在摸脸了,但即使是经验丰富的程序员有时也无法识别刚刚发生的错误。
在196体育为第一个客户安排了第一个赛季后不久,196体育注意到比赛开始和结束的时间比以前早了一个小时。然后196体育意识到夏令时 (DST) 在 11 月 3 日停止,就在这个季节的中间。如果将上述 11 月 3 日之后的日期转换为美国东部标准时间,您会发现它们都比原定时间早了一个小时。
对196体育来说很明显,196体育在 UTC 时间中进行日期时间算术的第一种方法有点愚蠢,但你会在生活中学习。196体育选择在季节的时区进行算术运算(即使用具有时区信息的“感知”日期时间对象而不是“天真的”对象)。
新代码看起来像这样:
est = pytz.timezone('US/Eastern') # 获取美国东部标准时间星期一午夜的当地季节开始时间。 season_start = est.normalize( datetime(2013, 10, 7, 4, tzinfo=pytz.utc)) # 为 week_num in range(10) 安排一个为期 10 周的赛季: # 每场比赛在周一午夜开始 EST game_start = season_start + timedelta(weeks=week_num) # 让游戏在东部时间周五下午 5 点结束 game_end = game_start + timedelta(days=4, hours=17) # 调用 normalize 以考虑 DST 转换 game_start = est.normalize(game_start) game_end = est .normalize(game_end) # 创建游戏 Game.objects.create(...)
在值上使用此代码时,196体育最终得到以下结果:
第一周:2013-10-07 00:00:00-04:00 - 2013-10-11 17:00:00-04:00 第二周:2013-10-14 00:00:00-04:00 - 2013-10-18 17:00:00-04:00 第 3 周:2013-10-21 00:00:00-04:00 - 2013-10-25 17:00:00-04:00 第 4 周:2013 年-10-28 00:00:00-04:00 - 2013-11-01 17:00:00-04:00 第 5 周:2013-11-03 23:00:00-05:00 - 2013-11- 08 16:00:00-05:00 第 6 周:2013-11-10 23:00:00-05:00 - 2013-11-15 16:00:00-05:00 第 7 周:2013-11-17 23:00:00-05:00 - 2013-11-22 16:00:00-05:00 第 8 周:2013-11-24 23:00:00-05:00 - 2013-11-29 16:00 :00-05:00 第 9 周:2013-12-01 23:00:00-05:00 - 2013-12-06 16:00:00-05:00 第 10 周:2013-12-08 23:00: 00-05:00 - 2013-12-13 16:00:00-05:00
您可以从这些值中注意到,当从 DST 转换出来时(即从 -04:00 到 -05:00),时区会正确更改;但是,时间值本身在过渡后仍然落后一小时。
使用196体育的开源日期时间库 Fleming 解决日期时间危机
Pytz 和常规的 Python timedelta 对象不应对196体育的问题负责。事实上,他们正在按照记录的方式进行操作。 Ambition 只需要它以一种对196体育的用户更有意义的方式工作。例如,即使196体育的 EST 用户在 11 月 23 日已经过去 25 小时,196体育仍然希望196体育的日期时间算法像过去 24 小时一样运行。
为了处理日期时间算法(和其他日期时间操作函数),196体育实现了 Fleming。 Fleming 是一个开源 python 库,可在此处免费获得。安装 Fleming 非常简单
pip 安装弗莱明
Fleming 允许您使用原始或有意识的日期时间,还允许您使用相对于其他时区的日期时间。例如,考虑196体育之前的调度问题。 Fleming 提供了一个“intervals”函数,允许用户给出开始时间(datetime 对象)、间隔(timedelta 对象)和间隔计数。它返回一个日期时间对象的生成器,从 start_time 开始并持续计数间隔。
从日期时间导入弗莱明 导入日期时间,timedelta intervals = fleming.intervals( datetime(2013, 10, 7, 4), timedelta(weeks=1), count=10) for i in intervals: print i 2013-10-07 04 : 00:00+00:00 2013-10-14 04:00:00+00:00 2013-10-21 04:00:00+00:00 2013-10-28 04:00:00+00:00 2013 -11-04 04:00:00+00:00 2013-11-11 04:00:00+00:00 2013-11-18 04:00:00+00:00 2013-11-25 04:00: 00+00:00 2013-12-02 04:00:00+00:00 2013-12-09 04:00:00+00:00
你说什么?它没有处理 DST 转换?那是因为196体育使用了一个简单的 UTC 时间作为196体育的开始时间。让196体育用已知的 EST 开始时间来尝试一下。
import pytz est_start = pytz.timezone('US/Eastern').normalize( datetime(2013, 10, 7, 4), tzinfo=pytz.utc) intervals = fleming.intervals( est_start, timedelta(weeks=1), 计数=10) for i in intervals: print i 2013-10-07 00:00:00-04:00 2013-10-14 00:00:00-04:00 2013-10-21 00:00:00-04 :00 2013-10-28 00:00:00-04:00 2013-11-04 00:00:00-05:00 2013-11-11 00:00:00-05:00 2013-11-18 00 :00:00-05:00 2013-11-25 00:00:00-05:00 2013-12-02 00:00:00-05:00 2013-12-09 00:00:00-05:00
瞧,即使 DST 停止了,时间仍然保持在 EST 的午夜。
intervals 函数还允许您提供一个简单的 UTC 开始时间,并在返回 UTC 时间时相对于另一个时区执行间隔。这是通过使用 within_tz 参数来完成的。
est = pytz.timezone('US/Eastern') intervals = fleming.intervals( datetime(2013, 10, 7, 4), timedelta(weeks=1), count=10, within_tz=est) for i in intervals: 打印我 2013-10-07 04:00:00+00:00 2013-10-14 04:00:00+00:00 2013-10-21 04:00:00+00:00 2013-10-28 04: 00:00+00:00 2013-11-04 05:00:00+00:00 2013-11-11 05:00:00+00:00 2013-11-18 05:00:00+00:00 2013 -11-25 05:00:00+00:00 2013-12-02 05:00:00+00:00 2013-12-09 05:00:00+00:00
看看夏令时转换后,小时是如何从 4 点变成 5 点的?这允许您在进行与其他时区相关的计算时仍然使用 UTC 工作——这在 Ambition 的代码库中为简单性带来了额外的好处。
弗莱明的其他能力
196体育还在 Fleming 中提供了其他功能,帮助解决了许多常见的日期时间操作问题。一个例子是日期时间截断。您是否需要将日期时间向下舍入到最接近的月、日、周、年、小时、分钟或秒?使用地板功能:
从 datetime 导入 fleming import datetime print fleming.floor(datetime(2013, 10, 3), month=1) 2013-10-01 00:00:00+00:00
您是否要将 UTC 时间相对于另一个时区舍入并仍以 UTC 返回?使用 within_tz 参数。在196体育之前的示例中,它是世界标准时间 10 月 3 日午夜,但是,在美国东部时间仍然是 10 月 2 日,因此将一天舍入会产生以下结果:
import pytz print fleming.floor( datetime(2013, 10, 3), day=1, within_tz=pytz.timezone('US/Eastern')) 2013-10-02 00:00:00+00:00
如果您的时间最初不在夏令时,但由于地板的原因进入夏令时怎么办? Fleming 仍然会生成具有正确时区和时间值的时间:
est_time = pytz.timezone('US/Eastern').normalize( datetime(2013, 11, 28, tzinfo=pytz.utc)) 打印 est_time 2013-11-27 19:00:00-05:00 打印 fleming.floor (est_time, month=1) 2013-11-01 00:00:00-04:00
196体育还提供了执行 ceil of a time 的能力,获取关于时区的 unix 时间,轻松地将原始和有意识的日期时间转换为其他时区,并允许您进行任意日期时间算术。如需196体育的 Fleming 库的完整描述和使用示例,请访问此处。
这是196体育在 Ambition 发布的第一个完整的开源项目,196体育很好奇如何让它变得更好。欢迎在下方留下任何意见或建议。196体育希望196体育也能帮助您解决约会时间问题!
Wes Kendall 是 Ambition 的联合创始人兼首席技术官。他负责管理 Ambition 工程团队,是196体育行业领先的销售生产力和分析平台背后的推动力。
了解更多关于野心
Ambition 广受赞誉的员工生产力平台可以 360 度全方位了解个人和团队绩效。
使用来自任何数据源的实时性能数据建立问责制和认可度。跟踪关键指标并将其广播到个性化仪表板和办公室电视。将整体目标摆在您的代表面前。比较各团队的活动水平和目标达成情况,了解您的代表工作的努力程度和聪明程度。衡量团队、角色和个人的成功,然后通过自动记分卡、竞赛、认可和报告推动结果。
Ambition 是哈佛商业评论和 AA-ISP 认可的推动一线收入的解决方案,非常适合重视绩效驱动文化和透明运营的前台团队。在ambition.com上了解 PwC、Lyft、Wayfair、FiveStars、Total Quality Logistics 和 Outreach 等客户如何使用 Ambition。