记得去年国庆节立的flag,希望多写写文章的,可是自己太懒了,遇到的问题待解决之后就再也没心思写文章记录下了。从去年到现在也就16篇文章,确实是输出太少了,有时候遇到同样的问题时仍然需要花一些时间查资料,所以临时记录下其实是有必要的。

一直比较忙,今年年初到9月份基本上就在为秋招做准备,经历了9月找工作的忙碌,所幸是拿到了比较合意的offer,从中也学到了许多东西,了解了自身各方面的不足。国庆假期得以休息一下,所以重新登录了CSDN账号,看到自己仅有的几篇文章仍然可以帮助一些人解决一些问题,感到有些开心。很抱歉我实在是时间观念太强了,而且从个人性格来说还不是那么开放,虽然这段时间也依自己兴趣玩了玩操作Java字节码的Javassist库,编写了几个工具类;还使用Java,Jsoup库做了个爬虫,从网页,数据库到本地文件,都使用自己的代码进行了实现;除此之外,做了许多算法题,也是依兴趣对那些题进行了拓展,譬如输出更详细的路径,输出各种可能性。但是其实将这些在Github上进行开源并没有那么容易,虽然我个人是愿意分享的,(当然我也怀疑这些基于他人的库再进行的封装是否能帮助一部分人解决他们的问题),但是其实开源并没有那么容易,就和写文章一样,好的文章需要做大量的工作。那些代码里包含有一些个人信息,而且需要对代码做大量的重构,注释和文档说明,时间宝贵,所以我一般是不太愿意做这些事的,也可以算是拖延吧。等这段时间秋招过去,我该思考下该如何权衡工作学习和生活,如何更好地开始我的职业生涯,如何做些对自己和他人都有益的事情。

个人的想法就暂时说这些吧,本来也是想如标题写些对他人有用的东西的,虽然算不上干货。

今天是国庆节,而且我的农历生日今年恰好是在国庆节期间。记得07年还是0几年的生日也是在国庆节期间,突发奇想,我这20多年的农历生日在公历都是什么时候呢?

作为一个和计算机打交道的,当然更希望重复的工作交给计算机来做。其实我的目的很简单,根据我的农历生日找到9*年到今年每年对应的公历日期,仅此而已。说起农历,可是我们国家历史传统的宝贵财富,咱们可不要忘了哦!


农历是我国传统历法,农历是一种阴阳合历,取月相的变化周期即朔望月为月的长度,参考太阳回归年为年的长度,通过设置二十四节气以及闰月以使平均历年与回归年相适应。我国各地区以及少数民族地区的传统节日均以农历计算,至今汉字文化圈的国家和民族大多仍遵循农历的传统节日,如春节、中秋节、端午节、七夕节等。

农历属于一种阴阳历:其年份分为平年和闰年。平年为十二个月;闰年为十三个月。月份分为大月和小月,大月三十天,小月二十九天,其平均历月等于一个朔望月。一年中哪个月大,哪个月小,由计算决定。农历又根据太阳的位置,把一年分成二十四节气以反映季节的变化,指导农业等事。所以,农历既有阴历又有阳历的成分。(摘自 百度百科 农历)


ok,由于我擅长使用Java,还是以Java来实现,百度之后见到了一些实现,主要思想也是记录下每一年是否闰年,闰几月,每一月30天还是29天,然后根据基准时间、相对位置来计算绝对位置,也就是对应的农历时间。在Github上找到了两个相关的Java库:

一个简单的版本
heqiao2010/LunarCalendar: A Java implementation of Chinese lunar calendar. 中国农历的Java实现(一个Java类不到800行)。  https://github.com/heqiao2010/LunarCalendar

一个功能相对较完善的版本
XhinLiang/LunarCalendar: Calendar for Chinese Lunar  https://github.com/XhinLiang/LunarCalendar

两个日历库都做得相当好,文档都写得比较完善,真的是感谢。

第一个heqiao2010/LunarCalendar库的功能大致有农历公历互转,获取生肖名、天干地支名,获取两时间差值(单位年月日时分秒等);第二个XhinLiang/LunarCalendar库的功能大致有公历转农历,获取公历月历,获取农历月历,获取带节日和节气的(农历)月历,以及通过月历可以得到是否今天,是否周末,节气,节日,公历日期等。

遗憾的是第二个库没有农历转公历的API,而第一个库的农历转公历暂时有点偏差,已经报告给作者,经过偏置还是可以使用的。

下面贴出一部分代码,生日可不能给泄露了(嘻嘻),计算出了我所有的生日日期,当然经过了两次偏置,得到了所有正确结果,如果计算其它的时间,可能计算不出,代码里进行了验证。代码如下:

        int from = <写你自己的农历出生年份>;int month = <写你自己的农历出生月份>;int day = <写你自己的农历出生日期>;int offset = 2;//偏置,不要改SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");for (int year = from; year <= 2018; year++) {Calendar solar = LunarCalendar.lunar2Solar(year, month - 1, day - offset, false);LunarCalendar lunar = LunarCalendar.solar2Lunar(solar);if (lunar.getDate() != day) {int offset2 = lunar.getDate() - day;Calendar solar2 = LunarCalendar.lunar2Solar(year, month - 1, day - offset - offset2, false);if (LunarCalendar.solar2Lunar(solar2).getDate() == day) {System.out.println(year + "年生日:" + df.format(solar2.getTime()));} else {System.out.println(year + "年计算有错误,即便是重新偏置之后");}} else {System.out.println(year + "年生日:" + df.format(solar.getTime()));}}

自此获取了所有的结果,发现居然有7次生日都是在国庆节假日,哈哈,祝自己也祝大家生活顺利,学业进步(*^▽^*)

到此为止吧,为了写这么一篇文章花了我一个晚上,当然也对这两个库有了大致的了解,再次谢谢作者。

使用Java探索下农历和公历,哈哈,还有我生日,和国庆节假日相关推荐

  1. python下的一个好用的日历库,支持农历和公历互转,四柱反查等功能

    一般的日历库是顶多支持1800年到2200年,但是sxtwl支持BC722到9999年之间的所有日期. 如果有需要做古人八字,祖先八字.考古日历参考, 古代的农历阳历转换 这些需要的,强烈推荐.下面是 ...

  2. Java微服务开发指南 -- Java环境下的微服务

    Java环境下的微服务 本文涉及的内容,能让你学到什么? 本书适用于开发微服务的Java开发人员和架构师.我们在开始介绍微服务架构前,先讲述一些抽象的基本概念.不幸的是,使用新技术并不能神奇地解决分布 ...

  3. PB中公历与农历(阳历与阴历)的互相转换——主要是农历转公历(阴历转阳历)

    PB中关于公历转农历的算法,网上有很多,思路也大致一样,在这里我就不再进行说明了. 本文主要是想跟所有PB爱好者,分享农历转公历的方法. 转换思路为:根据传入的农历日期,找到第一个小于传入日期的基准日 ...

  4. java打包没有src_maven 打包时,src/main/java目录下的xml等资源文件没有打包进去的问题...

    关于使用maven打包src/main/java中一些关于mybatis的xml都没有打包进去,导致war包启动不起来,在此记录一下,解决方法. 默认maven在src/main/java中只编译ja ...

  5. copy所有的java文件到硬盘_将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad...

    listFiles方法接受一个FileFilter对象,这个FileFilter对象就是过虑的策略对象,不同的人提供不同的FileFilter实现,即提供了不同的过滤策略. //将d:\java目录下 ...

  6. 将d:\java目录下的所有.java文件复制到d:\jad 目录下,并将原来文件的扩展名从.java 改为.jad

    package com;import java.io.*; import java.util.ArrayList; import java.util.List; /* 编写一个程序,将d:\java目 ...

  7. 编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad

    package com.hbut.test; import java.io.File; import java.io.FileNotFoundException; import java.io.Fil ...

  8. sqlcipher java_纯java环境下sqlsqlcipher解密sqlite数据库文件

    由于工作需要,最近一周以来研究sqlite数据库文件的解密方法.最终采用sqlcipher工具进行解密.由于sqlcipher的实现大多是支持android的,修改为纯java平台下的代码有难度,因此 ...

  9. java ee 下版本_将旧版本从Java EE 5减少到7

    java ee 下版本 Java EE 5于2005年首次引入,而Java EE 7于2013年问世.这两个版本之间存在7年的差距,从技术角度来说,这就像一个世纪. 许多组织仍然对使用Java EE ...

最新文章

  1. 百余位中外学者探讨神经科技挑战:伦理担忧与监管难题并存
  2. 详解Pattern类和Matcher类
  3. C++ vector容器中常见的三种遍历方式
  4. Spring MVC自定义验证注释
  5. 做CV和做NLP,是否都有光明的未来?
  6. mysql是什么1001mysql是什么_mysql深入理解
  7. C# | C#中变量(局部变量)的声明和范围
  8. [Python學習筆記] 在Centos上安裝 Django
  9. hadoop3.1集成tez和tez-ui
  10. 自学python要看哪些书-想学习Python做数据分析,应该看哪些书?
  11. XFire+spring 发布webservice 及其客户端调用程序
  12. 11.1-12.31推荐文章汇总
  13. TiDB DevCon2018.tick(1.20)
  14. 【西瓜书】决策树ID3算法
  15. 一文教你如何快速高效画出技术架构图
  16. 为啥淘宝的商品链接无法分享到微信?
  17. SQL Server查看是企业版还是个人版
  18. 普适计算-2014/03/28
  19. Paddle 印刷电路板(PCB)瑕疵检测
  20. 阿里云服务器,修改Apache2默认端口80

热门文章

  1. 50个多色渐变下载分享
  2. fbx文件导入html,AE插件:导入三维文件FBX格式包括摄像机到AE颠覆性插件FBX to AE...
  3. 蒙太奇图片代码+说明(*小白专用,三分钟内完成*)
  4. 动物医学和计算机专业哪个好,本科动物医学专业排名,2020选择哪所大学好?
  5. HTML5与CSS3学习笔记
  6. 自然语言处理(NLP):05 基于 doc2vec 特征抽取+电影情感文本分类
  7. 嵌入式 单片机 开发 笔试面试题
  8. 深度学习实现象棋_使用深度学习创建国际象棋人工智能
  9. MKS SERVO4257D 闭环步进电机_系列8 CAN通讯示例
  10. 【VC ++ 2010】 C语言 计算机二级编译器 Visual C ++ 2010 Express(中文学习版)的安装与使用