• 需求:假设今天24号,今天发表的评论显示几小时前发布,23号发布的显示 昨天几点发布的,再往前的就直接显示年月日。

    date_default_timezone_set('PRC');
    // $create_time = 1561377423;
    $create_time = 1561219392;
    // $create_time = 1561132890;
    //最又那种形式:
    //获取凌晨时间戳
    $start = date('Y-m-d');
    $start_time = strtotime($start);
    //前一天凌晨时间戳
    $last_start_time = strtotime(date('Y-m-d', strtotime('-1 day')));
    //数据库中发表评论的时间和凌晨时间对比
    if($create_time < $start_time && $create_time > $last_start_time){
    //说明不是在今天发表的评论
    $lastOneDay = date('H:i:s',$create_time);
    echo '发表于--昨天'.$lastOneDay;
    }elseif($create_time >= $start_time){
    $time_diff = time() - $create_time;
    $time_diff = round($time_diff / 3600);
    echo 'publish before'.$time_diff,'hours';
    }else{
    echo 'publish '.date('Y-m-d H:i:s',$create_time);
    }

    计算时间差

  • 接口本来是默认返回4篇文章显示在快应用里, 现在需要改一下.  需求: 前端不改代码, 后端每天自动添加两条数据, 就是说保留之前接口返回的数据, 然后每天再自动添加2 条(第一天:4 条 第二天: 6条 第三天: 8条 以此类推), 开始没想出来, 后来突然发现其实就是limit('4')改成limit($limit), 然后让$limit 每天自动递增就OK了. 其实重点在于按天递增.  他和之前的计算发表时间不同, 发表时间是判断数据库存的时间(addtime)是不是在一天的范围内. 而这个是按照前端请求接口的时间是不是在一天范围内.
    date_default_timezone_set('PRC');
    //判断前端请求接口的时间
    $firstTime = 1567008000; //默认把2019/8/29作为第一天(接口第一次请求的时间), 然后之后每天接口请求的时候,自动把$limit + 2 (如果是一天内多次请求接口, limit不变)
    $currentTime = time();
    $days = floor(($currentTime-$firstTime)/(3600*24)); //计算距离第一次接口请求过了多少天. 那么就把$limit 加上天数, 就是现在要返回的数据量
    echo $days, '<hr>';
    $limit = 4; //第一次接口请求的时候, 默认返回4条数据
    $limit += $days;
    echo $limit;
  • 需求: 每天只查询一次数据库.目前想到的有两种实现方法:
    (1) 在程序里设置每天定时查询一次数据库
    //简单写一下
    if(date('H:i:s') == 08:00:00){
    //todo e.g:select db
    }
    //continue...

    (2) 每天的第一次查询就是当天的唯一一次查询数据库(code里面的代码都是在actionTest方法中, 添加的时候没注意, 跑偏了)

    public static $temp_city = null;    //临时变量, 用来接收数据表中查询的city_list, 判断为null, 采取查询数据库
    public static $call_time = null; //记录前端每天第一次调用的时间
    public function actionTest()
    {
    //每天只查询一次获取城市list的接口和一次citylist数据表, 如果聚合有更新可以直接添加到数据库
    if(self::$call_time === null){
    self::$call_time = time();
    self::$temp_city = WeihaoCity::find()->select('city, cityname')->where(['status'=>0])->all(); //第一次查询
    $r = $this->curlGet($url); //调用curl请求接口
    //比较聚合数据和数据库的数据是否一致, 不一致则更新数据库
    }
    }
    //比较$call_time 和 之后调用接口的时间进行比较是不是同一天, 如果是同一天则不查询数据库, 否则查询
    if(date('Y-m-d', self::$call_time) == date('Y-m-d')){
    //说明在同一天, 什么都不用做
    } else{
    self::$call_time = time(); //把当前时间重新赋值给$call_time
    self::$temp_city = WeihaoCity::find()->select('city, cityname')->where(['status'=>0])->all(); //每天的第一次查询
    $r = $this->curlGet($url);
    }
    //比较数据库的数据和聚合的数据是不是一样的, 如果不一样那么更新数据库的数据, 否则不需更新
    $tmp = [];
    $r = json_decode($r, true);
    if(!empty(self::$temp_city)){
    foreach (self::$temp_city as $k=>$v){
    $tmp[] = $v['city'];
    }
    } foreach($r['result'] as $k=>$v){
    if(!in_array($v['city'], $tmp)){
    $insert = new WeihaoCity();
    $insert->city = $v['city'];
    $insert->cityname = $v['cityname'];
    $insert->addtime = time();
    if(!$insert->save()){
    return $insert->errors;
    }
    self::$temp_city = WeihaoCity::find()->select('city, cityname')->where(['status'=>0])->all();
    }
    }

    有几点注意一下:  (1) in_array() 第二个参数不能是多维数组, 必须要把多维数组变成一维数组. 不会递归判断的.
    (2) json_decode()  他的作用是把json对象转换成数组(第二个参数为true的情况下), 但是第一个参数不可以是数组(也是第二个参数为true的情况), 如果传入一个数组, 那么返回的结果将是空数组. 
    (3) yii中使用new model 添加数据的时候, 如果是遍历循环插入数据的情况, 那么要注意, new model 的操作一定要在循环体中执行, 如果在循环体外面执行, 那么最终插入数据库的记录只有遍历的最后一条数据.

php l练习(写着玩)的更多相关文章

  1. python写机器人玩僵尸骰子

    python写机器人玩僵尸骰子由Al Sweigart用python发布注意:我正在为我的僵尸骰子模拟器寻找反馈,以及这一套指令.如果你觉得有什么地方可以改进,请发邮件到al@inventwithpy ...

  2. c# 写着玩的,两个Task并发,一个写队列一个读队列的异常情况

    class Program { class TestEnqueue { static Queue<string> str = new Queue<string>(); publ ...

  3. 打印pid,写着玩。

    #include <stdio.h> #include <string.h> #include <dirent.h> #include <limits.h&g ...

  4. Springboot+WebSocket+Kafka(写着玩的)

    闹着玩的来源:前台发送消息,后台接受处理发给kafka,kafka消费者接到消息传给前台显示.联想到websocket. 最终效果如图: 页面解释: 不填写内容的话,表单值默认为Topic.Greet ...

  5. 自己写的书《深入理解Android虚拟机内存管理》,不出版只是写着玩

    百度网盘地址:https://pan.baidu.com/s/1jI4xZgE 我给起的书名叫做<深入理解Android虚拟机内存管理>.本书分为两个部分,前半部分主要是我对Linux0. ...

  6. 自己写着玩的一个天气APP

    打开的界面: 向上滑动,进入主界面: 省份界面: 城市界面: 加载天气界面: 显示天气界面: 侧滑,显示地区,然后根据天气来显示一首诗句(晴,多云,雪,雨什么的): 第一次启动App的时候才会加载数据 ...

  7. 写着玩的bash脚本

    #!/bin/bash function strealingManu { pwdfolder=`pwd` for var in "$@" do man 1 $var > $p ...

  8. = =用createJS写个flyppyPeople

    声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢! 最近flyppybird很流行啊,今天中午闲着没事干,就用现有的素材写了个flyppyPeople,因为角色是个人,所以就叫People啦 ...

  9. React自己写的一个地图小组件

    由于今天比较闲,就玩了玩react,然后就封装了一个地图的组件,当然功能比较简单,因为就是随手写的小东西,但是由于引用了百度API和bee-mobile,所以用起来可能要薛微麻烦一点点,但是我保证,只 ...

随机推荐

  1. inner join on会过滤掉两边空值的条件

    前两天工作过程中,遇到一个问题,关于join on查询的,对于查出来的结果一直都很疑惑,这里记录一下. 1.首先看下面这条sql查询语句: 查询出来的结果是25053 2.加个 o.lat = n.l ...

  2. [转帖]Docker常用命令总结

    Docker常用命令总结 http://www.ha97.com/5546.html 发表于: Linux, 互联网, 虚拟化与云计算 | 作者: 博客教主 标签: docker,常用命令,总结 PS ...

  3. 简单了解运用Git

    Git是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的分布式版本控制系统. SVN是集中式的. Git没有中央服务器,每台电脑就是一个完整的版本库 ,工作无需 ...

  4. js设计模式--发布订阅模式

    前言 本系列文章主要根据<JavaScript设计模式与开发实践>整理而来,其中会加入了一些自己的思考.希望对大家有所帮助. 概念 发布-订阅模式又叫观察者模式,它定义对象间的一种一对多的 ...

  5. Linux-1.1root初始密码设置,切换root用户

    Ubuntu安装好后,root密码需要自己设置 root初始密码设置 sudo passwd root 权限不够时,切换root su 回车后输入密码 exit 退出登录的账户

  6. Linux下用OTL操作MySql(包含自己封装的类库及演示样例代码下载)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/ClamReason/article/details/23971805 首先重点推荐介绍otl介绍及使 ...

  7. Java后端技术面试汇总(第一套)

    面试汇总,整理一波,doc文档可点击[此处下载] 1.基础篇 1.1.Java基础 • 面向对象的特征:继承.封装和多态• final, finally, finalize 的区别• Exceptio ...

  8. C# 面向对象1(类和对象的概念)

    1.面向过程-->面向对象 面向过程:面向的是完成这件事儿的过程,强调的是完成这件事儿的动作. 2.面向过程的思想: 以上的,需求一更改,会导致不同的方法,一一去更改. 3.面向对象的思想:找个 ...

  9. 只读字段(readonly)和常量(const)

    1.常量 一个包含不能修改的值的变量,通过const关键字定义.只能在声明的同时赋值 2.只读字段 通过readonly关键字定义. 可以在声明的同时赋值. 对于实例字段,在包含字段声明的类的实例构造 ...

  10. JS基础_js编写位置

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...