import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class Lunar {
private int year;
private int month;
private int day;
private boolean leap;
final static String chineseNumber[] = { "一", "二", "三", "四", "五", "六", "七",
"八", "九", "十", "十一", "十二" };
final static String Big_Or_Small[] = { "大", "小", "大", "小", "大", "小", "大",
"大", "小", "大", "小", "大" };
private String[] LunarHolDayName = { "小寒", "大寒", "立春", "雨水", "惊蛰", "春分",
"清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑", "大暑", "立秋", "处暑", "白露",
"秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至" };
static SimpleDateFormat chineseDateFormat = new SimpleDateFormat(
" yyyy年MM月dd日 ");
final static long[] lunarInfo = new long[] { 0x04bd8, 0x04ae0, 0x0a570,
0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,
0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0,
0x0ada2, 0x095b0, 0x14977, 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50,
0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, 0x06566,
0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0,
0x1c8d7, 0x0c950, 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4,
0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, 0x06ca0, 0x0b550,
0x15355, 0x04da0, 0x0a5d0, 0x14573, 0x052d0, 0x0a9a8, 0x0e950,
0x06aa0, 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260,
0x0f263, 0x0d950, 0x05b57, 0x056a0, 0x096d0, 0x04dd5, 0x04ad0,
0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b5a0, 0x195a6,
0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40,
0x0af46, 0x0ab60, 0x09570, 0x04af5, 0x04970, 0x064b0, 0x074a3,
0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0, 0x0c960,
0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0,
0x092d0, 0x0cab5, 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9,
0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, 0x07954, 0x06aa0,
0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65,
0x0d530, 0x05aa0, 0x076a3, 0x096d0, 0x04bd7, 0x04ad0, 0x0a4d0,
0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, 0x0b5a0, 0x056d0, 0x055b2,
0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0 };
// ====== 传回农历 y年的总天数
final private static int yearDays(int y) {
int i, sum = 348;
for (i = 0x8000; i > 0x8; i >>= 1) {
if ((lunarInfo[y - 1900] & i) != 0)
sum += 1;
}
return (sum + leapDays(y));
}
// ====== 传回农历 y年闰月的天数
final private static int leapDays(int y) {
if (leapMonth(y) != 0) {
if ((lunarInfo[y - 1900] & 0x10000) != 0)
return 30;
else
return 29;
} else
return 0;
}
// ====== 传回农历 y年闰哪个月 1-12 , 没闰传回 0
final private static int leapMonth(int y) {
return (int) (lunarInfo[y - 1900] & 0xf);
}
// ====== 传回农历 y年m月的总天数
final private static int monthDays(int y, int m) {
if ((lunarInfo[y - 1900] & (0x10000 >> m)) == 0)
return 29;
else
return 30;
}
// ====== 传回农历 y年的生肖
final public String animalsYear() {
final String[] Animals = new String[] { "鼠", "牛", "虎", "兔", "龙", "蛇",
"马", "羊", "猴", "鸡", "狗", "猪" };
return Animals[(year - 4) % 12];
}
// ====== 传入 月日的offset 传回干支, 0=甲子
final private static String cyclicalm(int num) {
final String[] Gan = new String[] { "甲", "乙", "丙", "丁", "戊", "己", "庚",
"辛", "壬", "癸" };
final String[] Zhi = new String[] { "子", "丑", "寅", "卯", "辰", "巳", "午",
"未", "申", "酉", "戌", "亥" };
return (Gan[num % 10] + Zhi[num % 12]);
}
// ====== 传入 offset 传回干支, 0=甲子
final public String cyclical() {
int num = year - 1900 + 36;
return (cyclicalm(num));
}
/** */
/**
* 传出y年m月d日对应的农历. yearCyl3:农历年与1864的相差数 ? monCyl4:从1900年1月31日以来,闰月数
* dayCyl5:与1900年1月31日相差的天数,再加40 ?
*
* @param cal
* @return
*/
public Lunar(Calendar cal) {
// cal.add(cal.get(Calendar.DAY_OF_MONTH),1);
@SuppressWarnings(" unused ")
int yearCyl, monCyl, dayCyl;
int leapMonth = 0;
Date baseDate = null;
try {
baseDate = chineseDateFormat.parse(" 1900年1月31日 ");
} catch (ParseException e) {
e.printStackTrace(); // To change body of catch statement use
// Options | File Templates.
}
// 求出和1900年1月31日相差的天数
int offset = (int) ((cal.getTime().getTime() - baseDate.getTime()) / 86400000L);
dayCyl = offset + 40;
monCyl = 14;
// 用offset减去每农历年的天数
// 计算当天是农历第几天
// i最终结果是农历的年份
// offset是当年的第几天
int iYear, daysOfYear = 0;
for (iYear = 1900; iYear < 2050 && offset > 0; iYear++) {
daysOfYear = yearDays(iYear);
offset -= daysOfYear;
monCyl += 12;
}
if (offset < 0) {
offset += daysOfYear;
iYear--;
monCyl -= 12;
}
// 农历年份
year = iYear;
yearCyl = iYear - 1864;
leapMonth = leapMonth(iYear); // 闰哪个月,1-12
leap = false;
// 用当年的天数offset,逐个减去每月(农历)的天数,求出当天是本月的第几天
int iMonth, daysOfMonth = 0;
for (iMonth = 1; iMonth < 13 && offset > 0; iMonth++) {
// 闰月
if (leapMonth > 0 && iMonth == (leapMonth + 1) && !leap) {
--iMonth;
leap = true;
daysOfMonth = leapDays(year);
} else
daysOfMonth = monthDays(year, iMonth);
offset -= daysOfMonth;
// 解除闰月
if (leap && iMonth == (leapMonth + 1))
leap = false;
if (!leap)
monCyl++;
}
// offset为0时,并且刚才计算的月份是闰月,要校正
if (offset == 0 && leapMonth > 0 && iMonth == leapMonth + 1) {
if (leap) {
leap = false;
} else {
leap = true;
--iMonth;
--monCyl;
}
}
// offset小于0时,也要校正
if (offset < 0) {
offset += daysOfMonth;
--iMonth;
--monCyl;
}
month = iMonth;
day = offset + 1;
}
public static String getChinaDayString(int day) {
String chineseTen[] = { "初", "十", "廿", "卅" };
int n = day % 10 == 0 ? 9 : day % 10 - 1;
if (day > 30)
return "";
if (day == 10)
return "初十";
else
return chineseTen[day / 10] + chineseNumber[n];
}
public String toString() {
return /* cyclical() + "年" + */(leap ? "闰" : "")
+ chineseNumber[month - 1] + "月" + getChinaDayString(day);
}
public String numeric_md() {// 返回阿拉伯数字的阴历日期
String temp_day;
String temp_mon;
temp_mon = month < 10 ? "0" + month : "" + month;
temp_day = day < 10 ? "0" + day : "" + day;
return temp_mon + temp_day;
}
public String get_month() {// 返回阴历的月份
return chineseNumber[month - 1];
}
public String get_date() {// 返回阴历的天
return getChinaDayString(day);
}
public String get_Big_Or_Small() {// 返回的月份的大或小
return Big_Or_Small[month - 1];
}
}
相关推荐
### 阳历转阴历算法详解 #### 一、引言 在日常生活中,我们经常需要将阳历(公历)转换为阴历(农历),尤其是在中国传统节日、农事活动等方面的应用尤为广泛。本文将深入解析一种实现阳历到阴历转换的算法,并对...
Excel 阳历阴历相互转换 Excel 中实现阳历日期到阴历和阴历到阳历的相互转换,对于统计集体信息情况(如通讯录)具有很实用的价值。本文将详细介绍如何使用 VBA 编辑器在 Excel 中实现阳历阴历相互转换。 首先,...
日历转换,阳历转阴历 下载文件可以使用 package com.action.entity; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util...
公历(阳历) 农历(阴历)转换,支持时间段从 1900-2100 如果需要更长的时间段,利用 generate.htm 生成的数据即可。 支持各种编程语言 C#,java,Objective-C,php,Python,javascript(nodejs),C/C++,ruby,swift,golang 等...
在中国,传统农历(阴历)与国际通用的公历(阳历)是两种不同的历法系统。阳历是以地球绕太阳公转一周的时间为基础,而阴历则参照月亮的盈亏周期来制定。两者之间的转换在日常生活、节日计算以及一些传统活动中有...
在提供的文件中,"calendar.dll"很可能是一个包含了阳历转阴历算法的动态库。在PB中,我们可以通过`LoadLibrary`函数加载这个库,然后使用`GetProcAddress`获取库中的函数指针,这样就可以调用库中的方法进行日期...
总结,实现阳历转农历功能的关键在于找到或编写准确的农历转换算法,并将其集成到Qt的C++环境中。通过合理的设计和编程,我们可以构建一个用户友好且功能强大的日期转换工具。同时,这也是一次深入学习C++编程、Qt库...
阳历,也称为公历,是国际上广泛使用的日历系统,而阴历则在中国、韩国、越南等地的传统节日和生活中扮演着重要角色。本文将详细讨论如何在程序中实现阳历到阴历的转换,主要涉及C#和JavaScript两种编程语言。 首先...
这个"IOS应用源码——object-c阳历转阴历算法.zip"压缩包中包含的就是Objective-C实现的阳历到阴历转换的代码示例。以下是对这个算法的详细解释和相关知识点的展开。 1. **Objective-C语言基础**:Objective-C是...
农历,也称为阴历,是中国和其他东亚国家传统使用的历法,而公历则是国际上广泛采用的格里高利历。本文将详细介绍如何在C#中实现农历与公历之间的转换,特别关注1902年至2100年这段时期。 首先,我们需要理解农历和...
Java中处理阳历的主要类是`java.util.Calendar`,尤其是其子类`java.util.GregorianCalendar`,它基于格里高利历。 农历,又称阴历,主要根据月亮的盈亏周期来确定月份。中国的农历是一种阴阳合历,结合了太阳和...
在Ubuntu中有Lunar软件可以获取农历日期,但在Fedora或CentOS中并没有类似软件,所以就想自己来实现一个,但网上用其他语言写的一大把,如果再写没什么必要。所以就想用shell来写一个。 之前的版本有bug。
公历(阳历)农历(阴历)转换,支持时间段从1900-2100如果需要更长的时间段,利用generate.htm生成的数据即可。支持各种编程语言C#,java,Objective-C,php,Python,javascript(nodejs),C / C ++,ruby,...
在PHP编程中,将阳历转换为阴历是一项常见的任务,尤其在中国文化背景下,阴历在许多节日和传统活动中有着重要地位。以下是一个名为"Lunar"的PHP类,用于实现这个功能的实例详解。 首先,类"Lunar"的定义包含了几个...
公历,又称阳历,是国际通用的日历系统,基于地球绕太阳公转的周期。而农历,又称阴历,是一种与月亮盈亏周期相关的日历系统,通常在中国、韩国、越南等亚洲国家使用。农历一年有12个月,每个月约29.5天,因此农历年...
同时,还需要考虑公历与农历之间的复杂关系,例如公历和农历的年份起点不同,公历有闰秒但农历没有等。DELPHI提供了丰富的库函数和组件,使得开发者能够方便地编写这样的转换代码。 总之,这个压缩包提供了一个用...
例如,可能有一个名为`solar_to_lunar`的方法用于阳历转阴历,另一个名为`lunar_to_solar`的方法用于阴历转阳历。在实际应用中,需要确保正确传递日期参数并处理转换结果。 4. **性能和准确性**:由于SOLARLUNAR库...
- 调用`f_solar2lunar`函数,例如`f_solar2lunar(0,2004,7,18,os_year,os_month,os_date,os_lunarflag,os_lunarleap)`,将公历2004年7月18日转换为农历,并获取农历的年、月、日、是否闰月以及闰月的编号。...
阳历,也称为公历,是国际通用的日历系统。在Java中,我们可以使用`java.time`包中的`YearMonth`、`DayOfWeek`和`LocalDate`类来处理阳历日期。通过这些类,可以轻松获取年、月、日以及星期几的信息,进行日期的加...
Oracle数据库系统提供了强大的日期处理功能,其中包括将公历(阳历)日期转换为农历日期。在Oracle中,虽然没有内置的直接转换函数来实现这一功能,但可以通过自定义函数或者利用现有的开源存储过程来实现这一转换。...