andydune/datetime

扩展 DateTime 类以添加一些便利。

v2.3.1 2018-09-12 06:55 UTC

This package is auto-updated.

Last update: 2024-09-22 03:47:16 UTC


README

Build Status Software License Packagist Version Total Downloads

它扩展了 DateTime 类以添加一些便利。

安装

使用 composer 安装

composer require andydune/datetime

如果全局未安装 composer

php composer.phar require andydune/datetime

或者编辑你的 composer.json

"require" : {
     "andydune/datetime": "^2"
}

并执行命令

php composer.phar update

如何创建实例

无参数的构造函数设置当前时间值。

use AndyDuneTest\DateTime\DateTime;
$dt = new DateTime();
$dt->getTimestamp; // == time()

具有整数参数的构造函数是单位秒。

use AndyDuneTest\DateTime\DateTime;
$dt = new DateTime(time() + 3600);
$dt->getTimestamp; // == time() + 3600

具有字符串参数的构造函数与函数 strtotime() 相同

use AndyDuneTest\DateTime\DateTime;
$dt = new DateTime('2018-04-11'); // default format is mysql datetime
$dt = new DateTime('11.04.2017', 'd.m.Y'); // own format - use string as for date() function

具有 \Datetime 类型参数

use AndyDuneTest\DateTime\DateTime;
$dt = new DateTime(new \DateTime());

格式化日期时间

它有方法 format() 用于获取格式化的日期时间数据作为字符串。该方法等待类似于 date() 函数的字符串。

use AndyDuneTest\DateTime\DateTime;
$dt = new DateTime();
echo $dt->format('Y-m-d'); // 2107-04-12
echo $dt->format('H:i'); // 10:04

日期算术。

每个持续时间周期由一个整数值后跟一个周期设计符表示。如果持续时间包含时间元素,则该部分的指定由字母 T 开头。

周期设计符

  • Y - 年份,
  • M - 月份,
  • D - 天,
  • W - 周,
  • H - 小时,
  • M - 分钟,
  • S - 秒。

示例

use AndyDuneTest\DateTime\DateTime;
$dt = new DateTime();
$dt->add('2D'); // two days
$dt->add('T2S'); // two seconds
$dt->add('6YT5M'); // six years and five minutes

单位类型必须从最左边的最大刻度单位输入到最右边的最小刻度单位。使用第一个 "-" 字符表示负周期。或者相对周期。

示例

use AndyDuneTest\DateTime\DateTime;
$dt = new DateTime();
$dt->add('+5 weeks'); // 5 weeks to future
$dt->add('12 day'); // 12 days to future
$dt->add('-7 weekdays'); // 7 working daye to past
$dt->add('3 months - 5 days'); // 3 months to future and 5 days to past

工具

将每天的统计信息汇总到周。

如果没有完整的周工作日数,则数据中缺少的天数将添加为平均值。

源 json

$json = '
   {
    "2018-03-01" : 913,
    "2018-03-03" : 913,
    "2018-03-04" : 913,
    
    "2018-03-05" : 910,
    "2018-03-07" : 914,
    "2018-03-08" : 915,
    "2018-03-09" : 915,
    "2018-03-11" : 912,
    
    "2018-03-12" : 869,
    "2018-03-14" : 869,
    "2018-03-16" : 869,
    "2018-03-17" : 864,
}';
use AndyDune\DateTime\Tool\Statistics\BringNumberInDayToNumberInWeek;
$data = json_decode($json, true);

$stat = new BringNumberInDayToNumberInWeek($data);
$weeks = $stat->getWeeksWithCalendarDivision();

周是

 {
    "2018-03-04" : 6391,
    "2018-03-11" : 6393,
    "2018-03-18" : 6075
}

策略模式

在这个库中,有一个很好的工具可以操作 DateTime 对象,而无需编辑现有代码。

方法

DateTime::setAction(AbstractAction $action) - 添加要进一步执行的动作

DateTime::executeAction(...$params) - 使用任何参数执行动作

判断是否为工作日

use AndyDune\DateTime\Action\IsWorkingDay;
use AndyDune\DateTime\DateTime;

$dt = new DateTime('18-04-2018', 'd-m-Y');
$dt->setAction(new IsWorkingDay())->executeAction(); // true

$dt = new DateTime('22-04-2018', 'd-m-Y');
$dt->setAction(new IsWorkingDay())->executeAction(); // false

找出点指天数后的最近工作日

为此任务有一个动作 AndyDune\DateTime\Action\PlusWorkingDays

use AndyDune\DateTime\Action\PlusWorkingDays;
use AndyDune\DateTime\DateTime;

$dt = new DateTime('28-04-2018', 'd-m-Y');
$action = new PlusWorkingDays();
$action->setNoWorkingDays(['1-05', '30-04']);  // set list of official holidays 
$action->setWorkingDays(['28-04']); // set list of working sundays or saturdays
$dt->setAction($action)->executeAction(1); // to know working date after 1 day

$dt->format('d-m-Y'); // '02-05-2018'
$action->getDaysPlus(); // 4 days