maba/clock

0.1.1 2015-07-31 23:23 UTC

This package is auto-updated.

Last update: 2024-09-10 20:07:30 UTC


README

这是什么?

  1. ClockInterface 包含单个方法 getCurrentDateTime (@returns \DateTime)

    为什么不是直接使用 new \DateTime()? 因为有时候你需要调整时间。依赖于全局上下文(即 new \DateTime())是错误的,因为你不能通过依赖注入来改变其行为,因此配置。

    一些示例:1) 单元测试 - 你需要模拟时钟 2) 你需要更改时区,但又不想更改 php.ini 设置(参见 TimeZonedClock

  2. Condition 命名空间中的类用于检查和优先级排序时间条件。

时钟

RealTimeClock - 提供真实、未修改的 \DateTime

TimeZonedClock - 从另一个 ClockInterface(通常是 RealTimeClock)获取时间,并设置预先配置的时区。

条件

TimeCondition - POJO/值对象,包含可用的时限制约

  1. 从时间,以秒为单位,包含
  2. 直到时间,以秒为单位,不包含。可以与从时间重叠 00:00
  3. 星期几。 0(星期日)到 6(星期六)
  4. 月份中的某一天(131
  5. 月份(112)。只能与月份中的某一天一起指定
  6. 年份(例如 2015)。只能与月份和月份中的某一天一起指定

你可以实现 TimeConditionInterface 并使用此库与自己的对象一起使用,例如任何 Doctrine 实体。

ConditionPriorityResolver - 为任何 TimeConditionInterface 提供优先级。更高的优先级意味着条件更加具体,因此在选择多个条件时应该“获胜”。

TimeConditionChecker - 返回给定的 TimeConditionInterface 是否与给定的 \DateTime 匹配

CurrentTimeConditionChecker - 返回给定的 TimeConditionInterface 是否与当前时间匹配

ConditionalValueResolver - 解析与当前时间最具体的时间条件并给出相关值。

示例

<?php

$resolver = new ConditionalValueResolver(
    new ConditionPriorityResolver(),
    new CurrentTimeConditionChecker(new RealTimeClock(), new TimeConditionChecker())
);

// order of the items in the array does not matter, as they're ordered by priorities
$resolver->resolveValue(array(
    // default price 20 EUR
    (new ConditionalValue())->setTimeCondition(
        (new TimeCondition())
    )->setValue('20 EUR'),
    // from 16:00 price is 30 EUR
    (new ConditionalValue())->setTimeCondition(
        (new TimeCondition())->setFromTime(16 * 3600)   
    )->setValue('30 EUR'),
    // 17:00 - 18:00 we have a happy hour
    (new ConditionalValue())->setTimeCondition(
        (new TimeCondition())->setFromTime(17 * 3600)->setUntilTime(18 * 3600) 
    )->setValue('15 EUR'),
    // 23:00 - 03:00 price is bigger
    (new ConditionalValue())->setTimeCondition(
        (new TimeCondition())->setFromTime(23 * 3600)->setUntilTime(03 * 3600) 
    )->setValue('40 EUR'),
    // price is 50 EUR on Sundays. This wins over all above rules
    (new ConditionalValue())->setTimeCondition(
        (new TimeCondition())->setWeekday(0) 
    )->setValue('50 EUR'),
    // this overwrites price from 20:00 until 00:00
    (new ConditionalValue())->setTimeCondition(
        (new TimeCondition())->setWeekday(0)->setFromTime(20 * 3600) 
    )->setValue('30 EUR'),
    // first day on every month - cheap one. Wins over all above
    (new ConditionalValue())->setTimeCondition(
        (new TimeCondition())->setDay(1) 
    )->setValue('10 EUR'),
    // day of New Year is special
    (new ConditionalValue())->setTimeCondition(
        (new TimeCondition())->setDay(1)->setMonth(1) 
    )->setValue('100 EUR'),
    // Easter etc.
    (new ConditionalValue())->setTimeCondition(
        (new TimeCondition())->setDay(5)->setMonth(4)->setYear(2015) 
    )->setValue('50 EUR'),
));

安装

composer require maba/clock

运行测试

Travis status Coverage Status

composer install
vendor/bin/phpunit