历法、节日、节气

目录

一,阳历、阴历、公历、农历

1,阳历、阴历

2,公历,农历

二,双历合并

1,组成要素

2,一年

3,一月

4,一日

三,闰法则

1,闰秒

2,闰分

3,闰时

4,闰日、闰日年

5,闰月、闰月年

6,闰法则总结

四,年月日时分秒总结

1,日和公历年

2,秒

3,分、时

4,农历月

5,公历月

6,农历年

五,节假日

1,元旦、春节

2,清明、端午、中秋

3,劳动节、国庆节

六,节气

七,OJ实战

OpenJ_Bailian 2733 判断闰年

力扣 1185. 一周中的第几天


一,阳历、阴历、公历、农历

1,阳历、阴历

阳历主要参考地球和太阳之间的关系,阴历主要参考地球和月亮之间的关系。

2,公历,农历

很多人以为公历和阳历是一个意思,农历和阴历是一个意思。

其实,阳历阴历都是泛指,公历农历都是特指。

公历是一种阳历,世界上还有其他的公历。公历的作用是,让全世界对任意一天都有统一的描述方法,所以没啥技术含量。

农历是一种阴阳历,因为农历是用来指导农作的,而太阳和月亮都对农作物有很大的影响,所以有很高的技术含量,既是阳历也是阴历。

二,双历合并

中国古代发明并使用农历,这是非常强大的一个历法,对于农作指导有很强的意义,这是我们的文化瑰宝(不光是人文,还有很高的科技含量)。

但是又要和世界沟通,所以从20世纪开始引入公历,我们同时使用公历和农历。

那么,该如何合并呢?

1,组成要素

公历和农历都有3个基本尺度,年,月,日。

一年就是从最冷的时候到最冷的时候,一月是月亮最亮的时候到下一次最亮的时候,一日是太阳最亮的时候到下一次最亮的时候。

这个说法虽然不严谨,但却是客观的,也是幼儿园小朋友可以理解的一个简单定义。

所以,无论是很强的农历,还是很简单的公历,组成要素是基本一致的。

实际上:

一年是地球绕太阳一周,公历完全符合,农历的一年稍有区别,

一月是月亮绕地球一周,农历完全符合,公历的一月稍有区别,

一天是地球自转一周,公历和农历都完全符合。

2,一年

引入公历的同时,我们采用公元纪年,公元元年的含义是***,懂的都懂,和农历、和我国可以说没有半毛钱关系。

但是既然公历一年和农历一年是差不多的,所以纪年法也统一了,都用公元纪年。

同时为了方便,公历的2023年1月1日,和农历的1月1日不能相隔太多,而这就需要下文的“闰月法则”。

3,一月

因为1年大约是12个月,1年大约是365天,这2个数值关系也是客观的,所以公历可以简单粗暴的规定1年就等于12个月。

理论上,365天应该分成5个31天和7个30天,而且可以规定1-5月是31天,6-12月是30天,为什么实际上搞这么复杂呢?

这和盖维斯·屋大维·奥古斯都有关,这里就不发散了。

因为实际上1年比12个月要多几天,所以一般公历的一个月都比农历的一个月要长。

而为了保持公历年和农历年的相对同步,农历一年要么是12个月,要么是13个月,参考下文的“闰月法则”。

4,一日

铯-133原子基态的两个超精细结构能级之间跃迁相对应辐射周期的9192631770倍所持续的时间定义为一秒。1分钟等于60秒,1小时等于60分钟。

辐射周期的时间可以理解为绝对客观,是个不变的定值,和太阳、地球、月亮都无关,而用9192631770这个数值是为了保证1日大约等于86400秒,即24小时。

1日是地球自转一周,也是一个客观的时间。

实际上1日和86400秒是有偏差的,参考下文的“闰秒法则”

三,闰法则

1,闰秒

实际上1日比86400秒略大一点,如果放任不管,“日积日累”之后,总误差会很大。

所以每隔一段时间,误差接近1秒,就需要闰秒。

最近一次闰秒在北京时间2017年1月1日7时59分59秒和8时0分0秒之间,在原本相邻的2秒之间插入了一个闰秒。

2,闰分

因为经常闰秒对人类生活造成了麻烦,科学家和政府讨论决定,废除闰秒,改成闰分。

把闰秒的周期拉长60倍,把容忍最大误差改成1分钟,在误差接近1分钟时,实行闰分。

具体规则大概形如:在7时59分和8时0分之间,在原本相邻的2分之间,插入一个闰分。

改成闰分的好处就是,闰的频率下降了60倍。

3,闰时

也有人提议不采用闰分,直接采用闰时,这样,闰的频率将再度下降24倍。

目前应该还没有采用,所以闰秒、闰分、闰时是一个三选一的关系,不会同时存在于一套规则中。

4,闰日、闰日年

1年约为365.2422日,而公历采用1年365日,所以存在误差。

大约每4年,误差累积就会达到1日,所以大约每 4年就有1个闰日年,这一年实行闰日,即2月有29天,非闰日年有28天。

闰日年简称闰年,但是其中的闰规则指的是闰日。

详细规则:

能被4整除的是闰年,但能被100整除的不是闰年,但能被400整除的是闰年, 但能被3200整除的不是闰年,所以每3200年有800-32+8-1=775个闰年。

而0.2422*3200=775.04

5,闰月、闰月年

为了保持公历年和农历年的相对同步,农历一年要么是12个月,要么是13个月。

在农历十九年中,有十二个平年,为一平年十二个月;有七个闰月年,每一闰月年十三个月。

也就是说,一公历年/一农历月 大约是235/19

6,闰法则总结

闰法则的作用是调整不同时间单位之间的比例不是整数的问题,理论上每个闰法则都是正闰和负闰,但根据目前人类采用的数值,只需要正闰法则。

四,年月日时分秒总结

现在,我们可以把这个世界上的每一秒,都盘点清楚了。让我们从头捋一遍!

1,日和公历年

1日是地球自转一周的平均时间,1公历年是地球公转一周的平均时间,这2个时间是客观的固定值。

某种程度上,可以说这2个是仅有的有实际客观意义的时间单位。

解决日和公历年之间的非整数倍问题,需要闰日法则。

2,秒

1秒是铯-133原子基态的两个超精细结构能级之间跃迁相对应辐射周期的9192631770倍,

其中辐射周期的时间客观的固定值,而用9192631770这个数值是为了保证1日大约等于86400秒。

3,分、时

1分等于60秒,1小时等于60分,这是为了方便凭空创造的单位,没有误差。

因为1日大约等于86400秒,所以1日大约等于24小时。

秒、分、时是三位一体的,日和秒分时之间的非整数倍问题,需要闰法则,闰秒闰分闰时三选一。

4,农历月

农历1月是月亮公转一周的平均时间。

因为每个农历月的天数并不固定,所以不需要解决非整数倍问题。

5,公历月

公历月仅仅只是把每个公历年分成12份而已。

6,农历年

因为每个农历年的天数并不固定,所以不需要解决非整数倍问题。

而每个农历年都是由12个或13个农历月组成,需要闰月法则。

至此,年月日时分秒就全部清清楚楚了。

五,节假日

每年有7个节假日,一共11天假。

1,元旦、春节

本来只有1个节日的,自从同时引入公历之后,把传统节日元旦一分为二,一个是公历1月1日元旦,一个是农历1月1日春节。

元旦1天假,春节3天假(春节和后面2天)。

2,清明、端午、中秋

这3个是传统节日,分别是清明节气当日、农历端午当日、农历中秋当日。

3个都是1天假。

3,劳动节、国庆节

这2个公历节日,不是传统节日,分别是5月1日、10月1日。

劳动节1天假,国庆节3天假(国庆和后面2天)。

六,节气

现行的“二十四节气”来自于三百多年前(1645年起沿用至今)订立的根据太阳在回归黄道上的位置来确定节气的方法,即在一个为360度圆周的“黄道”(一年当中太阳在天球上的视路径)上,划分为24等份,每15°为1等份。

七,OJ实战

OpenJ_Bailian 2733 判断闰年

题目:

Description

判断某年是否是闰年。
Input

输入只有一行,包含一个整数a(0 < a < 3000)
Output

一行,如果公元a年是闰年输出Y,否则输出N
Sample Input

2006
Sample Output

N
Hint

公历纪年法中,能被4整除的大多是闰年,但能被100整除而不能被400整除的年份不是闰年, 能被3200整除的也不是闰年,如1900年是平年,2000年是闰年,3200年不是闰年。

代码:

#include<iostream>
using namespace std;
 
char f(int n)
{
	if (n % 4)return 'N';
	if (n % 100)return 'Y';
	if (n % 400)return 'N';
	//if (n % 3200)
		return 'Y';
	//return 'N';
}
 
int main()
{
	int a;
	cin >> a;
	cout << f(a) << endl;
	return 0;
}

力扣 1154. 一年中的第几天

class Solution {
public:
    int dayOfYear(string s) {
        int year = (s[0]-'0')*1000+(s[1]-'0')*100+(s[2]-'0')*10+(s[3]-'0');
        int month = (s[5]-'0')*10+(s[6]-'0');
        int day = (s[8]-'0')*10+(s[9]-'0');
        return dayOfYear(year,month,day);
    }
    int dayOfYear(int year,int month,int day){
        vector<int>m={31,28,31,30,31,30,31,31,30,31,30,31};
        int s=day;
        for(int i=0;i<month-1;i++)s+=m[i];
        if(run(year)&&month>2)s++;
        return s;
    }
    bool run(int n)
    {
        if (n % 4)return false;
        if (n % 100)return true;
        if (n % 400)return false;
        return true;
    }
};

力扣 1185. 一周中的第几天

给你一个日期,请你设计一个算法来判断它是对应一周中的哪一天。

输入为三个整数:daymonth 和 year,分别表示日、月、年。

您返回的结果必须是这几个值中的一个 {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}

示例 1:

输入:day = 31, month = 8, year = 2019
输出:"Saturday"

示例 2:

输入:day = 18, month = 7, year = 1999
输出:"Sunday"

示例 3:

输入:day = 15, month = 8, year = 1993
输出:"Sunday"

提示:

  • 给出的日期一定是在 1971 到 2100 年之间的有效日期。
class Solution {
public:
    string dayOfTheWeek(int day, int month, int year) {
        vector<string>v={"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
        int s=dayOfYear(year,month,day);
        for(int i=1970;i<year;i++)s+=run(i)?366:365;
        return v[(s+3)%7];
    }
    int dayOfYear(int year,int month,int day){
        vector<int>m={31,28,31,30,31,30,31,31,30,31,30,31};
        int s=day;
        for(int i=0;i<month-1;i++)s+=m[i];
        if(run(year)&&month>2)s++;
        return s;
    }
    bool run(int n)
    {
        if (n % 4)return false;
        if (n % 100)return true;
        if (n % 400)return false;
        return true;
    }

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值