@[TOC]Erlang公历转农历

Erlang公历转农历

碰到需要Erlang语言公历转农历需求,网上找了好久没找到,自己写了一个供参考,废话不说,直上代码

Erlang公历转农历

%% 农历1900-2100,16进制表示
-define (LUNAR_INFO,[16#04bd8,16#04ae0,16#0a570,16#054d5,16#0d260,16#0d950,16#16554,16#056a0,16#09ad0,16#055d2,%% 1900-190916#04ae0,16#0a5b6,16#0a4d0,16#0d250,16#1d255,16#0b540,16#0d6a0,16#0ada2,16#095b0,16#14977,%% 1910-191916#04970,16#0a4b0,16#0b4b5,16#06a50,16#06d40,16#1ab54,16#02b60,16#09570,16#052f2,16#04970,%% 1920-192916#06566,16#0d4a0,16#0ea50,16#16a95,16#05ad0,16#02b60,16#186e3,16#092e0,16#1c8d7,16#0c950,%% 1930-193916#0d4a0,16#1d8a6,16#0b550,16#056a0,16#1a5b4,16#025d0,16#092d0,16#0d2b2,16#0a950,16#0b557,%% 1940-194916#06ca0,16#0b550,16#15355,16#04da0,16#0a5b0,16#14573,16#052b0,16#0a9a8,16#0e950,16#06aa0,%% 1950-195916#0aea6,16#0ab50,16#04b60,16#0aae4,16#0a570,16#05260,16#0f263,16#0d950,16#05b57,16#056a0,%% 1960-196916#096d0,16#04dd5,16#04ad0,16#0a4d0,16#0d4d4,16#0d250,16#0d558,16#0b540,16#0b6a0,16#195a6,%% 1970-197916#095b0,16#049b0,16#0a974,16#0a4b0,16#0b27a,16#06a50,16#06d40,16#0af46,16#0ab60,16#09570,%% 1980-198916#04af5,16#04970,16#064b0,16#074a3,16#0ea50,16#06b58,16#05ac0,16#0ab60,16#096d5,16#092e0,%% 1990-199916#0c960,16#0d954,16#0d4a0,16#0da50,16#07552,16#056a0,16#0abb7,16#025d0,16#092d0,16#0cab5,%% 2000-200916#0a950,16#0b4a0,16#0baa4,16#0ad50,16#055d9,16#04ba0,16#0a5b0,16#15176,16#052b0,16#0a930,%% 2010-201916#07954,16#06aa0,16#0ad50,16#05b52,16#04b60,16#0a6e6,16#0a4e0,16#0d260,16#0ea65,16#0d530,%% 2020-202916#05aa0,16#076a3,16#096d0,16#04afb,16#04ad0,16#0a4d0,16#1d0b6,16#0d250,16#0d520,16#0dd45,%% 2030-203916#0b5a0,16#056d0,16#055b2,16#049b0,16#0a577,16#0a4b0,16#0aa50,16#1b255,16#06d20,16#0ada0,%% 2040-204916#14b63,16#09370,16#049f8,16#04970,16#064b0,16#168a6,16#0ea50,16#06b20,16#1a6c4,16#0aae0,%% 2050-205916#092e0,16#0d2e3,16#0c960,16#0d557,16#0d4a0,16#0da50,16#05d55,16#056a0,16#0a6d0,16#055d4,%% 2060-206916#052d0,16#0a9b8,16#0a950,16#0b4a0,16#0b6a6,16#0ad50,16#055a0,16#0aba4,16#0a5b0,16#052b0,%% 2070-207916#0b273,16#06930,16#07337,16#06aa0,16#0ad50,16#14b55,16#04b60,16#0a570,16#054e4,16#0d160,%% 2080-208916#0e968,16#0d520,16#0daa0,16#16aa6,16#056d0,16#04ae0,16#0a9d4,16#0a2d0,16#0d150,16#0f252,%% 2090-209916#0d520 %% 2100]).%%公历月份
-define(SOLAR_MONTH, [31,28,31,30,31,30,31,31,30,31,30,31]).%%农历年总天数
lunar_days(Year) ->lunar_days(Year, 16#8000, 348).
lunar_days(Year, L, Acc) when L > 16#8 ->D =case lists:nth(Year - 1900 + 1, ?LUNAR_INFO) band L of0 -> 0;_ -> 1end,lunar_days(Year, L bsr 1, Acc + D);
lunar_days(Year, _L, Acc) ->%% 加上闰月天数Acc + leap(days, Year).%% 一年中闰月的总天数
leap(days, Year) ->case leap(month, Year) =:= 0 oftrue -> 0;false -> case lists:nth(Year - 1900 + 1, ?LUNAR_INFO) band 16#10000 =:= 0 oftrue -> 29;false -> 30endend;%% 一年中哪个月是闰月,返回该年的闰月份
leap(month, Year) ->lists:nth(Year - 1900 + 1, ?LUNAR_INFO) band 16#f.%% 农历月天数
leap(month_days, Year, Month) ->case lists:nth(Year - 1900 + 1, ?LUNAR_INFO) band (16#10000 bsr Month) =:= 0 oftrue -> 29;false -> 30end.%% 公历月天数,2月份闰年29天
solar(days, Year, 2)->case (Year rem 4 =:= 0 andalso Year rem 100 =/= 0)orelse (Year rem 400 =:= 0) oftrue -> 29;false -> 28end;
solar(days, _Year, Month) ->lists:nth(Month, ?SOLAR_MONTH).%% 公历转农历接口
%% solar2lunar(2020,4,16) -> {2020, 3, 24}
solar2lunar(Year, Month, Day) ->%%当前与1900年的天数差 Offset0 = calendar:date_to_gregorian_days(Year, Month, Day) - calendar:date_to_gregorian_days(1900, 1, 31),%% 当前农历年以及余下的天数{Metric, LunarYear} = lunar_year_by_offset(1900, Offset0),%% 闰月是哪个月LeapMonth = leap(month, LunarYear),%% 农历年,月,日{LunarYear, lunar_month_by_offset(LunarYear, 1, LeapMonth, false, Metric, 0)}.lunar_year_by_offset(Year, SolarDays) when SolarDays < 0 ->{SolarDays + lunar_days(Year - 1), Year - 1};lunar_year_by_offset(Year, SolarDays) ->lunar_year_by_offset(Year + 1, SolarDays - lunar_days(Year)).lunar_month_by_offset(_LunarYear, MonthIndex, _LeapMonth, _IsLeap, Offset, MonthDays) when Offset < 0 ->{MonthIndex -1, Offset + MonthDays + 1};
lunar_month_by_offset(_LunarYear, MonthIndex, _LeapMonth, _IsLeap, Offset, _MonthDays) when Offset =:= 0 ->{MonthIndex - 1, Offset + 1};lunar_month_by_offset(LunarYear, MonthIndex, LeapMonth, IsLeap, Offset, _MonthDays) ->{Days, Index0, Leap0} =case LeapMonth > 0 andalso MonthIndex =:= LeapMonth + 1 andalso (not IsLeap) oftrue ->{leap(days, LunarYear), MonthIndex - 1, true};false ->{leap(month_days, LunarYear, MonthIndex), MonthIndex, IsLeap}end,lunar_month_by_offset(LunarYear,Index0 + 1,LeapMonth,case Leap0 andalso Index0 =:= LeapMonth + 1 oftrue -> false;_    -> Leap0end,Offset - Days,Days).

Erlang公历转农历相关推荐

  1. python公历转农历_Python如何实现阳历转阴历的方法分享

    这篇文章主要介绍了Python实现公历(阳历)转农历(阴历)的方法,涉及农历算法原理及Python日期运算相关操作技巧,需要的朋友可以参考下 本文实例讲述了Python实现公历(阳历)转农历(阴历)的 ...

  2. javascript 公历与农历相互转换工具类

    /*** 公历[1900-1-31,2100-12-31]时间区间内的公历.农历互转* @charset UTF-8* @Author Jea杨(JJonline@JJonline.Cn)* @Ver ...

  3. 公历转农历C/C++代码

    ** **公历转农历C/C++的实现 ** 本实现的算法,主要来自网络和加入自己的需要完善而来,有同样需要的人可以参考一下: 联系:domics.cn 用法: 备注:此文件是visual studio ...

  4. uniapp 原生js实现公历转农历

    代码思路在下面这个博客,我这里只是记录一下我是怎么在uniapp里使用的 原生js实现公历转农历_xm2by的博客-CSDN博客_javascript 农历原生js实现公历转农历参考文献:[1] 19 ...

  5. swift 时间选择器第三方。公历转农历,农历转公历。

    DFDatePicker. 使用swift5 *支持公元后的任意年的公历和农历,以及公历转农历,农历转公历. *支持农历闰月 *支持年月日时分秒,以及自由组合 *支持选中定位 *轻量化,共一个swif ...

  6. JavaScript实现公历转换农历

    相信有人会在页面中中选择日期时,需要知道选择日期的农历!如果是Java的话,在后台一下子就可以给转换掉,但是页面上,通过JavaScript来转换的话,不知道大伙儿有没有好的想法呢?刚好,前一段时间来 ...

  7. jquery - 公历转农历方法

    //获取农历信息的方法 jQuery.extend({//根据公历获取农历信息// 返回:{week:星期几,lunarmonth:农历中文月,lunarday:农历中文日,lunar:农历年月日,g ...

  8. JS中1900-2100区间内的公历、农历互转的工具类

    说明: (1)由于博主是在Extjs项目中使用该工具类,所以这里我们用Extjs,但是本质上就是js. (2)该工具类是实际项目中一直在用的,至于实际出处是哪不得而知,博主只是针对自己的整理然后觉得日 ...

  9. 公历转农历linux C程序

    该代码实现根据公历日期查询农历日期,和24节气,假期,干支年份,干支月份等. 改代码是根据以下两个代码改编而来,感谢两位的共享精神. http://blog.jjonline.cn/userInter ...

最新文章

  1. python如何保存列表_Python 基础知识全篇-列表(Lists)
  2. JQ实现导航效果(附效果图)
  3. 使用sae定时执行Python脚本
  4. Anychat视频会议系统企业信息化的完美衔接
  5. 类和对象:给大家介绍对象
  6. VS2008 安装盘的问题
  7. 【C++】 C++标准模板库(三) Map
  8. 命名时取代基优先顺序_【选修五】高中化学重难点知识:有机物的命名方法
  9. IO多路复用之select全面总结(必看篇)
  10. itunes未能连接到iphone_iTunes下载_苹果iTunes官方下载「32位|64位」
  11. 5G边缘计算:开源架起5G MEC生态发展新通路
  12. Django:admin管理后台2,ModelAdmin模型管理器类
  13. ad logon hour
  14. VirtualBox中的WIN7开启Aero模式要谨慎
  15. Python函数combination
  16. 学好Linux运维决心书
  17. 羊皮卷之七-我要笑遍世界(中英对照)
  18. 【云原生 | 19】Docker数据存储详解
  19. Android 音视频配音之音频提取、截断、混音、合并、合成(一)——从视频中提取音频文件
  20. 如何把多张图片合成视频

热门文章

  1. 6.shell之正则表达式
  2. Unity AssetBundle的打包 发布 下载与加载
  3. AcWing 3215 网络延时
  4. 华为云王红新_华为云新加坡峰会多家公司签署MoU,伙伴联合展示云+AI创新应用...
  5. Greenplum 优化 - 分布式键,重建索引,序列
  6. linux 时区文件的规则,linux – 如何将POSIX时间转换为Olson时区文件...
  7. App Store 类别定义
  8. 如何打印菱形图案(C语言)
  9. java数组初始化的方式_java数组初始化方式
  10. RabbitMQ 之集群模式