万年历公历农历查询
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了万年历公历农历查询相关的知识,希望对你有一定的参考价值。
参考技术A 万年历公历农历查询 可以相互切换的万年历的c语言程序代码包括节假日农历,农历转公历,公历农历查询某 /* 多格式万年历 1.问题 设计程序实现多规格打印万年历,要求每一横排打印x个月 整数x可取1,2,3,4,6五个选项 2.设计思路 设置两个数组:一维m数组存放月份的天数,如m(8)=31,即8月份为31天 二维d数组存放日号,如d(3,24)=11,即3月份第2个星期的星期4为11号 其中24分解为十位数字2与个位数字4,巧妙地利用二维数组存放了三维信息 输入年号y,m数组数据通过赋值完成。根据历法规定,平年二月份为28天; 若年号能被4整除且不被100整除,或能被400整除,该年为闰年,二月份为29天 则必须把m(2)改为29. 同时,根据历法,设y年元旦是星期w(取值0-6,0为星期日),整数w的计算公式为 w=y+[(y-1)/4]-[(y-1)/100]+[(y-1)/400]%7 []为取整。 元旦以后 ,每增加一天,w增1,当w=7时改为w=0即可。 设置三重循环i、j、k为d数组的d(i,j*10+k)赋值。i:1-12,表示月份号;j:1-60 表示每个月约定最多6个星期;k;0-6,表示星期k。从元旦的a=1开始,每赋一个元素, a增1,同时w=k+1。当w=7时,w=0(为星期日)。当a>m(i)时,终止第i月的赋值操作。 输入格式参数x(1,2,3,4,6),设置4重循环控制规格打印: n循环,n:1-12/x,控制打印12/x段(每一段x个月)。、 j循环,j:1-6,控制打印每月的6个星期(6行)。 i循环,i:t--t+x-1,控制打印每行x个月(从第t个月至t+x-1月,t=x(n-1)+1). k循环,k:0-6,控制打印每个星期的7天。 */ #include #include void main() int a,i,j,n,k,t,w,x,y,z; static int d[13][78]; int m[14]=0,31,28,31,30,31,30,31,31,30,31,30,31; char wst[]=Sun Mon Tue Wed Thu Fri Sat; puts(Please enter the year: ); scanf(%d,&y); if(y%4==0&&y%100!=0||y%400==0)闰年的二月为29天 m[2]=29; w=(y+(y-1)/4-(y-1)/100+(y-1)/400)%7;计算y年元旦为星期w for(i=1;im[i]) break; if(a>m[i]) break; puts......>>
万年历公历阴历计算 你这是要写程序还是仅仅为了转换一个日期?
写程序的话,简单地,用一个对照表,就可以实现公历转农历,农历转公历的计算了。
比如,用以下的算法压缩出来的数据,通过逆向计算,可以还原出这些数据,再通过这些数据来计算公历和农历,非常方便。
农历月份信息。一年用3个字节表示
+-------------------------------------------------------------------------+
| 第23位 | 第22-17位 | 第16-13位 | 第12-0位 |
|--------+------------------------+------------+--------------------------|
| 保留 | 农历正月初一的年内序数 | 闰月 | 一个比特对应一个月份大小 |
+-------------------------------------------------------------------------+
月份大小数据是月份小的在低位,月份大的在高位,即正月在最低位。
以1900年为例,3个字节的数据展开成二进制位:
0 011110 1000 1 0 1 1 0 1 1 0 1 0 0 1 0
保留 1月31日(春节) 闰八月 从左往右依次十二月,十一月……闰八月、八月、七月……正月的天数
农历月份对应的位为0,表示这个月为29天(小月),为1表示有30天(大月)。
以上算法附带C/C++源代码都在链接:pan.baidu/s/1qY9ysBM 密码:zu7m
这算法效果还是非常不错的,如果觉得还是不够的,我这里还有Excel插件,以及一个C++版本的库,查询更方便。
万年历查询农历是什么时间 公元2016年是农历丙申年猴年,为公历闰年,共366天,53周。农历无闰月,共355天。
万年历19570615转换农历 这个简单,我翻了一下人生日历,是农历的1957年五月十八号,星期六,请采纳。
万年历查询农历19761202公历是几月几日 农历 丙辰(1976)年腊月初二 , 距离今日已经过去14061天 。
公历 1977年1月20日 星期四 水瓶座 。
万年历公历农历查询1964年8月初五是阳历的几月几日 万年历
1964年9月10日 农历 八月初五 星期四
万年历农历查询2ol6年农历公历对照 自己下载个日历来看吧,我现在用的人生日历不错,推荐给你用。
万年历阴历查询五行 2011年农历5月12日8.30出生的男孩
电子万年历公历和农历对不上了,是怎么回事 电子数码万年历公历与农历不对应的话,是由于数码信息历时控芯片存储信息有误而造成的。
这个问题客户是无法调试的,建议您将电子万年历返回原厂家比较好。
希望我的回答能够帮助到您哦。能够帮助到您将是我最大的荣幸哦。
求某公历年农历新年公历日期的算法
【中文标题】求某公历年农历新年公历日期的算法【英文标题】:Algorithm to find the Gregorian date of the Chinese New Year of a certain Gregorian year 【发布时间】:2015-08-23 12:16:45 【问题描述】:我正在制作一个驱动程序来计算给定时间跨度内的各种假期。所以,我需要找到所有中国假期(农历新年、清明节、端午节等)的公历日期。我使用著名的“复活节算法”来计算耶稣受难日、复活节星期一、升天节和惠特星期一;但是,我对它的理解还不够好,无法适应中国历法。
我发现了类似的问题,但他们经常从公历到中文:
Moon / Lunar Phase Algorithm
Calculating lunar/lunisolar holidays in python
http://www.herongyang.com/year/program.html
http://www.hermetic.ch/cal_stud/ch_year.htm
最后一个链接非常有帮助,但我仍然不确定如何以可以帮助我的方式实现该算法。任何建议或代码将不胜感激!
这是我的耶稣受难日算法:
private void GetGoodFridayOccurances(DateTime startDate, DateTime endDate, List<ObservedHoliday> observedHolidays, StandardHoliday holiday)
for (DateTime date = startDate; date <= endDate; date = date.AddYears(1))
#region Finding the Day of Easter Algorithm
int day, month;
int firstTwo = date.Year / 100;
int remainderMod = date.Year % 19;
int pfmDate = (firstTwo - 15) / 2 + 202 - 11 * remainderMod;
#region switches
switch (firstTwo)
case 21:
case 24:
case 25:
case 27:
case 28:
case 29:
case 30:
case 31:
case 32:
case 34:
case 35:
case 38:
pfmDate = pfmDate - 1;
break;
case 33:
case 36:
case 37:
case 39:
case 40:
pfmDate = pfmDate - 2;
break;
#endregion
pfmDate = pfmDate % 30;
int tA = pfmDate + 21;
if (pfmDate == 29)
tA = tA - 1;
if (pfmDate == 29 && remainderMod > 10)
tA = tA - 1;
//Find next sunday
int tB = (tA - 19) % 7;
int tC = (40 - firstTwo) % 4;
if (tC == 3 || tC > 1)
tC = tC + 1;
pfmDate = date.Year % 100;
int tD = (pfmDate + pfmDate / 4) % 7;
int tE = ((20 - tB - tC - tD) % 7) + 1;
day = tA + tE;
if (day > 31)
day = day - 31;
month = 4;
else
month = 3;
#endregion
DateTime observed = new DateTime(date.Year, month, day).AddDays(-2);
ObservedHoliday obsdate = new ObservedHoliday(holiday);
if (startDate == endDate && startDate.Day == observed.Day)
obsdate.DateObserved = observed;
observedHolidays.Add(obsdate);
else if (startDate != endDate && observed >= startDate)
obsdate.DateObserved = observed;
observedHolidays.Add(obsdate);
【问题讨论】:
你不需要自己做这个,.NET有一个内置的ChineseLunisolarCalendar
类。
复活节算法不太可能适用于任何其他阴历:“因为日期是基于日历的春分而不是天文的,所以根据朱利安进行的计算之间存在差异日历和现代公历。”关键词:“而不是天文数字”链接:en.wikipedia.org/wiki/Computus
【参考方案1】:
对于农历新年,我认为这会起作用:
using System;
using System.Globalization;
public static ( Int32 year, Int32 month, Int32 day ) GetDateOfChineseNewYear()
ChineseLunisolarCalendar chinese = new ChineseLunisolarCalendar();
GregorianCalendar gregorian = new GregorianCalendar();
DateTime utcNow = DateTime.UtcNow;
// Get Chinese New Year of current UTC date/time
DateTime chineseNewYear = chinese.ToDateTime( utcNow.Year, 1, 1, 0, 0, 0, 0 );
// Convert back to Gregorian (you could just query properties of `chineseNewYear` directly, but I prefer to use `GregorianCalendar` for consistency:
Int32 year = gregorian.GetYear( chineseNewYear );
Int32 month = gregorian.GetMonth( chineseNewYear );
Int32 day = gregorian.GetDayOfMonth( chineseNewYear );
return ( year, month, day );
.NET 6 支持:
现在.NET 6 (finally) has the DateOnly
type(在我们已经要求它 20 年之后......),这是可行的:
(遗憾的是 .NET 6 的 Calendar
类尚未更新为支持 DateOnly
,但手动处理很简单):
private static readonly ChineseLunisolarCalendar _chineseCal = new ChineseLunisolarCalendar();
private static readonly GregorianCalendar _gregorianCal = new GregorianCalendar();
public static DateOnly GetGregorianDateOfChineseNewYear()
return GetGregorianDateOfChineseNewYear( DateTime.UtcNow.Year );
public static DateOnly GetGregorianDateOfChineseNewYear( Int32 gregorianYear )
// Get Chinese New Year of current UTC date/time
DateTime chineseNewYear = _chineseCal.ToDateTime( year: gregorianYear, month: 1, day: 1, /*hms:*/ 0, 0, 0, 0 );
// Convert back to Gregorian (you could just query properties of `chineseNewYear` directly, but I prefer to use `GregorianCalendar` for consistency:
Int32 year = _gregorianCal.GetYear( chineseNewYear );
Int32 month = _gregorianCal.GetMonth( chineseNewYear );
Int32 day = _gregorianCal.GetDayOfMonth( chineseNewYear );
return new DateOnly( year, month, day, _gregorianCal );
所以运行这个...
Console.WriteLine( "Gregorian year: 0, Chinese New Year: 1:ddd 1", 2021, GetGregorianDateOfChineseNewYear( 2021 ) );
Console.WriteLine();
Console.WriteLine( "Next 10 years:" );
for( Int32 i = 2022; i < 2030; i++ )
Console.WriteLine( "Gregorian year: 0, Chinese New Year: 1:ddd 1", i, GetGregorianDateOfChineseNewYear( i ) );
...给我这个输出:
Gregorian year: 2021, Chinese New Year: Sat 2021-02-12 Next 10 years: Gregorian year: 2022, Chinese New Year: Tue 2022-02-01 Gregorian year: 2023, Chinese New Year: Sun 2023-01-22 Gregorian year: 2024, Chinese New Year: Sat 2024-02-10 Gregorian year: 2025, Chinese New Year: Wed 2025-01-29 Gregorian year: 2026, Chinese New Year: Tue 2026-02-17 Gregorian year: 2027, Chinese New Year: Sat 2027-02-06 Gregorian year: 2028, Chinese New Year: Wed 2028-01-26 Gregorian year: 2029, Chinese New Year: Tue 2029-02-13 Gregorian year: 2030, Chinese New Year: Sun 2030-02-03 Gregorian year: 2031, Chinese New Year: Thu 2031-01-23
【讨论】:
完美运行!我稍微改变了一下,只创建一个新的 DateTime 而不是启动所有 Int32,但非常感谢! 不幸的是,我的 .NET 版本会引发异常:'GetDaysInMonth' 和 'GetMonth'。暂时没有修复 @JamesVeug 确切的异常类型、消息和堆栈跟踪是什么? @Dai 使用 int month = chinese.GetMonth(utcNow);例外:GetMonth System.Globalization.CCEastAsianLunisolarCalendar.GetMonth(DateTime 日期)(在 /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Globalization/CalendricalCalculations.cs:1929)System.Globalization.EastAsianLunisolarCalendar.GetMonth (日期时间)(在 /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Globalization/EastAsianLunisolarCalendar.cs:159) @JamesVeug 看起来您使用的是 Mono 而不是 .NET Framework。 Mono 可能不支持与 NetFx 相同的日历。【参考方案2】:由于中国历法非常复杂(并且基于天文考虑),因此没有简单的方法可以计算在所有情况下都正确的农历新年公历日期。 (有一些“经验法则”在几年内总是失效。)有关基本理论,请参阅here,对于执行此操作的 Windows 软件(和其他中国历法计算),请参阅 here
【讨论】:
以上是关于万年历公历农历查询的主要内容,如果未能解决你的问题,请参考以下文章