停在黄头侧颈龟鼻子上的茱莉亚蝶,亚马逊地区,厄瓜多尔 (© Westend61/Getty Images)

Welcom to 评论 - lizhenqiu blog!

    #77

    作者:广西河池市
    【PHP原生】获取字符串所有汉字首字母和首个汉字首字母
    获取字符串汉字首字母,兼容GBK和UTF-8
    <?php //获取单个汉字拼音首字母。注意:此处不要纠结。汉字拼音是没有以U和V开头的 function getfirstchar($s0){ $fchar = ord($s0{0}); if($fchar >= ord("A") and $fchar <= ord("z") )return strtoupper($s0{0}); $s1 = iconv("UTF-8","gb2312", $s0); $s2 = iconv("gb2312","UTF-8", $s1); if($s2 == $s0){$s = $s1;}else{$s = $s0;} $asc = ord($s{0}) * 256 + ord($s{1}) - 65536; if($asc >= -20319 and $asc <= -20284) return "A"; if($asc >= -20283 and $asc <= -19776) return "B"; if($asc >= -19775 and $asc <= -19219) return "C"; if($asc >= -19218 and $asc <= -18711) return "D"; if($asc >= -18710 and $asc <= -18527) return "E"; if($asc >= -18526 and $asc <= -18240) return "F"; if($asc >= -18239 and $asc <= -17923) return "G"; if($asc >= -17922 and $asc <= -17418) return "H"; if($asc >= -17922 and $asc <= -17418) return "I"; if($asc >= -17417 and $asc <= -16475) return "J"; if($asc >= -16474 and $asc <= -16213) return "K"; if($asc >= -16212 and $asc <= -15641) return "L"; if($asc >= -15640 and $asc <= -15166) return "M"; if($asc >= -15165 and $asc <= -14923) return "N"; if($asc >= -14922 and $asc <= -14915) return "O"; if($asc >= -14914 and $asc <= -14631) return "P"; if($asc >= -14630 and $asc <= -14150) return "Q"; if($asc >= -14149 and $asc <= -14091) return "R"; if($asc >= -14090 and $asc <= -13319) return "S"; if($asc >= -13318 and $asc <= -12839) return "T"; if($asc >= -12838 and $asc <= -12557) return "W"; if($asc >= -12556 and $asc <= -11848) return "X"; if($asc >= -11847 and $asc <= -11056) return "Y"; if($asc >= -11055 and $asc <= -10247) return "Z"; return NULL; //return $s0; } function pinyin_long($zh){ //获取整条字符串所有汉字拼音首字母 $ret = ""; $s1 = iconv("UTF-8","gb2312", $zh); $s2 = iconv("gb2312","UTF-8", $s1); if($s2 == $zh){$zh = $s1;} for($i = 0; $i < strlen($zh); $i++){ $s1 = substr($zh,$i,1); $p = ord($s1); if($p > 160){ $s2 = substr($zh,$i++,2); $ret .= getfirstchar($s2); }else{ $ret .= $s1; } } return $ret; } echo pinyin_long('*《,@#$123HAHadf一年后而已');echo "<br>";//console(*@#$123HAHadfYNHEY) function pinyin_long2($zh){ //获取整条字符串(非纯汉字链)首个汉字拼音首字母 $ret = ""; $s1 = iconv("UTF-8","gb2312", $zh); $s2 = iconv("gb2312","UTF-8", $s1); if($s2 == $zh){$zh = $s1;} for($i = 0; $i < strlen($zh); $i++){ $s1 = substr($zh,$i,1); $p = ord($s1); if($p > 160){ $s2 = substr($zh,$i++,2); $ret = getfirstchar($s2); }else{ $ret = $s1; } } return $ret; } echo pinyin_long2('*《,@#$123HAHadf一年后而已');//console(Y) ?>
    Run code
    Cut to clipboard
      文章:php获得汉字拼音首字母  发表时间:2023-05-31, 17:44:07  
      展开↯

      #78

      作者:广西河池市
      PHP前一天,后一天,日期问题
      date_default_timezone_set('PRC'); //默认时区 echo "今天:",date("Y-m-d",time()),"<br>"; echo "今天:",date("Y-m-d",strtotime("18 june 2008")),"<br>"; echo "昨天:",date("Y-m-d",strtotime("-1 day")), "<br>"; echo "明天:",date("Y-m-d",strtotime("+1 day")), "<br>"; echo "一周后:",date("Y-m-d",strtotime("+1 week")), "<br>"; echo "一周零两天四小时两秒后:",date("Y-m-d G:H:s",strtotime("+1 week 2 days 4 hours 2 seconds")), "<br>"; echo "下个星期四:",date("Y-m-d",strtotime("next Thursday")), "<br>"; echo "上个周一:".date("Y-m-d",strtotime("last Monday"))."<br>"; echo "一个月前:".date("Y-m-d",strtotime("last month"))."<br>"; echo "一个月后:".date("Y-m-d",strtotime("+1 month"))."<br>"; echo "十年后:".date("Y-m-d",strtotime("+10 year"))."<br>";
      Run code
      Cut to clipboard
        文章:js获取本周、本月、本季度、本年开始,结束时间  发表时间:2023-05-31, 17:43:27  
        展开↯

        #79

        作者:广西河池市
        php 在客户端生成txt文件并且下载

        在访问php时生成txt文件
          $filename = 'file.text'; //也可以是其他后缀格式的 $ua = $_SERVER["HTTP_USER_AGENT"]; foreach ($fedexinfo as $key => $value) { echo $key.",\"".$value."\"\r\n"; } header("Content-Type: application/octet-stream"); header('Content-Disposition: attachment; filename="' . $filename . '"');
        Run code
        Cut to clipboard

          文章:nginx不浏览直接下载文件  发表时间:2023-05-31, 17:42:26  
          展开↯

          #80

          作者:广西河池市
          php生成文字水印和图片水印

          生成文字水印
          //文字水印 /*打开图片*/ //1.配置图片路径 $src = "4.jpg"; //2.获取图片的信息(得到图片的基本信息) $info = getimagesize($src ); //3.通过获取图片类型 $type = image_type_to_extension($info[2],false); //4.在内存中创建一个图片类型一样的图像 $fun = "imagecreatefrom{$type}"; //5.图片复制到内存中 $image = $fun($src); /*操作图片*/ //1.设置字体的路径 $font = "STLITI.TTF";//c盘windows/fonts //2.填写水印内容 $content = '你好'; //3.设置字体的颜色rgb和透明度 $col = imagecolorallocatealpha($image,255,255,255,50); //4.写入文字 imagettftext($image,20,0,20,30,$col,$font,$content); /*输出图片*/ //浏览器输出 header("Content-type:{$info['mime']}"); $func = "image{$type}"; $func($image); //保存图片 $func($image,'newimage.'.$type); /*销毁图片*/ imagedestroy($image);
          Run code
          Cut to clipboard


            生成图片水印
            $dst_path = '4.jpg'; $src_path = '1.png'; //创建图片的实例 $dst = imagecreatefromstring(file_get_contents($dst_path)); $src = imagecreatefromstring(file_get_contents($src_path)); //获取水印图片的宽高 list($src_w, $src_h) = getimagesize($src_path); //将水印图片复制到目标图片上,最后个参数80是设置透明度,这里实现半透明效果 imagecopymerge($dst, $src, 10, 10, 0, 0, $src_w, $src_h, 80); //如果水印图片本身带透明色,则使用imagecopy方法 //imagecopy($dst, $src, 10, 10, 0, 0, $src_w, $src_h); //输出图片 list($dst_w, $dst_h, $dst_type) = getimagesize($dst_path); switch ($dst_type) { case 1://GIF header('Content-Type: image/gif'); imagegif($dst); break; case 2://JPG header('Content-Type: image/jpeg'); imagejpeg($dst); break; case 3://PNG header('Content-Type: image/png'); imagepng($dst); break; default: break; } imagedestroy($dst); imagedestroy($src);
            Run code
            Cut to clipboard


              #,广西河池市,2023-05-31,17:25:50, 绘制文字:imagettftext()
              <?php //1. 绘制图像资源(创建一个画布) $image = imagecreatetruecolor(500, 300); //2. 先分配一个绿色 $green = imagecolorallocate($image, 22, 153, 0); //3. 使用绿色填充画布 imagefill($image, 0, 0, $green); //4. 在画布中绘制图像 $bai = imagecolorallocate($image, 255, 255, 255); //使用指定的字体文件绘制文字 //参数2:字体大小 //参数3:字体倾斜的角度 //参数4、5:文字的x、y坐标 //参数6:文字的颜色 //参数7:字体文件 //参数8:绘制的文字 imagettftext($image, 30, 30, 200, 250, $bai, 'STHUPO.TTF', 'helloworld'); //5. 在浏览器直接输出图像资源 header("Content-Type:image/jpeg"); imagejpeg($image); //6. 销毁图像资源 imagedestroy($image);
              Run code
              Cut to clipboard
                文章:nginx不浏览直接下载文件  发表时间:2023-05-31, 17:25:15  
                展开↯

                #81

                作者:广西河池市
                PHP实现下载远程图片保存到本地的方法

                1.使用 curl
                比如我们有下面这两张图片:
                $images = [ 'https://dn-laravist.qbox.me/2015-09-22_00-17-06j.png', 'https://dn-laravist.qbox.me/2015-09-23_00-58-03j.png' ];
                Run code
                Cut to clipboard

                  第一步,我们可以直接来使用最简单的代码实现:
                  function download($url, $path = 'images/') { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); $file = curl_exec($ch); curl_close($ch); $filename = pathinfo($url, PATHINFO_BASENAME); $resource = fopen($path . $filename, 'a'); fwrite($resource, $file); fclose($resource); }
                  Run code
                  Cut to clipboard


                    那在下载远程图片的时候就可以这样:
                    foreach ( $images as $url ) { download($url); }
                    Run code
                    Cut to clipboard


                      2.封装一个类
                      缕清思路之后,我们可以将这个基本的功能封装到一个类中:
                      class Spider { public function downloadImage($url, $path = 'images/') { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); $file = curl_exec($ch); curl_close($ch); $filename = pathinfo($url, PATHINFO_BASENAME); $resource = fopen($path . $filename, 'a'); fwrite($resource, $file); fclose($resource); } }
                      Run code
                      Cut to clipboard


                        在者,我们还可以这样稍微优化一下:
                        public function downloadImage($url, $path='images/') { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); $file = curl_exec($ch); curl_close($ch); $this->saveAsImage($url, $file, $path); } private function saveAsImage($url, $file, $path) { $filename = pathinfo($url, PATHINFO_BASENAME); $resource = fopen($path . $filename, 'a'); fwrite($resource, $file); fclose($resource); }
                        Run code
                        Cut to clipboard


                          封装成类之后,我们可以这样调用代码来下载图片:
                          $spider = new Spider(); foreach ( $images as $url ) { $spider->downloadImage($url); }
                          Run code
                          Cut to clipboard

                            文章:nginx不浏览直接下载文件  发表时间:2023-05-31, 17:22:05  
                            展开↯

                            #82

                            作者:广西河池市
                            php将远程图片下载保存到本地
                            /* *功能:php完美实现下载远程图片保存到本地 *参数:文件url,保存文件目录,保存文件名称,使用的下载方式 *当保存文件名称为空时则使用远程文件原来的名称 */ function getImage($url,$save_dir='',$filename='',$type=0){ if(trim($url)==''){ return array('file_name'=>'','save_path'=>'','error'=>1); } if(trim($save_dir)==''){ $save_dir='./'; } if(trim($filename)==''){//保存文件名 $ext=strrchr($url,'.'); if($ext!='.gif'&&$ext!='.jpg'){ return array('file_name'=>'','save_path'=>'','error'=>3); } $filename=time().$ext; } if(0!==strrpos($save_dir,'/')){ $save_dir.='/'; } //创建保存目录 if(!file_exists($save_dir)&&!mkdir($save_dir,0777,true)){ return array('file_name'=>'','save_path'=>'','error'=>5); } //获取远程文件所采用的方法 if($type){ $ch=curl_init(); $timeout=5; curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout); $img=curl_exec($ch); curl_close($ch); }else{ ob_start(); readfile($url); $img=ob_get_contents(); ob_end_clean(); } //$size=strlen($img); //文件大小 $fp2=@fopen($save_dir.$filename,'a'); fwrite($fp2,$img); fclose($fp2); unset($img,$url); return array('file_name'=>$filename,'save_path'=>$save_dir.$filename,'error'=>0); }
                            Run code
                            Cut to clipboard
                              文章:nginx不浏览直接下载文件  发表时间:2023-05-31, 17:20:19  
                              展开↯

                              #83

                              作者:广西河池市
                              <?php /* * 生成随机字符串 * @param int $length 生成随机字符串的长度 * @param string $char 组成随机字符串的字符串 * @return string $string 生成的随机字符串 */ function str_rand($length = 32, $char = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') { if(!is_int($length) || $length < 0) { return false; } $string = ''; for($i = $length; $i > 0; $i--) { $string .= $char[mt_rand(0, strlen($char) - 1)]; } return $string; } echo str_rand(),"<br />"; /* * 生成32位唯一字符串 */ $uniqid = md5(uniqid(microtime(true),true)); echo $uniqid;
                              Run code
                              Cut to clipboard
                                文章:PHP生成随机密码  发表时间:2023-05-31, 17:17:00  
                                展开↯

                                #84

                                作者:广西河池市
                                js中数组的合并和对象的合并

                                1 数组合并
                                1.1 concat 方法
                                var a=[1,2,3],b=[4,5,6]; var c=a.concat(b); console.log(c);// 1,2,3,4,5,6 console.log(a);// 1,2,3 不改变本身
                                Run code
                                Cut to clipboard


                                  1.2 循环遍历
                                  var arr1=['a','b']; var arr2=['c','d','e']; for(var i=0;i<arr2.length;i++){ arr1.push(arr2[i]) } console.log(arr1);//['a','b','c','d','e']
                                  Run code
                                  Cut to clipboard


                                    1.3 apply
                                    合并数组arr1和数组arr2,使用Array.prototype.push.apply(arr1,arr2) or arr1.push.apply(arr1,arr2);
                                    var arr1=['a','b']; var arr2=['c','d','e']; Array.prototype.push.apply(arr1,arr2); //或者 arr1.push.apply(arr1,arr2);<br>console.log(arr1) //['a','b','c','d','e']
                                    Run code
                                    Cut to clipboard


                                      2 对象合并
                                      2.1 $.extend()
                                      var obj1= {'a': 1}; var obj2= {'b': 1}; var c = $.extend(obj1, obj2);console.log(obj1); // {a: 1, b: 1} obj1已被修改//或者 <br>var obj3 = $.extend({}, obj1, obj2) <br>console.log(obj3); //{a: 1, b: 1} 不会改变obj1,obj2
                                      Run code
                                      Cut to clipboard


                                        2.2 遍历赋值
                                        var obj1={'a':1}; var obj2={'b':2,'c':3}; for(var key in obj2){ if(obj2.hasOwnProperty(key)===true){ <br> //此处hasOwnProperty是判断自有属性,使用 for in 循环遍历对象的属性时,原型链上的所有属性都将被访问会避免原型对象扩展带来的干扰 obj1[key]=obj2[key]; } } console.log(obj1);//{'a':1,'b':2,'c':3};
                                        Run code
                                        Cut to clipboard

                                            

                                          2.3 Obj.assign()
                                            可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。
                                            Object.assign(target, ...sources)

                                          //a. 复制一个对象<br>var obj = { a: 1 ,b:2}; var copyObj = Object.assign({}, obj); console.log(copyObj); // { a: 1,b:2 }<br><br>//b.合并多个对象var o1 = { a: 1 }; var o2 = { b: 2 }; var o3 = { c: 3 }; var obj = Object.assign(o1, o2, o3); console.log(obj); // { a: 1, b: 2, c: 3 } console.log(o1); // { a: 1, b: 2, c: 3 }, 且目标对象自身也会改变
                                          Run code
                                          Cut to clipboard



                                            2.4 对象的深拷贝和浅拷贝
                                            2.4.1 浅拷贝
                                            var obj1={'a':1}; var obj2={'b':{'b1':22,'b2':33}}; $.extend(obj1, obj2); //obj1拷贝了obj2的属性 console.log(obj1) // {'a':1,'b'{'b1':22,'b2':33}} console.log(obj1.b.b1) // 22 obj2.b.b1=44; //obj2重新赋值 console.log(obj1.b.b1) // 44 obj1.b仅拷贝了对象的指引,所以受原obj2的影响
                                            Run code
                                            Cut to clipboard



                                              2.4.2 深拷贝
                                              var obj1={'a':1}; var obj2={'b':{'b1':22,'b2':33}}; $.extend(true,obj1, obj2); //第一个参数设为true表示深复制 console.log(obj1) // {'a':1,'b'{'b1':22,'b2':33}} console.log(obj1.b.b1) // 22 obj2.b.b1=44; //obj2重新赋值 console.log(obj1.b.b1) // 22 obj1拷贝了obj2的所有属性以及值,并不受obj2的影响
                                              Run code
                                              Cut to clipboard

                                                    
                                                文章:js获取本周、本月、本季度、本年开始,结束时间  发表时间:2023-05-31, 17:15:22  
                                                展开↯

                                                #85

                                                作者:广西河池市
                                                js数组与字符串的相互转换方法
                                                1、数组转字符串 需要将数组元素用某个字符连接成字符串,示例代码如下: var a, b; a = new Array(0,1,2,3,4); b = a.join("-"); //"0-1-2-3-4" 2、字符串转数组 实现方法为将字符串按某个字符切割成若干个字符串,并以数组形式返回,示例代码如下: var s = "abc,abcd,aaa"; ss = s.split(",");// 在每个逗号(,)处进行分解 ["abc", "abcd", "aaa"] var s1 = "helloworld"; ss1 = s1.split(''); //["h", "e", "l", "l", "o", "w", "o", "r", "l", "d"]
                                                Run code
                                                Cut to clipboard
                                                  文章:js获取本周、本月、本季度、本年开始,结束时间  发表时间:2023-05-31, 16:58:32  
                                                  展开↯

                                                  #86

                                                  作者:广西河池市
                                                  Js获取当前日期时间及其它操作 var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4位,1970-????) myDate.getMonth(); //获取当前月份(0-11,0代表1月) myDate.getDate(); //获取当前日(1-31) myDate.getDay(); //获取当前星期X(0-6,0代表星期天) myDate.getTime(); //获取当前时间(从1970.1.1开始的毫秒数) myDate.getHours(); //获取当前小时数(0-23) myDate.getMinutes(); //获取当前分钟数(0-59) myDate.getSeconds(); //获取当前秒数(0-59) myDate.getMilliseconds(); //获取当前毫秒数(0-999) myDate.toLocaleDateString(); //获取当前日期 var mytime=myDate.toLocaleTimeString(); //获取当前时间 myDate.toLocaleString( ); //获取日期与时间 日期时间脚本库方法列表 Date.prototype.isLeapYear 判断闰年 Date.prototype.Format 日期格式化 Date.prototype.DateAdd 日期计算 Date.prototype.DateDiff 比较日期差 Date.prototype.toString 日期转字符串 Date.prototype.toArray 日期分割为数组 Date.prototype.DatePart 取日期的部分信息 Date.prototype.MaxDayOfDate 取日期所在月的最大天数 Date.prototype.WeekNumOfYear 判断日期所在年的第几周 StringToDate 字符串转日期型 IsValidDate 验证日期有效性 CheckDateTime 完整日期时间检查 daysBetween 日期天数差 js代码: //--------------------------------------------------- // 判断闰年 //--------------------------------------------------- Date.prototype.isLeapYear = function() { return (0==this.getYear()%4&&((this.getYear()%100!=0)||(this.getYear()%400==0))); } //--------------------------------------------------- // 日期格式化 // 格式 YYYY/yyyy/YY/yy 表示年份 // MM/M 月份 // W/w 星期 // dd/DD/d/D 日期 // hh/HH/h/H 时间 // mm/m 分钟 // ss/SS/s/S 秒 //--------------------------------------------------- Date.prototype.Format = function(formatStr) { var str = formatStr; var Week = ['日','一','二','三','四','五','六']; str=str.replace(/yyyy|YYYY/,this.getFullYear()); str=str.replace(/yy|YY/,(this.getYear() % 100)>9?(this.getYear() % 100).toString():'0' + (this.getYear() % 100)); str=str.replace(/MM/,this.getMonth()>9?this.getMonth().toString():'0' + this.getMonth()); str=str.replace(/M/g,this.getMonth()); str=str.replace(/w|W/g,Week[this.getDay()]); str=str.replace(/dd|DD/,this.getDate()>9?this.getDate().toString():'0' + this.getDate()); str=str.replace(/d|D/g,this.getDate()); str=str.replace(/hh|HH/,this.getHours()>9?this.getHours().toString():'0' + this.getHours()); str=str.replace(/h|H/g,this.getHours()); str=str.replace(/mm/,this.getMinutes()>9?this.getMinutes().toString():'0' + this.getMinutes()); str=str.replace(/m/g,this.getMinutes()); str=str.replace(/ss|SS/,this.getSeconds()>9?this.getSeconds().toString():'0' + this.getSeconds()); str=str.replace(/s|S/g,this.getSeconds()); return str; } //+--------------------------------------------------- //| 求两个时间的天数差 日期格式为 YYYY-MM-dd //+--------------------------------------------------- function daysBetween(DateOne,DateTwo) { var OneMonth = DateOne.substring(5,DateOne.lastIndexOf ('-')); var OneDay = DateOne.substring(DateOne.length,DateOne.lastIndexOf ('-')+1); var OneYear = DateOne.substring(0,DateOne.indexOf ('-')); var TwoMonth = DateTwo.substring(5,DateTwo.lastIndexOf ('-')); var TwoDay = DateTwo.substring(DateTwo.length,DateTwo.lastIndexOf ('-')+1); var TwoYear = DateTwo.substring(0,DateTwo.indexOf ('-')); var cha=((Date.parse(OneMonth+'/'+OneDay+'/'+OneYear)- Date.parse(TwoMonth+'/'+TwoDay+'/'+TwoYear))/86400000); return Math.abs(cha); } //+--------------------------------------------------- //| 日期计算 //+--------------------------------------------------- Date.prototype.DateAdd = function(strInterval, Number) { var dtTmp = this; switch (strInterval) { case 's' :return new Date(Date.parse(dtTmp) + (1000 * Number)); case 'n' :return new Date(Date.parse(dtTmp) + (60000 * Number)); case 'h' :return new Date(Date.parse(dtTmp) + (3600000 * Number)); case 'd' :return new Date(Date.parse(dtTmp) + (86400000 * Number)); case 'w' :return new Date(Date.parse(dtTmp) + ((86400000 * 7) * Number)); case 'q' :return new Date(dtTmp.getFullYear(), (dtTmp.getMonth()) + Number*3, dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds()); case 'm' :return new Date(dtTmp.getFullYear(), (dtTmp.getMonth()) + Number, dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds()); case 'y' :return new Date((dtTmp.getFullYear() + Number), dtTmp.getMonth(), dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds()); } } //+--------------------------------------------------- //| 比较日期差 dtEnd 格式为日期型或者有效日期格式字符串 //+--------------------------------------------------- Date.prototype.DateDiff = function(strInterval, dtEnd) { var dtStart = this; if (typeof dtEnd == 'string' )//如果是字符串转换为日期型 { dtEnd = StringToDate(dtEnd); } switch (strInterval) { case 's' :return parseInt((dtEnd - dtStart) / 1000); case 'n' :return parseInt((dtEnd - dtStart) / 60000); case 'h' :return parseInt((dtEnd - dtStart) / 3600000); case 'd' :return parseInt((dtEnd - dtStart) / 86400000); case 'w' :return parseInt((dtEnd - dtStart) / (86400000 * 7)); case 'm' :return (dtEnd.getMonth()+1)+((dtEnd.getFullYear()-dtStart.getFullYear())*12) - (dtStart.getMonth()+1); case 'y' :return dtEnd.getFullYear() - dtStart.getFullYear(); } } //+--------------------------------------------------- //| 日期输出字符串,重载了系统的toString方法 //+--------------------------------------------------- Date.prototype.toString = function(showWeek) { var myDate= this; var str = myDate.toLocaleDateString(); if (showWeek) { var Week = ['日','一','二','三','四','五','六']; str += ' 星期' + Week[myDate.getDay()]; } return str; } //+--------------------------------------------------- //| 日期合法性验证 //| 格式为:YYYY-MM-DD或YYYY/MM/DD //+--------------------------------------------------- function IsValidDate(DateStr) { var sDate=DateStr.replace(/(^\s+|\s+$)/g,''); //去两边空格; if(sDate=='') return true; //如果格式满足YYYY-(/)MM-(/)DD或YYYY-(/)M-(/)DD或YYYY-(/)M-(/)D或YYYY-(/)MM-(/)D就替换为'' //数据库中,合法日期可以是:YYYY-MM/DD(2003-3/21),数据库会自动转换为YYYY-MM-DD格式 var s = sDate.replace(/[\d]{ 4,4 }[\-/]{ 1 }[\d]{ 1,2 }[\-/]{ 1 }[\d]{ 1,2 }/g,''); if (s=='') //说明格式满足YYYY-MM-DD或YYYY-M-DD或YYYY-M-D或YYYY-MM-D { var t=new Date(sDate.replace(/\-/g,'/')); var ar = sDate.split(/[-/:]/); if(ar[0] != t.getYear() || ar[1] != t.getMonth()+1 || ar[2] != t.getDate()) { //alert('错误的日期格式!格式为:YYYY-MM-DD或YYYY/MM/DD。注意闰年。'); return false; } } else { //alert('错误的日期格式!格式为:YYYY-MM-DD或YYYY/MM/DD。注意闰年。'); return false; } return true; } //+--------------------------------------------------- //| 日期时间检查 //| 格式为:YYYY-MM-DD HH:MM:SS //+--------------------------------------------------- function CheckDateTime(str) { var reg = /^(\d+)-(\d{ 1,2 })-(\d{ 1,2 }) (\d{ 1,2 }):(\d{ 1,2 }):(\d{ 1,2 })$/; var r = str.match(reg); if(r==null)return false; r[2]=r[2]-1; var d= new Date(r[1],r[2],r[3],r[4],r[5],r[6]); if(d.getFullYear()!=r[1])return false; if(d.getMonth()!=r[2])return false; if(d.getDate()!=r[3])return false; if(d.getHours()!=r[4])return false; if(d.getMinutes()!=r[5])return false; if(d.getSeconds()!=r[6])return false; return true; } //+--------------------------------------------------- //| 把日期分割成数组 //+--------------------------------------------------- Date.prototype.toArray = function() { var myDate = this; var myArray = Array(); myArray[0] = myDate.getFullYear(); myArray[1] = myDate.getMonth(); myArray[2] = myDate.getDate(); myArray[3] = myDate.getHours(); myArray[4] = myDate.getMinutes(); myArray[5] = myDate.getSeconds(); return myArray; } //+--------------------------------------------------- //| 取得日期数据信息 //| 参数 interval 表示数据类型 //| y 年 m月 d日 w星期 ww周 h时 n分 s秒 //+--------------------------------------------------- Date.prototype.DatePart = function(interval) { var myDate = this; var partStr=''; var Week = ['日','一','二','三','四','五','六']; switch (interval) { case 'y' :partStr = myDate.getFullYear();break; case 'm' :partStr = myDate.getMonth()+1;break; case 'd' :partStr = myDate.getDate();break; case 'w' :partStr = Week[myDate.getDay()];break; case 'ww' :partStr = myDate.WeekNumOfYear();break; case 'h' :partStr = myDate.getHours();break; case 'n' :partStr = myDate.getMinutes();break; case 's' :partStr = myDate.getSeconds();break; } return partStr; } //+--------------------------------------------------- //| 取得当前日期所在月的最大天数 //+--------------------------------------------------- Date.prototype.MaxDayOfDate = function() { var myDate = this; var ary = myDate.toArray(); var date1 = (new Date(ary[0],ary[1]+1,1)); var date2 = date1.dateAdd(1,'m',1); var result = dateDiff(date1.Format('yyyy-MM-dd'),date2.Format('yyyy-MM-dd')); return result; } //+--------------------------------------------------- //| 取得当前日期所在周是一年中的第几周 //+--------------------------------------------------- Date.prototype.WeekNumOfYear = function() { var myDate = this; var ary = myDate.toArray(); var year = ary[0]; var month = ary[1]+1; var day = ary[2]; document.write('< script language=VBScript\> \n'); document.write('myDate = Datue(''+month+'-'+day+'-'+year+'') \n'); document.write('result = DatePart('ww', myDate) \n'); document.write(' \n'); return result; } //+--------------------------------------------------- //| 字符串转成日期类型 //| 格式 MM/dd/YYYY MM-dd-YYYY YYYY/MM/dd YYYY-MM-dd //+--------------------------------------------------- function StringToDate(DateStr) { var converted = Date.parse(DateStr); var myDate = new Date(converted); if (isNaN(myDate)) { //var delimCahar = DateStr.indexOf('/')!=-1?'/':'-'; var arys= DateStr.split('-'); myDate = new Date(arys[0],--arys[1],arys[2]); } return myDate; } 若要显示:当前日期加时间(如:2009-06-12 12:00) function CurentTime() { var now = new Date(); var year = now.getFullYear(); //年 var month = now.getMonth() + 1; //月 var day = now.getDate(); //日 var hh = now.getHours(); //时 var mm = now.getMinutes(); //分 var clock = year + "-"; if(month < 10) clock += "0"; clock += month + "-"; if(day < 10) clock += "0"; clock += day + " "; if(hh < 10) clock += "0"; clock += hh + ":"; if (mm < 10) clock += '0'; clock += mm; return(clock); }
                                                  Run code
                                                  Cut to clipboard
                                                    文章:js获取本周、本月、本季度、本年开始,结束时间  发表时间:2023-05-31, 16:58:00  
                                                    展开↯

                                                    #87

                                                    作者:广西河池市
                                                    centos7关闭ipv6
                                                    centos7使用ipv6协议,如果出现问题了将会很难排查,所以想要关闭ipv6,该怎么关闭呢?下面我们就来看看详细的教程。
                                                    1、使用ifconfig命令查看网卡信息,如果出现inet6 fe80::20c:29ff:fed0:3514,说明机器开启了ipv6
                                                    2、编辑/etc/sysctl.conf配置,增加net.ipv6.conf.all.disable_ipv6=1
                                                    3、编辑/etc/sysconfig/network配置,增加 NETWORKING_IPV6=no,保存并退出
                                                    4、编辑/etc/sysconfig/network-scripts/ifcfg-eno16777736,确保IPV6INIT=no,ifcfg-eno16777736是根据自己机器的,实际网卡信息来看,不是固定的
                                                    5、关闭防火墙的开机自启动
                                                    systemctl disable ip6tables.service
                                                    6、执行sysctl -p或者reboot重启命令
                                                    7、再次使用ifconfig进行验证,只剩下ipv4,ipv6消失了,关闭成功
                                                    文章:本地Linux CentOS7服务器安装笔记  发表时间:2023-05-30, 14:52:10  
                                                    展开↯

                                                    #88

                                                    作者:广西河池市
                                                    js 数组、对象转json 以及json转 数组、对象
                                                    1、JS对象转JSON
                                                    方式:JSON.stringify(obj)
                                                    var json = {"name":"iphone","price":666}; //创建对象; var jsonStr = JSON.stringify(json); //转为JSON字符串 console.log(jsonStr);
                                                    Run code
                                                    Cut to clipboard


                                                      2、JS数组转JSON
                                                      //数组转json串 var arr = [1,2,3, { a : 1 } ]; JSON.stringify( arr );
                                                      Run code
                                                      Cut to clipboard


                                                        3、JS对象数组转JSON
                                                        //数组转json串 var arr = [1,2,3, { a : 1 } ]; JSON.stringify( arr );
                                                        Run code
                                                        Cut to clipboard


                                                          4、JSON转JS数组
                                                          //json字符串转数组 var jsonStr = '[1,2,3,{"a":1}]'; var jsarr=JSON.parse( jsonStr ); alert(jsarr[0]);
                                                          Run code
                                                          Cut to clipboard

                                                              

                                                            5、JSON转JS对象
                                                            var jsonString = '{"bar":"property","baz":3}'; var jsObject = JSON.parse(jsonString); //转换为json对象 alert(jsObject.bar); //取json中的值
                                                            Run code
                                                            Cut to clipboard



                                                              #,广西河池市,2023-05-29,16:54:30, 小程序判断一个对象是否为空
                                                              ES6 新增的方法 Object.keys():
                                                              Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组。
                                                              如果我们的对象为空,他会返回一个空数组,如下:
                                                              var a = {} Object.keys(a) // []
                                                              Run code
                                                              Cut to clipboard

                                                                我们可以依靠Object.keys()这个方法通过判断它的长度来知道它是否为空。
                                                                if (Object.keys(object).length === 0) { return false // 如果为空,返回false } return true // 如果不为空,则会执行到这一步,返回true
                                                                Run code
                                                                Cut to clipboard

                                                                  文章:js 删除前confirm确认提示代码  发表时间:2023-05-29, 16:52:20  
                                                                  展开↯

                                                                  #89

                                                                  作者:广西河池市
                                                                  联表查询 group by order by desc 不支持排序
                                                                  支持排序的代码SELECT * , count( mid ) AS mid FROM ( SELECT A.mid, A.title, A.sortrank, A.pubdate FROM `acms_archives` AS A LEFT JOIN `acms_arctype` AS B ON A.typeid = B.id WHERE B.topid =18 AND A.arcrank =0 AND A.sortrank = A.pubdate AND A.pubdate >0 ORDER BY pubdate DESC ) AS z GROUP BY z.mid ORDER BY z.pubdate DESC LIMIT 0 , 7 原代码 SELECT A.title,A.sortrank,A.pubdate FROM `acms_archives` as A left join `acms_arctype` as B ON A.typeid = B.id where B.topid=18 and A.arcrank=0 and A.sortrank = A.pubdate and A.pubdate > 0 group by A.mid order by A.pubdate desc limit 0,7
                                                                  Run code
                                                                  Cut to clipboard
                                                                    展开↯

                                                                    #90

                                                                    作者:广西河池市
                                                                    php 写入文件,日志记录信息方法
                                                                    private function write_log($data){ $years = date('Y-m'); //设置路径目录信息 $url = './public/log/txlog/'.$years.'/'.date('Ymd').'_request_log.txt'; $dir_name=dirname($url); //目录不存在就创建 if(!file_exists($dir_name)) { //iconv防止中文名乱码 $res = mkdir(iconv("UTF-8", "GBK", $dir_name),0777,true); } $fp = fopen($url,"a");//打开文件资源通道 不存在则自动创建 fwrite($fp,var_export($data,true)."\r\n");//写入文件 fclose($fp);//关闭资源通道 }
                                                                    Run code
                                                                    Cut to clipboard
                                                                      文章:Thinkphp6配置使用Workerman WebSocket Socket  发表时间:2023-05-29, 16:38:04  
                                                                      展开↯

                                                                      #91

                                                                      作者:广西河池市
                                                                      小程序websocket(心跳连接)
                                                                      websocket连接之后,如果隔一段时间不聊天,运营商会认为你空占网络资源,强行关闭你的websocket连接,
                                                                      如果想要一直保持连接,就需要监听websocket关闭事件,等关闭时重新连接从而让websocket一直保持连接.
                                                                      这个过程称为心跳
                                                                      1、必须要有心跳,如果没有会自动断开连接。
                                                                      2‘、断开后必须取消setTimeout,不然会继续执行一次。
                                                                      3、发送消息只有在onSocketOpen后才会发送,所以添加一个消息数组,等连接成功后再发送。
                                                                      4、如果在还没连接成功时退出连接,会导致无法关闭,所以添加了socketClose来关闭socket
                                                                      // socket已经连接成功 var socketOpen = false // socket已经调用关闭function var socketClose = false // socket发送的消息队列 var socketMsgQueue = [] // 判断心跳变量 var heart = '' // 心跳失败次数 var heartBeatFailCount = 0 // 终止心跳 var heartBeatTimeOut = null; // 终止重新连接 var connectSocketTimeOut = null; var webSocket = { /** * 创建一个 WebSocket 连接 * @param {options} * url String 是 开发者服务器接口地址,必须是 wss 协议,且域名必须是后台配置的合法域名 * header Object 否 HTTP Header , header 中不能设置 Referer * method String 否 默认是GET,有效值:OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT * protocols StringArray 否 子协议数组 1.4.0 * success Function 否 接口调用成功的回调函数 * fail Function 否 接口调用失败的回调函数 * complete Function 否 接口调用结束的回调函数(调用成功、失败都会执行) */ connectSocket: function(options) { wx.showLoading({ title: '', mask: true, }) socketOpen = false socketClose = false socketMsgQueue = [] wx.connectSocket({ url: '开发者服务器接口地', success: function(res) { if (options) { // 成功回调 options.success && options.success(res); } }, fail: function(res) { if (options) { // 失败回调 options.fail && options.fail(res); } } }) }, /** * 通过 WebSocket 连接发送数据 * @param {options} * data String / ArrayBuffer 是 需要发送的内容 * success Function 否 接口调用成功的回调函数 * fail Function 否 接口调用失败的回调函数 * complete Function 否 接口调用结束的回调函数(调用成功、失败都会执行) */ sendSocketMessage: function(options) { if (socketOpen) { wx.sendSocketMessage({ data: options.msg, success: function(res) { if (options) { options.success && options.success(res); } }, fail: function(res) { if (options) { options.fail && options.fail(res); } } }) } else { socketMsgQueue.push(options.msg) } }, /** * 关闭 WebSocket 连接。 * @param {options} * code Number 否 一个数字值表示关闭连接的状态号,表示连接被关闭的原因。如果这个参数没有被指定,默认的取值是1000 (表示正常连接关闭) * reason String 否 一个可读的字符串,表示连接被关闭的原因。这个字符串必须是不长于123字节的UTF-8 文本(不是字符) * fail Function 否 接口调用失败的回调函数 * complete Function 否 接口调用结束的回调函数(调用成功、失败都会执行) */ closeSocket: function(options) { if (connectSocketTimeOut) { clearTimeout(connectSocketTimeOut); connectSocketTimeOut = null; } socketClose = true; var self = this; self.stopHeartBeat(); wx.closeSocket({ success: function(res) { console.log('WebSocket 已关闭!'); if (options) { options.success && options.success(res); } }, fail: function(res) { if (options) { options.fail && options.fail(res); } } }) }, // 收到消息回调 onSocketMessageCallback: function(msg) { }, // 开始心跳 startHeartBeat: function() { console.log('socket开始心跳') var self = this; heart = 'heart'; self.heartBeat(); }, // 结束心跳 stopHeartBeat: function() { console.log('socket结束心跳') var self = this; heart = ''; if (heartBeatTimeOut) { clearTimeout(heartBeatTimeOut); heartBeatTimeOut = null; } if (connectSocketTimeOut) { clearTimeout(connectSocketTimeOut); connectSocketTimeOut = null; } }, // 心跳 heartBeat: function() { var self = this; if (!heart) { return; } self.sendSocketMessage({ msg: JSON.stringify({ 'msg_type': 'heart' }), success: function(res) { console.log('socket心跳成功'); if (heart) { heartBeatTimeOut = setTimeout(() => { self.heartBeat(); }, 7000); } }, fail: function(res) { console.log('socket心跳失败'); if (heartBeatFailCount > 2) { // 重连 self.connectSocket(); } if (heart) { heartBeatTimeOut = setTimeout(() => { self.heartBeat(); }, 7000); } heartBeatFailCount++; }, }); } } // 监听WebSocket连接打开事件。callback 回调函数 wx.onSocketOpen(function(res) { console.log('WebSocket连接已打开!') wx.hideLoading(); // 如果已经调用过关闭function if (socketClose) { webSocket.closeSocket(); } else { socketOpen = true for (var i = 0; i < socketMsgQueue.length; i++) { webSocket.sendSocketMessage(socketMsgQueue[i]) } socketMsgQueue = [] webSocket.startHeartBeat(); } }) // 监听WebSocket错误。 wx.onSocketError(function(res) { console.log('WebSocket连接打开失败,请检查!', res) }) // 监听WebSocket接受到服务器的消息事件。 wx.onSocketMessage(function(res) { console.log('收到服务器内容:' + res.data) webSocket.onSocketMessageCallback(res.data) }) // 监听WebSocket关闭。 wx.onSocketClose(function(res) { console.log('WebSocket 已关闭!') if (!socketClose) { clearTimeout(connectSocketTimeOut) connectSocketTimeOut = setTimeout(() => { webSocket.connectSocket(); }, 3000); } }) module.exports = webSocket;
                                                                      Run code
                                                                      Cut to clipboard

                                                                        下面是使用方法
                                                                        // socket连接 const webSocket = require('../../utils/webSocket.js'); onLoad: function(options) { // 创建连接 webSocket.connectSocket(); // 设置接收消息回调 webSocket.onSocketMessageCallback = this.onSocketMessageCallback; }, // socket收到的信息回调 onSocketMessageCallback: function(msg) { console.log('收到消息回调', msg) }, onUnload: function(options) { // 页面销毁时关闭连接 webSocket.closeSocket(); },
                                                                        Run code
                                                                        Cut to clipboard
                                                                          文章:Thinkphp6配置使用Workerman WebSocket Socket  发表时间:2023-05-29, 16:35:07  
                                                                          展开↯

                                                                          #92

                                                                          作者:广西河池市
                                                                          php 将图片转成base64
                                                                          PHP保存Base64图片base64_decode的问题
                                                                          PHP对Base64的支持非常好,有内置的base64_encode与base64_decode负责图片的Base64编码与解码。
                                                                          编码上,只要将图片流读取到,而后使用base64_encode进行进行编码即可得到。
                                                                          /** * 获取图片的Base64编码(不支持url) * @date 2017-02-20 19:41:22 * * @param $img_file 传入本地图片地址 * * @return string */ function imgToBase64($img_file) { $img_base64 = ''; if (file_exists($img_file)) { $app_img_file = $img_file; // 图片路径 $img_info = getimagesize($app_img_file); // 取得图片的大小,类型等 //echo '<pre>' . print_r($img_info, true) . '</pre><br>'; $fp = fopen($app_img_file, "r"); // 图片是否可读权限 if ($fp) { $filesize = filesize($app_img_file); $content = fread($fp, $filesize); $file_content = chunk_split(base64_encode($content)); // base64编码 switch ($img_info[2]) { //判读图片类型 case 1: $img_type = "gif"; break; case 2: $img_type = "jpg"; break; case 3: $img_type = "png"; break; } $img_base64 = 'data:image/' . $img_type . ';base64,' . $file_content;//合成图片的base64编码 } fclose($fp); } return $img_base64; //返回图片的base64 } //调用使用的方法 $img_dir = dirname(__FILE__) . '/uploads/img/11213223.jpg'; $img_base64 = imgToBase64($img_dir); echo '<img src="' . $img_base64 . '">'; //图片形式展示 echo '<hr>'; echo $img_base64; //输出Base64编码
                                                                          Run code
                                                                          Cut to clipboard

                                                                            而解码就略微麻烦一点,究其原因在于把图片编码成base64字符串后,编码内会加入这些字符 data:image/png;base64,本来是用于base64进行识别的。但是如果直接放到php里用base64_decode函数解码会导致最终保存的图片文件格式损坏,而解决方法就是先去掉这一串字符:
                                                                            $base64_string= explode(',', $base64_string); //截取data:image/png;base64, 这个逗号后的字符 $data= base64_decode($base64_string[1]);  //对截取后的字符使用base64_decode进行解码 file_put_contents($url, $data); //写入文件并保存
                                                                            Run code
                                                                            Cut to clipboard
                                                                              文章:js获取本周、本月、本季度、本年开始,结束时间  发表时间:2023-05-29, 16:30:52  
                                                                              展开↯

                                                                              #93

                                                                              作者:广西河池市
                                                                              JS判断是否是微信打开页面
                                                                              function isWeiXin(){ var ua = window.navigator.userAgent.toLowerCase(); if(ua.match(/MicroMessenger/i) == 'micromessenger' || ua.match(/_SQ_/i) == '_sq_'){ return true; }else{ return false; } }
                                                                              Run code
                                                                              Cut to clipboard
                                                                                文章:js获取本周、本月、本季度、本年开始,结束时间  发表时间:2023-05-29, 16:21:51  
                                                                                展开↯

                                                                                #94

                                                                                作者:广西河池市
                                                                                js Array vs [],以及是否为空的判断
                                                                                两者基本相同,唯一不同点在于初始化:
                                                                                var a = [], // these are the same b = new Array(), // a and b are arrays with length 0 c = ['foo', 'bar'], // these are the same d = new Array('foo', 'bar'), // c and d are arrays with 2 strings // these are different: e = [3] // e.length == 1, e[0] == 3 f = new Array(3), // f.length == 3, f[0] == undefined
                                                                                Run code
                                                                                Cut to clipboard

                                                                                  也就是说Array(arg),其中的arg是指生成数组的长度。

                                                                                  参考:What’s the difference between “Array()” and “[]” while declaring a JavaScript array?

                                                                                  检查array是否为空:
                                                                                  if (array === undefined || array.length == 0) { // array empty or does not exist }
                                                                                  Run code
                                                                                  Cut to clipboard
                                                                                    文章:js获取本周、本月、本季度、本年开始,结束时间  发表时间:2023-05-29, 16:18:33  
                                                                                    展开↯

                                                                                    #95

                                                                                    作者:广西河池市
                                                                                    PHP中文处理 中文字符串截取(mb_substr)和获取中文字符串字数
                                                                                    一、中文截取:mb_substr() mb_substr( $str, $start, $length, $encoding ) $str,需要截断的字符串 $start,截断开始处,起始处为0 $length,要截取的字数 $encoding,网页编码,如utf-8,GB2312,GBK 实例: 复制代码 代码如下: <?php $str='脚本之家:http://www.jb51.net'; echo mb_substr($str,0,4,'utf-8');//截取头5个字,假定此代码所在php文件的编码为utf-8 ?> 结果显示:脚本之家 二、获取中文长度:mb_strlen() mb_strlen( $str, $encoding ) $str,要计算长度的字符串 $encoding,网页编码,如utf-8,GB2312,GBK 实例: 复制代码 代码如下: <?php $str='脚本之家:http://www.jb51.net'; echo mb_strlen($str,'utf-8');//假定此代码所在php文件的编码为utf-8 ?> 结果显示:24 学习时的痛苦是暂时的 未学到的痛苦是终生的
                                                                                    Run code
                                                                                    Cut to clipboard
                                                                                      文章:js获取本周、本月、本季度、本年开始,结束时间  发表时间:2023-05-29, 16:16:50  
                                                                                      展开↯
                                                                                      你好,残忍屏蔽广告

                                                                                      确定要清除编辑框内容吗?

                                                                                      该删除操作将不可恢复。

                                                                                      删除 取消

                                                                                      激活Windows

                                                                                      转到"设置"以激活Windows。