ReactNative 獲取農(nóng)歷(陰歷)

ReactNative 獲取農(nóng)歷(陰歷)

因?yàn)闆]有用到農(nóng)歷年份,所以此方法中沒有處理年份

1、LunarUtil.js

var LunarUtil= {

data: [

/*

二進(jìn)制形式

xxxx? ? xxxx? ? xxxx? ? xxxx? ? xxxx

20-17? 16-12? 12-9? ? 8-5? ? 4-1

1-4: 表示當(dāng)年有無閏年,有的話,為閏月的月份,沒有的話,為0。

5-16:為除了閏月外的正常月份是大月還是小月,1為30天,0為29天。

注意:從1月到12月對應(yīng)的是第16位到第5位。

17-20: 表示閏月是大月還是小月,僅當(dāng)存在閏月的情況下有意義。

舉個(gè)例子:

以我的生日1987年威力,1987年的數(shù)據(jù)是: 0x0af46

二進(jìn)制:0000 1010 1111 0100 0110

從1月到12月的天數(shù)依次為:

5-16位 1? 0? 1? 0? 1? 1? 1? 1? 0? 1? 0? 0

每月日數(shù)? 30 29 30 29 30 30 30 30 29 30 29 29

對應(yīng)月份? 1? 2? 3? 4? 5? 6? 7? 8? 9? 10 11 12

0110 (1-4位) 表示1987年有閏月,閏六月

0000 (17-20位) 存在閏月,本字段有效,表示閏小月 29天

補(bǔ)充閏月后的每月日期

每月日數(shù)? 30 29 30 29 30 30 29 30 30 29 30 29 29

對應(yīng)月份? 1? 2? 3? 4? 5? 6? 閏 7? 8? 9? 10 11 12

*/

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

0x14b63//2050

],

numString:'一二三四五六七八九十',

monString:'正二三四五六七八九十冬臘',

//獲取農(nóng)歷年份信息

getData:function(year){

return this.data[year -1900];

},

//返回閏月是哪個(gè)月,沒有閏月返回0

getLeapMonth:function(year, lunarData){

lunarData = lunarData ||this.getData(year);//如果傳入lunarData,為了提高性能,不再進(jìn)行計(jì)算

/*

1-4位表示閏月,例如:0010

lunarData? : xxxx xxxx xxxx xxxx 0010

0xf? ? ? ? : 0000 0000 0000 0000 1111

&運(yùn)算? ? : 0000 0000 0000 0000 0010

*/

returnlunarData &0xf;

},

//返回閏月天數(shù)

getLeapDays:function(year, lunarData){

lunarData = lunarData ||this.getData(year);

if(this.getLeapMonth(year, lunarData) ){

/*

17-20位表示閏月是大小月,例如:0001

lunarData? : 0000 xxxx xxxx xxxx xxxx

0x10000? ? : 0001 0000 0000 0000 0000

&運(yùn)算? ? : 0000 0000 0000 0000 0000

*/

return(lunarData &0x10000) ?30:29;

}else{

return0;

}

},

//農(nóng)歷某年某月的天數(shù)

getMonthDays:function(year, month, lunarData){

lunarData = lunarData ||this.getData(year);

/*

5-16位 表示每個(gè)月的天數(shù)

lunarData? : xxxx 0100 0100 0100 xxxx

0x8000? ? ? : 0000 1000 0000 0000 0000

0x8000>>8 : 0000 0000 0001 0000 0000

&運(yùn)算? ? : 0000 0000 0000 0000 0000

*/

return(lunarData &0x8000>>month) ?30:29;

},

//農(nóng)歷年總天數(shù)

getLunarDays:function(year, lunarData){

lunarData = lunarData ||this.getData(year);

//如果存在 總天數(shù) 緩存,則返回緩存

/*

this.cacheLunarDays = this.cacheLunarDays || {};

if( year in this.cacheLunarDays ){

return this.cacheLunarDays[year];

}

*/

var days=348;//本年的12個(gè)月,都當(dāng)作小月處理。 12 x 29 = 348

/*

5-16位 表示每個(gè)月的天數(shù)

lunarData? : xxxx 0100 0100 0100 xxxx

0x8000? ? ? : 0000 1000 0000 0000 0000

&運(yùn)算? ? : 0000 0000 0000 0000 0000

0x8? ? ? ? : 0000 0000 0000 0000 1000

&運(yùn)算? ? : 0000 0000 0000 0000 0000

*/

for(varmonthIndex=0x8000;monthIndex>0x8;monthIndex>>=1){

days+= (lunarData &monthIndex) ?1:0;

}

returndays+this.getLeapDays(year, lunarData);

/*

this.cacheLunarDays[year] = days + this.getLeapDays(year, lunarData);

return this.cacheLunarDays[year];

*/

},

//傳入一個(gè)日期,計(jì)算農(nóng)歷信息

toLunar:function(date, _date){

//如果傳入 _date,則將農(nóng)歷信息添加到 _date中

var_date= _date || {};

varreturnLunar='';

varcurrentYear= date.getFullYear();//當(dāng)前年份

varlunarData=this.getData(currentYear);//緩存 lunarData,節(jié)省性能

varlunarDays=this.getLunarDays(currentYear,lunarData);//農(nóng)歷天數(shù)

/*

daysOffset == 相差天數(shù)

為了減少不必要的性能浪費(fèi)(為什么要從1900算到今年),參考日期以2016年春節(jié)為準(zhǔn)(2016-2-8)

*/

var daysOffset= (newDate(date.getFullYear(), date.getMonth() +1, date.getDate()) -newDate(2016,1,8)) /86400000;

//獲取年數(shù)

if(daysOffset>=lunarDays){

//2017年和以后

while(daysOffset>=lunarDays){

daysOffset-=lunarDays;

lunarData=this.getData(++currentYear);

lunarDays=this.getLunarDays(currentYear,lunarData);

}

}else if(daysOffset<0){

//2016年前

while(daysOffset<0){

lunarData=this.getData(--currentYear);

lunarDays=this.getLunarDays(currentYear,lunarData);

daysOffset+=lunarDays;

}

daysOffset++;

}

_date.lunarYear=currentYear;

//本年是否為閏月

var leapMonth=this.getLeapMonth(currentYear,lunarData);

//獲取月數(shù)

var currentMonth,currentMonthDays;

for(currentMonth=1;currentMonth<12;currentMonth++ ){

_date.isLeap=false;

///如果有閏月

if(leapMonth){

if(currentMonth>leapMonth){

currentMonth--;

leapMonth=0;

_date.isLeap=true;

returnLunar='閏';

}

}

currentMonthDays=this.getMonthDays(currentYear,currentMonth);

if(daysOffset>currentMonthDays){

daysOffset-=currentMonthDays;

}else{

break;

}

}

returnLunar+=this.monString.charAt(currentMonth-1);

returnLunar+='月';

returnLunar+= (daysOffset<11)?"初":((daysOffset<20)?"十":((daysOffset<30)?"廿":"三"));

if(daysOffset%10!=0||daysOffset==10){

returnLunar+=this.numString.charAt((daysOffset-1)%10);

}else{

returnLunar+='十';

}

//獲取農(nóng)歷月

_date.lunarMonth=currentMonth;

//獲取農(nóng)歷日

_date.lunarDay=daysOffset;

return returnLunar;

},

//返回今日信息

today:function(){

return this.toLunar(newDate());

}

};

//如果需要模塊導(dǎo)出

module.exports =LunarUtil;

2、使用

import LunarUtil from '../utils/LunarUtil'

let cDate= LunarUtil.today();

3、效果


效果

參考

https://segmentfault.com/q/1010000007433570?

http://www.thinksaas.cn/topics/0/411/411504.html?


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 12,378評論 6 13
  • SwiftDate概況 從Swift發(fā)布起,我們就沒有放棄使用Swift。 當(dāng)然,我們希望在項(xiàng)目能夠輕松自如地管理...
    Mee_Leo閱讀 10,334評論 1 13
  • 如果不注意,大概很多人認(rèn)為“閏月”與“閏年”是一個(gè)意思,其實(shí)不是,雖說只是一字之差,所包含的意思卻相差很遠(yuǎn)。 “閏...
    雨落未驚風(fēng)閱讀 13,454評論 1 2
  • iOS開發(fā)中,經(jīng)常會遇到各種各樣的時(shí)間問題,8小時(shí)時(shí)差,時(shí)間戳,求時(shí)間間隔,農(nóng)歷等等。解決辦法網(wǎng)上比比皆是,但大多...
    小李龍彪閱讀 6,741評論 1 6
  • 十二歲那年 我處于林木間 茂盛的小灌木 長滿蘑菇 空氣里是大自然濕潤的氣味 我沒抬頭看那皎潔的月色 它卻如輕紗般覆...
    魔旅行閱讀 302評論 0 0

友情鏈接更多精彩內(nèi)容