阳历转换成阴历PHP实现详解

相关概念

阳历,有很强的规律性。每年12个月,1、3、5、7、8、10、12月都为31天;平年2月份28天,润年2月份29天,其余的月30天。

阴历,却没有这些规律可循。平年十二个月,大月三十天,小月二十九天,全年354天或355天(一年中哪个月大,哪个月小,年年不同)。由于每年的天数比太阳年约差十一天,所以在十九年里设置七个闰月,有闰月的年份全年383天或384天。又根据太阳的位置,把一个太阳年分成二十四个节气,以利于农业种植等活动。纪年用天干地支搭配,六十年周而复始。这种历法相传创始于夏代,所以又称为夏历。也叫旧历。 因此,推算阴历就没有一个统一的算法。

公历=阳历 是世界通用的日期也就是我们平常的日期

农历=阴历 是我国古代用来农耕的日期,也就是日历下面的小字所表示的日期

1,阳历–以地球绕太阳一周为一年所定出的历法.

2,阴历–以太阴(月亮)绕地球为一个月,12个月为一年(闰年为13个月)所定出来的历法.(以闰月调节年之四时).

思路解析

总体思路

要想计算给定的时间对于的农历是哪一天,我们需要找一个参考时间,然后以该参考时间计算以后的时间。首先计算当前时间与参考时间相差的天数,然后通过求出农历每年的天数,计算当前时间对应的是哪一年的第几天,最后计算出属于那个月的哪一个日期。

怎样计算生肖

因为共计12个生肖,”鼠”,”牛”,”虎”,”兔”,”龙”,”蛇”,”马”,”羊”,”猴”,”鸡”,”狗”,”猪”,那么每12年一个轮回。当前2016年是猴年,如果从0开始计数,猴排在第8个,且2016 % 12= 0===》(2016 % 12 +8) %12 ==8

于是可以得出公式(y代表阳历年份)

(y % 12 +8) %12

以上公式可以简化

(y % 12 -4) %12

再次简化

(y -4) %12

怎样计算天干地支

中国古代的一种纪年法。即以甲、乙、丙、丁、戊、己、庚、辛、壬、癸为十干,子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥为十二支,把干、支顺序配合。如甲子、乙丑…甲戌等,经过六十年又回到甲子。周而复始,循环不已。

且查日历可以得知1900 年是===>庚子年 丁丑月 甲辰日

假设天干地支序号都从0开始,庚排在6号位,子排在0号位

针对年而言

(1900 -4) % 10 =6 ===>庚

(1900-4) % 12 =4 ===>子

于是总结公式如下(农历年y)

(y-4) % 10 ==>天干对应的位置编号

(y-4) % 12 ==>地支对应的位置编号

同理,可以求出对应的月和,只是针对月和日,需要考虑的是闰月问题,不再细说。

具体实现

所有代码如下:

<?php
/**
*author:dequan
*date:2016-06-20
*原文地址:http://blog.csdn.net/hsd2012/article/details/51701640
*/
class Calendar{
    private $animals=array("鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪");
    private $curData=null;//当前阳历时间
    private $ylYeal=0;
    private $ylMonth=0;
    private $yldate=0;
    private $ylDays=0; //当前日期是农历年的第多少天
    private $leap=0;//代表润哪一个月
    private $leapDays=0;//代表闰月的天数
    private $difmonth=0;//当前时间距离参考时间相差多少月
    private $difDay=0;//当前时间距离参考时间相差多少天
    private $tianGan=array("甲","乙","丙","丁","戊","己","庚","辛","壬","癸");
    private $diZhi=array("子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥");
    private $dataInfo=array(0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2,//1900-1909
0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977,//1910-1919
0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970,//1920-1929
0x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950,//1930-1939
0x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557,//1940-1949
0x06ca0,0x0b550,0x15355,0x04da0,0x0a5b0,0x14573,0x052b0,0x0a9a8,0x0e950,0x06aa0,//1950-1959
0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,//1960-1969
0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b6a0,0x195a6,//1970-1979
0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570,//1980-1989
0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0,//1990-1999
0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5,//2000-2009
0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930,//2010-2019
0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530,//2020-2029
0x05aa0,0x076a3,0x096d0,0x04bd7,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45,//2030-2039
0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0,//2040-2049
/**Add By [email protected]**/
0x14b63,0x09370,0x049f8,0x04970,0x064b0,0x168a6,0x0ea50, 0x06b20,0x1a6c4,0x0aae0,//2050-2059
0x0a2e0,0x0d2e3,0x0c960,0x0d557,0x0d4a0,0x0da50,0x05d55,0x056a0,0x0a6d0,0x055d4,//2060-2069
0x052d0,0x0a9b8,0x0a950,0x0b4a0,0x0b6a6,0x0ad50,0x055a0,0x0aba4,0x0a5b0,0x052b0,//2070-2079
0x0b273,0x06930,0x07337,0x06aa0,0x0ad50,0x14b55,0x04b60,0x0a570,0x054e4,0x0d160,//2080-2089
0x0e968,0x0d520,0x0daa0,0x16aa6,0x056d0,0x04ae0,0x0a9d4,0x0a2d0,0x0d150,0x0f252,//2090-2099
0x0d520);
    public function __construct($curData=null){
        if(!empty($curData)){
            $this->curData=$curData;
        }else{
            $this->curData=date(‘Y-n-j‘);
        }
        $this->init();
    }

    public function init(){
        $basedate=‘1900-1-31‘;//参照日期
        $timezone=‘PRC‘;
        $datetime= new DateTime($basedate, new DateTimeZone($timezone));
        $curTime=new DateTime($this->curData, new DateTimeZone($timezone));
        $offset   = ($curTime->format(‘U‘) - $datetime->format(‘U‘))/86400; //相差的天数
        $offset=ceil($offset);
        $this->difDay=$offset;
        $offset+=1;//只能使用ceil,不能使用intval或者是floor,因为1900-1-31为正月初一,故需要加1
        for($i=1900; $i<2050 && $offset>0; $i++){
          $temp = $this->getYearDays($i); //计算i年有多少天
          $offset -= $temp ;
          $this->difmonth+=12;
          //判断该年否存在闰月
          if($this->leapMonth($i)>0){
            $this->difmonth+=1;
          }
        }

        if($offset<0){
          $offset += $temp;
          $i--;
          $this->difmonth-=12;
        }
        if($this->leapMonth($i)>0){
            $this->difmonth-=1;
        }
        $this->ylDays=$offset;
        //此时$offset代表是农历该年的第多少天
        $this->ylYeal=$i;//农历哪一年
        //计算月份,依次减去1~12月份的天数,直到offset小于下个月的天数
        $curMonthDays=$this->monthDays($this->ylYeal,1);
        //判断是否该年是否存在闰月以及闰月的天数
        $this->leap=$this->leapMonth($this->ylYeal);
        if($this->leap !=0){
            $this->leapDays=$this->leapDays($this->ylYeal);
        }

        for($i=1;$i<13 && $curMonthDays<$offset;$curMonthDays=$this->monthDays($this->ylYeal,++$i)){
            if($this->leap == $i){ //闰月
                if($offset>$this->leapDays){
                    --$i;
                    $offset-=$this->leapDays;
                    $this->difmonth+=1;
                }else{
                    break;
                }
            }else{
                $offset-=$curMonthDays;
                $this->difmonth+=1;
            }
        }

        $this->ylMonth=$i;
        $this->yldate=$offset;
    }
    /**
    *计算农历y年有多少天
    **/
    public function getYearDays($y){
       $sum = 348;//12*29=348,不考虑小月的情况下
       for($i=0x8000; $i>=0x10; $i>>=1){
            $sum += ($this->dataInfo[$y-1900] & $i)? 1: 0;
       }
       return($sum+$this->leapDays($y));
    }
    /**
    *获取某一年闰月的天数
    **/
    public function leapDays($y){
        if($this->leapMonth($y)){
            return(($this->dataInfo[$y-1900] & 0x10000)? 30: 29);

        } else {
            return(0);
        }
    }
    /**
    *计算哪一月为闰月
    */
    public  function leapMonth($y){
        return ($this->dataInfo[$y-1900] & 0xf);
    }
    /**
    *计算农历y年m月有多少天
    */
    public function monthDays($y,$m){
        return (($this->dataInfo[$y-1900] & (0x10000>>$m))? 30: 29 );
    }

    public function getLyTime(){
        $tmp=array(‘初‘,‘一‘,‘二‘,‘三‘,‘四‘,‘五‘,‘六‘,‘七‘,‘八‘,‘九‘,‘十‘,‘廿‘);
        $dateStr=‘‘;
        if($this->ylMonth>10){
            $m2=intval($this->ylMonth -10); //十位
            $dateStr=‘十‘.$tmp[$m2].‘月‘;
        }elseif($this->ylMonth==1){
            $dateStr=‘正月‘;
        }else{
            $dateStr=$tmp[$this->ylMonth].‘月‘;
        }

        if($this->yldate <11){
            $dateStr.=‘初‘.$tmp[$this->yldate];
        }else{
            $m1=intval($this->yldate / 10);
            if( $m1 !=3){
                $dateStr.=($m1==1)?‘十‘:‘廿‘;
                $m2=$this->yldate % 10;
                if($m2==0){
                    $dateStr.=‘十‘;
                }else{
                    $dateStr.=$tmp[$m2];
                }
            }else{
                $dateStr.=‘三十‘;
            }
        }
        return $dateStr;
    }
    /**
    *获取该年对于的天干地支年
    **/
    public function getYGanZhi(){
        $gan=$this->tianGan[($this->ylYeal-4) % 10];
        $zhi=$this->diZhi[($this->ylYeal-4) % 12];
        return $gan.$zhi.‘年‘;
    }
    /**
    *获取该年对于的天干地支月
    **/
    public function getMGanZhi(){
        $gan=$this->tianGan[($this->difmonth+3) % 10];
        $zhi=$this->diZhi[($this->difmonth+1) % 12];
        return $gan.$zhi.‘月‘;
    }
    /**
    *获取该年对于的天干地支日
    **/
    public function getDGanZhi(){
        $gan=$this->tianGan[$this->difDay % 10];
        $zhi=$this->diZhi[($this->difDay+4) % 12];
        return $gan.$zhi.‘日‘;
    }
}
$c=new Calendar();
$time=$c->getLyTime();
trace(date(‘Y-n-j‘).‘对应的农历时间:‘.$time);

$c=new Calendar(‘2014-10-1‘);
$time=$c->getLyTime();
trace(date(‘Y-n-j‘).‘对应的农历时间:‘.$time);

function trace($info=‘‘){
    echo ‘<pre>‘;
    print_r($info);
    echo ‘</pre>‘;
}

效果图如下

对比百度中日历

测试okey。

********暂时没有添加节假日以及星座等,后期会考虑添加更***

细节相关说明

农历十六进制数据解析

1900年的数据是: 0x04bd8

二进制:0000 0100 1011 1101 1000

(如果不想自己推算,在JS里面可以通过console.log(0x04bd8.toString(2));来转换)

对应这些二进制描述如下:

前4位,在这一年是润年时才有意义,它代表这年润月的大小月,1润大月30天,0润小月29天。

中间12位,每位代表一个月,为1则为大月30天,为0则为小月29天

最后4位,即8,代表这一年的润月月份,为0则不润。首4位要与末4位搭配使用。

二进制 解析
0000 闰月为小月
0100 1011 1101 1~12个月,每个月包含的天数
1000 代表哪个月为闰月,为0的时候,代表没有闰月

故由以上信息可知1900年闰8月,且闰月为小月,从1月到12月的天数依次为:29、30 、29、29、30、29、 30、30、29(闰月)、30、30、29、30。

通过查询百度日历,也可以验证上面我推算

1900~2100年

0x04bd8,x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2,//1900-1909
0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977,//1910-1919
0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970,//1920-1929
0x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950,//1930-1939
0x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557,//1940-1949
0x06ca0,0x0b550,0x15355,0x04da0,0x0a5b0,0x14573,0x052b0,0x0a9a8,0x0e950,0x06aa0,//1950-1959
0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,//1960-1969
0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b6a0,0x195a6,//1970-1979
0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570,//1980-1989
0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0,//1990-1999
0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5,//2000-2009
0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930,//2010-2019
0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530,//2020-2029
0x05aa0,0x076a3,0x096d0,0x04bd7,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45,//2030-2039
0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0,//2040-2049
0x14b63,0x09370,0x049f8,0x04970,0x064b0,0x168a6,0x0ea50, 0x06b20,0x1a6c4,0x0aae0,//2050-2059
0x0a2e0,0x0d2e3,0x0c960,0x0d557,0x0d4a0,0x0da50,0x05d55,0x056a0,0x0a6d0,0x055d4,//2060-2069
0x052d0,0x0a9b8,0x0a950,0x0b4a0,0x0b6a6,0x0ad50,0x055a0,0x0aba4,0x0a5b0,0x052b0,//2070-2079
0x0b273,0x06930,0x07337,0x06aa0,0x0ad50,0x14b55,0x04b60,0x0a570,0x054e4,0x0d160,//2080-2089
0x0e968,0x0d520,0x0daa0,0x16aa6,0x056d0,0x04ae0,0x0a9d4,0x0a2d0,0x0d150,0x0f252,//2090-2099
0x0d520////2100

为什么选择阳历1900.1.31作为参考点

因为能找到最早的农历十六进制数据是1900年。且通过查询,可以得知,阳历1900.1.31,正好是农历1900.1.1。这样便于推算

怎样计算农历y年有多少天

在上面,我们可以由农历十六进制数据推算,每个月有多少天,以及是否闰月,那么久很容易推算出某一年有多少天,但是,我们是将其转为二进制来计算的。如1990 <====>0x04bd8,转换成二进制为

0000 0100 1011 1100 0100,怎样才能分别得到其第5位到第16位上的数字呢?这时候,我们可以通过与运算来实现。让其分别如以下二进制做与运算

0000 1000 0000 0000 0000 ===>0x08000 ==>如果为0,代表第5位上的数字为0,否则为1

0000 0100 0000 0000 0000 ===>0x04000 ==>如果为0,代表第6位上的数字为0,否则为1

0000 0010 0000 0000 0000 ===>0x02000 ==>如果为0,代表第7位上的数字为0,否则为1

********************中间省略********************************

0000 0000 0000 0010 0000 ===>0x00020 ==>如果为0,代表第15位上的数字为0,否则为1

0000 0000 0000 0001 0000 ===>0x00010 ==>如果为0,代表第16位上的数字为0,否则为1

0x08000 ====>0x00010

于是可以使用循环语句如下

for($i=0x8000; $i>=0x10; $i>>=1){
    $curNum=0x04bd8 && $i ? 1 :0;
}

这样计算农历y年有多少天程序就比较容易实现

    /**
    *计算农历y年有多少天
    **/
    public function getYearDays($y){
       $sum = 348;//12*29=348,不考虑小月的情况下
       for($i=0x8000; $i>=0x10; $i>>=1){
            $sum += ($this->dataInfo[$y-1900] & $i)? 1: 0;
       }
       return($sum+$this->leapDays($y));
    }
    /**
    *获取某一年闰月的天数
    **/
    public function leapDays($y){
        if($this->leapMonth($y)){
            return(($this->dataInfo[$y-1900] & 0x10000)? 30: 29);

        } else {
            return(0);
        }
    }
    /**
    *计算哪一月为闰月
    */
    public  function leapMonth($y){
        return ($this->dataInfo[$y-1900] & 0xf);
    }

PHP 32位怎样解决时间戳范围的限制问题

当我们在求一个时间的时间戳的时候,如果时间太靠前或者是太靠后,PHP是不能给出正确的解析,如下

var_dump(strtotime(‘1900-1-31‘));  //返回false
var_dump(strtotime(‘2050-3-01‘));//返回false

查看手册可以看到

对于PHP 64位版本来说,就不存在时间戳范围的限制了

为了解决时间范围的限制的问题,PHP5.2及以上版本提供了DateTime类。

$c1=new DateTime(‘1900-1-31‘, new DateTimeZone(‘PRC‘));
$c2=new DateTime(‘2111-01-01‘,new DateTimeZone(‘PRC‘));

var_dump($c1->format(‘U‘)); //-2206425600
var_dump($c2->format(‘U‘));//4449484800
时间: 06-20

阳历转换成阴历PHP实现详解的相关文章

如何利用自定义函数把阳历转换成阴历

数据库保存的是阳历日期,有时候会遇到把阳历换成阴历的需求,例如下图把阳历转换成阴历. 这个问题是我在开发报表过程中遇到的一个小需求,利用的工具是FineReport8.0版本,解决思路是首先定义一个可以将阳历转为阴历的类,然后自定义FineReport函数,在run方法中获取年月日参数并调用之前的类将阳历转为阴历,最终返回给报表. 实现步骤: 1.  阳历转阴历的类 FineReport里面会提供一个现成的农历日历工具类SolarToLunar,该类中通过today(intyear, int m

【转载ToString()转换格式;DateTime.ToString()用法详解】

ToString()转换格式;DateTime.ToString()用法详解 格式模式 说明和关联属性 c.C 货币格式.关联的属性包括: CurrencyDecimalDigits, CurrencyDecimalSeparator, CurrencyGroupSeparator, CurrencyGroupSizes, CurrencyNegativePattern, CurrencyPositivePattern, CurrencySymbol. d.D 十进制格式. e.E 科学计数(指

什么尼康没有把取景线条设置成九宫格,而是设置成16格,详解

http://forum.xitek.com/thread-1008606-1-1-1.html 看到一个神贴,详细解释了为什么尼康没有吧取景线条设置成九宫格,而是设置成16格.在此,向鹿鸣幽谷 表示感谢.解决我一个大问题. 鹿鸣幽谷 在实时取景中才能显示,取景器内没有.用屏幕实时取景的时候,按快门旁边的 info 键,屏幕会有三种模式(名字都是我起的,就那个意思):信息量少的干净模式.当前拍摄参数显示.分割线模式(代替黄金分割模式).D3100并没有像传统相机那样提供九宫格,当初我也很纳闷,觉

如何快速将文件中的空格更换成逗号(图文详解)

不多说,直接上干货! 现有一份数据如下. 下载日志数据并分析 到搜狗实验室下载用户查询日志 1) 介绍 搜索引擎查询日志库设计为包括约1个月(2008年6月)Sogou搜索引擎部分网页查询需求及用户点击情况的网页查询日志数据集合.为进行中文搜索引擎用户行为分析的研究者提供基准研究语料. 2)   格式说明 数据格式为:访问时间\t用户ID\t[查询词]\t该URL在返回结果中的排名\t用户点击的顺序号\t用户点击的URL 其中,用户ID是根据用户使用浏览器访问搜索引擎时的Cookie信息自动赋值

如何快速将文本中的tab更换成逗号(图文详解)

不多说,直接上干货! 现有一份数据如下. 下载日志数据并分析 到搜狗实验室下载用户查询日志 1) 介绍 搜索引擎查询日志库设计为包括约1个月(2008年6月)Sogou搜索引擎部分网页查询需求及用户点击情况的网页查询日志数据集合.为进行中文搜索引擎用户行为分析的研究者提供基准研究语料. 2)   格式说明 数据格式为:访问时间\t用户ID\t[查询词]\t该URL在返回结果中的排名\t用户点击的顺序号\t用户点击的URL 其中,用户ID是根据用户使用浏览器访问搜索引擎时的Cookie信息自动赋值

Scala中隐式参数与隐式转换的联合使用实战详解及其在Spark中的应用源码解析之Scala学习笔记-51

package com.leegh.implicits /** * @author Guohui Li */ object Implicit_Conversions_with_Implicit_Parameters { def main(args: Array[String]): Unit = { def bigger[T](a: T, b: T)(implicit ordered: T => Ordered[T]) = if (ordered(a) > b) a else b println

Spark进阶视频之Scala中隐式参数与隐式转换的联合使用实战详解及其在Spark中的应用源码解析

王家林亲授<DT大数据梦工厂>大数据实战视频"Scala深入浅出实战经典"视频.音频和PPT下载! 欢迎广大Spark爱好者学习交流.也欢迎广大学习爱好者加入DT大数据梦工厂交流群:462923555DT大数据微信公众账号:DT_Spark 视频观看链接http://www.tudou.com/plcover/Yy5F5gsurSE/ 视频下载地址百度云:http://pan.baidu.com/s/1eQGqzEa腾讯微云:http://url.cn/SshT6b

Redis实战 | 5种Redis数据类型详解

我们知道Redis是目前非常主流的KV数据库,它因高性能的读写能力而著称,其实还有另外一个优势,就是Redis提供了更加丰富的数据类型,这使得Redis有着更加广泛的使用场景.那Redis提供给用户的有哪些数据类型呢?主要有:string(字符串).List(列表).Set(集合).Hash(哈希).Zset(有序集合).HyperLogLogs(计算基数用的一种数据结构).Streams(Redis 5.0提供一种建模日志用的全新数据结构). 需要注意的是这里说的数据类型是指Redis值的数据

iOS疯狂详解之录制音频转换成Mp3

使用第三方 lame ,Mp3音频编码器. 使用 AVAudioRecorder 进行音频录制之前,进行参数设置: NSString *recordTemporaryPathString = [NSString stringWithFormat:@"%@/temporary",self.audioTemporarySavePath]; //LinearPCM 是iOS的一种无损编码格式,但是体积较为庞大 //录音设置 NSMutableDictionary *recordSetting