• 一、描述
  • 二、代码
  • 三、打印
  • 四、问题

一、描述

根据开始、结束时间查找数据:数据的实际值(fact_value)为:开始结束日期占该月总天数百分比

  • 1、如果开始结束时间是同一个月 2020-01-03 ~ 2020-01-08

    • 1)、则 2020-01 的值为:((查找的结束天数 8 - 查找的开始天数 3 + 1)/ 该月的总天数 31 ) * 已知值
  • 2、如果开始结束时间不是同一个月 2020-01-03 ~ 2020-08-08
    • 1)、开始时间 2020-01 的值为:((该月的总天数 31 - 当前查找日期 3 + 1)/ 该月的总天数 31 ) * 已知值
    • 2)、结束时间 2020-08 的值为:(当前的查找日期 8 / 该月的总天数 31) * 已知值
  • 3、其他情况
    • 1)、整月查找,默认为1;比如 2020-01-03 ~ 2020-03-03,这中间的 2020-02 不用计算,默认为1
    • 2)、开始时间为第一天,则整月查找,百分比为 1
    • 3)、结束时间为最后一天,则整月查找,百分比为1

二、代码

public function test() {//计算Y-m对应的比例$param = ['start_time' => '2020-01-03', 'end_time' => '2020-04-07'];$dateToPercent = self::getMonthPercent($param);$data = [['date' => '2020-01', 'value' => 100],['date' => '2020-02', 'value' => 100],['date' => '2020-03', 'value' => 100],['date' => '2020-04', 'value' => 100],];//根据Y-m对应的比例处理数据foreach ($data as &$value) {$percent = isset($dateToPercent[$value['date']]) ? $dateToPercent[$value['date']] : 1; //比例默认是1$value['fact_value'] = sprintf('%.2f', $value['value'] * $percent);}var_export($data);
}/*** 根据开始、结束时间:计算开始、结束时间占当月总天数的百分比* @param $param* @return array*/
public function getMonthPercent($param) {$beforeTime = strtotime($param['start_time']);  //开始时间戳$afterTime = strtotime($param['end_time']);     //结束时间戳$beforeMonth = date('Y-m', $beforeTime);  //开始日期 年-月$afterMonth = date('Y-m', $afterTime);    //结束日期 年-月$beforeDay = date('d', $beforeTime);      //开始日期 几号$afterDay = date('d', $afterTime);        //结束日期 几号$beforeLastDays = date('t', $beforeTime); //开始月份的最后一天(开始月份总天数)$afterLastDays = date('t', $afterTime);   //结束月份的最后一天(结束月份总天数)$dateToPercent = [];if ($beforeMonth == $afterMonth) {    //同一个月份,计算2个日期之间差多少天$dateToPercent[$beforeMonth] = ($afterDay - $beforeDay + 1) / $beforeLastDays;//或者:如果是同一个月份,那么 $beforeLastDays 等于 $afterLastDays//$dateToPercent[$afterMonth] = ($afterDay - $beforeDay + 1) / $afterLastDays;}else{  //不是同一个月份:开始时间、结束时间 分开计算比例if ($beforeDay != '01') {  //开始时间是第一天,则百分比为1;不是开始月份第一天,才计算比例$dateToPercent[$beforeMonth] = ($beforeLastDays - $beforeDay + 1) / $beforeLastDays;}if ($afterDay != $afterLastDays) {   //结束时间是最后一天,则百分比为1;不是结束月份最后一天,才计算比例$dateToPercent[$afterMonth] = $afterDay / $afterLastDays; //当前天}}return $dateToPercent;
}

三、打印

array (0 => array ('date' => '2020-01','value' => 100,'fact_value' => '93.55',),1 => array ('date' => '2020-02','value' => 100,'fact_value' => '100.00',),2 => array ('date' => '2020-03','value' => 100,'fact_value' => '100.00',),3 => array ('date' => '2020-04','value' => 100,'fact_value' => '23.33',),
)

四、问题

  • 值 * 百分比 可能会有精度缺失的情况

PHP根据开始、结束时间:计算开始、结束时间占当月总天数的百分比相关推荐

  1. mysql 时间计算函数_MySQL时间计算函数DATE_SUB()用法简介说明

    摘要: 下文讲述MySQL数据库中时间计算函数DATE_SUB()的功能简介说明,如下所示: MySQL DATE_SUB 功能说明: MySQL DATE_SUB函数功能: 将一个时间值减去指定类型 ...

  2. c语言计算日出日落时间_日出日落时间 计算软件 日出日落时间计算公式

    计算日出时间. 日落时间. 昼长. 夜长的公式或方法 是时间计算最简单的. 昼半球的平分线上是12点. 对应的夜半球平分经线就是零点. 希望能对你有所帮助. 这些只跟经度有关系. 如果是半球俯视图就是 ...

  3. 根据还款期数和首次还款时间计算本期还款时间

    //amortizedNumber:期数        firstRefundTime:第一次还款时间 public static  String refundTime(String amortize ...

  4. android电池充电时间计算

    最近在做android手机电池管理相关的项目,其中有一个需求是计算手机充电时间的.翻阅了一些资料和一些相关的竞品,发现每个产品的在手机充电时长的计算上多不是很统一,后来翻阅了物理学的一些知识和文章,总 ...

  5. 数据可视化大屏电商数据展示平台开发实录(Echarts柱图曲线图、mysql筛选统计语句、时间计算、大数据量统计)

    数据可视化大屏电商数据展示平台 一.前言 二.项目介绍 三.项目展示 四.项目经验分享 4.1 翻牌器 4.1.1 翻牌器-今日实时交易 4.1.2.翻牌器后端统计SUM函数的使用 4.2 不同时间指 ...

  6. ios开发中计算代码运算时间_iOS日历、日期、时间的计算

    时间和日历的计算在iOS开发中经常看到,经常看到大家在百度,开源中国等搜索这些答案.今天写个简单的时间和日历有关的计算. 获取一个月的总天数 1.获取当月的天数 - (NSInteger)getNum ...

  7. c语言延时时间计算器,RC延时电路延时时间计算

    RC延时电路延时时间计算 计算公式: 延时时间= - R*C*ln((E-V)/E) 其中: "-"是负号; 电阻R和电容C是串联,R的单位为欧姆,C的单位为F; E为串联电阻和电 ...

  8. android 电池运行时间计算,android 电池充电时间计算方法

    最近在做android手机电池管理相关的项目,其中有一个需求是计算手机充电时间的.翻阅了一些资料和一些相关的竞品,发现每个产品的在手机充电时长的计算上多不是很统一,后来翻阅了物理学的一些知识和文章,总 ...

  9. java计算两个日期之间相差的天数的四种方法

    计算两个日期之间相差的天数的四种方法 第一种:时间戳的方式,计算两个日期的时间戳的差,再除当天的毫秒数即可得到相差的天数. public static void main(String[] args) ...

  10. python日期时间_python日期和时间的操作方法汇总

    日期和时间可以说是一种独特的数据类型,既不同于数字,也不同于字符串,而且有自己独特的运算规则.在不同的编程语言中,都会将日期和时间与常规的数据类型独立开来,单独进行操作.在python的内置模块中,时 ...

最新文章

  1. 网络安全系列之九 WAF的基本配置
  2. 网站排名不稳定要从多方面进行分析
  3. python安装成功第三方库但import出问题_解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程...
  4. Android 动画框架详解,第 1 部分
  5. Integer注意_享元设计模式
  6. 全面改革:解读 Vue 3.0 的变化
  7. 【Elasticsearch】 es 索引 内置 字段 _source
  8. 云、AI、5G技术融合,会将移动互联网带到什么新高度?
  9. Application_Error
  10. ShotCut——视频处理剪辑神器
  11. C++ 从入门到入土(English Version) Section 1:Gates, Circuits and Boolean Algebra
  12. 工作中应该发火,勿感情用词
  13. Sip 响应状态码功能对照详解
  14. 抖音快手微视去水印小程序!全网短视频无水印免费下载工具!
  15. Android gpuimage美颜滤镜,基于GPUImage的实时美颜滤镜
  16. OPA(运放)与MOS管组成的恒流源电路
  17. python3 Python.h No such file or directory
  18. 在centos中注册gitlab runner
  19. 3_使用seurat sct方法中的reference based处理大数据超过100000个细胞 science advance
  20. SharePoint site down when I used sharepoint designer 2007

热门文章

  1. ssm框架中mysql的分页_SSM框架中mapper层,增删改查,如何实现
  2. email java,java email 过程
  3. hmcl整合包导入_我只用了一篇文章就完成了Spring+SpringMVC+MyBatis详细整合教程
  4. python时间戳格式定义_关于Python时间戳是什么讲解
  5. xp本地调试php代码,Windows XP下简单配置本机PHP调试环境
  6. php 接口类,抽象类 的实际作用
  7. kafka搭建、学习(一)
  8. ASP.NET与MVC架构区别总结
  9. 互联网+正在颠覆行车记录仪市场
  10. chrome developer tool 调试技巧2