PHP根据开始、结束时间:计算开始、结束时间占当月总天数的百分比
- 一、描述
- 二、代码
- 三、打印
- 四、问题
一、描述
根据开始、结束时间查找数据:数据的实际值(
fact_value
)为:开始结束日期占该月总天数百分比
- 1、如果开始结束时间是同一个月
2020-01-03 ~ 2020-01-08
- 1)、则
2020-01
的值为:((查找的结束天数 8 - 查找的开始天数 3 + 1)/ 该月的总天数 31 ) * 已知值
- 1)、则
- 2、如果开始结束时间不是同一个月
2020-01-03 ~ 2020-08-08
- 1)、开始时间
2020-01
的值为:((该月的总天数 31 - 当前查找日期 3 + 1)/ 该月的总天数 31 ) * 已知值
- 2)、结束时间
2020-08
的值为:(当前的查找日期 8 / 该月的总天数 31) * 已知值
- 1)、开始时间
- 3、其他情况
- 1)、整月查找,默认为
1
;比如2020-01-03 ~ 2020-03-03
,这中间的2020-02
不用计算,默认为1
- 2)、开始时间为
第一天
,则整月查找,百分比为1
- 3)、结束时间为
最后一天
,则整月查找,百分比为1
- 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根据开始、结束时间:计算开始、结束时间占当月总天数的百分比相关推荐
- mysql 时间计算函数_MySQL时间计算函数DATE_SUB()用法简介说明
摘要: 下文讲述MySQL数据库中时间计算函数DATE_SUB()的功能简介说明,如下所示: MySQL DATE_SUB 功能说明: MySQL DATE_SUB函数功能: 将一个时间值减去指定类型 ...
- c语言计算日出日落时间_日出日落时间 计算软件 日出日落时间计算公式
计算日出时间. 日落时间. 昼长. 夜长的公式或方法 是时间计算最简单的. 昼半球的平分线上是12点. 对应的夜半球平分经线就是零点. 希望能对你有所帮助. 这些只跟经度有关系. 如果是半球俯视图就是 ...
- 根据还款期数和首次还款时间计算本期还款时间
//amortizedNumber:期数 firstRefundTime:第一次还款时间 public static String refundTime(String amortize ...
- android电池充电时间计算
最近在做android手机电池管理相关的项目,其中有一个需求是计算手机充电时间的.翻阅了一些资料和一些相关的竞品,发现每个产品的在手机充电时长的计算上多不是很统一,后来翻阅了物理学的一些知识和文章,总 ...
- 数据可视化大屏电商数据展示平台开发实录(Echarts柱图曲线图、mysql筛选统计语句、时间计算、大数据量统计)
数据可视化大屏电商数据展示平台 一.前言 二.项目介绍 三.项目展示 四.项目经验分享 4.1 翻牌器 4.1.1 翻牌器-今日实时交易 4.1.2.翻牌器后端统计SUM函数的使用 4.2 不同时间指 ...
- ios开发中计算代码运算时间_iOS日历、日期、时间的计算
时间和日历的计算在iOS开发中经常看到,经常看到大家在百度,开源中国等搜索这些答案.今天写个简单的时间和日历有关的计算. 获取一个月的总天数 1.获取当月的天数 - (NSInteger)getNum ...
- c语言延时时间计算器,RC延时电路延时时间计算
RC延时电路延时时间计算 计算公式: 延时时间= - R*C*ln((E-V)/E) 其中: "-"是负号; 电阻R和电容C是串联,R的单位为欧姆,C的单位为F; E为串联电阻和电 ...
- android 电池运行时间计算,android 电池充电时间计算方法
最近在做android手机电池管理相关的项目,其中有一个需求是计算手机充电时间的.翻阅了一些资料和一些相关的竞品,发现每个产品的在手机充电时长的计算上多不是很统一,后来翻阅了物理学的一些知识和文章,总 ...
- java计算两个日期之间相差的天数的四种方法
计算两个日期之间相差的天数的四种方法 第一种:时间戳的方式,计算两个日期的时间戳的差,再除当天的毫秒数即可得到相差的天数. public static void main(String[] args) ...
- python日期时间_python日期和时间的操作方法汇总
日期和时间可以说是一种独特的数据类型,既不同于数字,也不同于字符串,而且有自己独特的运算规则.在不同的编程语言中,都会将日期和时间与常规的数据类型独立开来,单独进行操作.在python的内置模块中,时 ...
最新文章
- 网络安全系列之九 WAF的基本配置
- 网站排名不稳定要从多方面进行分析
- python安装成功第三方库但import出问题_解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程...
- Android 动画框架详解,第 1 部分
- Integer注意_享元设计模式
- 全面改革:解读 Vue 3.0 的变化
- 【Elasticsearch】 es 索引 内置 字段 _source
- 云、AI、5G技术融合,会将移动互联网带到什么新高度?
- Application_Error
- ShotCut——视频处理剪辑神器
- C++ 从入门到入土(English Version) Section 1:Gates, Circuits and Boolean Algebra
- 工作中应该发火,勿感情用词
- Sip 响应状态码功能对照详解
- 抖音快手微视去水印小程序!全网短视频无水印免费下载工具!
- Android gpuimage美颜滤镜,基于GPUImage的实时美颜滤镜
- OPA(运放)与MOS管组成的恒流源电路
- python3 Python.h No such file or directory
- 在centos中注册gitlab runner
- 3_使用seurat sct方法中的reference based处理大数据超过100000个细胞 science advance
- SharePoint site down when I used sharepoint designer 2007
热门文章
- ssm框架中mysql的分页_SSM框架中mapper层,增删改查,如何实现
- email java,java email 过程
- hmcl整合包导入_我只用了一篇文章就完成了Spring+SpringMVC+MyBatis详细整合教程
- python时间戳格式定义_关于Python时间戳是什么讲解
- xp本地调试php代码,Windows XP下简单配置本机PHP调试环境
- php 接口类,抽象类 的实际作用
- kafka搭建、学习(一)
- ASP.NET与MVC架构区别总结
- 互联网+正在颠覆行车记录仪市场
- chrome developer tool 调试技巧2