smtgg
发表于 2010-1-12 20:04:06
mark
touch_mcu
发表于 2010-1-12 20:16:40
一个比一个强呀
3g465
发表于 2010-1-12 20:39:16
mark
zhangchengxx
发表于 2010-2-23 20:45:52
收到 谢谢
MCU678
发表于 2010-2-23 20:56:58
mark
252177861
发表于 2010-2-23 21:00:44
28楼的程序貌似在闰年的二月时星期不对
yycool
发表于 2010-2-23 23:30:43
用得着,顶啊!
beiquan
发表于 2010-2-24 13:36:25
mark
hongyancl
发表于 2010-2-24 14:22:44
回复【楼主位】hexixiaomao 猫云澜
-----------------------------------------------------------------------
hao
tankebing
发表于 2010-2-24 17:27:20
mark!
lv998127
发表于 2010-2-24 19:11:04
大号!
tom030704
发表于 2010-2-24 19:38:42
号号
zgcumt
发表于 2010-2-24 20:43:12
mark
XMLK
发表于 2010-2-24 23:09:19
mark
fshunj
发表于 2010-2-25 00:17:31
mark
moon0213
发表于 2010-2-25 14:23:32
mark
gxy508
发表于 2010-2-25 14:30:19
mark
wuzhujian
发表于 2010-2-25 14:43:06
公式:从某个基准日开始,算到你要计算的那天的总天数,再MOD 7就行了。
比如:作为200年1月1日起始日(这天是周六),到2010年2月25日,则总天数为:
(((2010-2000)/4)*(365*3 +366)+((2010-2000)%4)*365 +1) +1*31 +25 = 3708天
(3708+6) % 7 = 4,表示2010年2月25日是周四。
说明:中间的那个1,是因为4年周期的第1年是闰年,要多一天,如果是算2008年的话,这一天就不要加了。
wuzhujian
发表于 2010-2-25 14:54:18
完整的万年历程序如下:
#define ONE_YEAR ((u32)365)
#define FOUR_YEAR ((u32)365*3 + 366)
#define ONE_DAY ((u32)60*60*24)
#define ONE_HOUR ((u32)60*60)
#define ONE_MINUTE ((u32)60)
uc16 pp1[] = {0,31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
uc16 pp2[] = {0,31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366};
typedef struct
{
u16 year;
u8 mon;
u8 day;
u8 hour;
u8 min;
u8 sec;
u8 week;
}RT_Time;
void GetCurrentTime(RT_Time* p, u32 seconds) // 以秒换算日期
{ // 以2000年1月1日0点为起点,周六
u32 day, tmp, tmp1;
u16 const *t;
day = seconds / ONE_DAY; // 天数
seconds = seconds % ONE_DAY;
p->hour = seconds / ONE_HOUR; // 小时
seconds = seconds % ONE_HOUR;
p->min = seconds / ONE_MINUTE; // 分
p->sec = seconds % ONE_MINUTE; // 秒
p->week = (day+6) %7;
tmp = (day / FOUR_YEAR)<<2; // 4年为一个计算周期
day = day % FOUR_YEAR; // 以4年为周期的余数
tmp1= day / ONE_YEAR; / 余数的年数
if(tmp1 == 4) // 唯一的可能:4年为周期的最后一天,12月31日
{
p->year = 2000 + tmp + 3; // 实际年份 = 2000年 + 4年期 + 4年期余数
p->mon = 12; // 12月
p->day = 31; // 31日
return;
}
else if(tmp1 == 0)
{
p->year = 2000 + tmp ; // 年份 = 2000 + 4年的周期年数
t = pp2; // 用闰年的日期来计算
}
else
{
p->year = 2000 + tmp + tmp1; // 年份 = 2000 + 4年的周期年数 + 余数的年数
day = day - (ONE_YEAR*tmp1) -1; // 第0年有366天,要多减1天
t = pp1; // 用非闰年的日期来计算
}
for(tmp =1; tmp <13; tmp++) // 月份从1开始,不超过12
{
if(day < t) // 如果在这个月内
{
p->mon = tmp; // 置月份
p->day = day - t +1; // 计算日期
return;
}
}
}
u32 SetTime(RT_Time* p) // 以日期换算成秒
{
u32 tmp,tmp1, day, year;
u16 const *t;
year= p->year - 2000;
tmp = year>>2; // 把年换算成4年周期
tmp1= year %4; // 4年周期的余数
if(tmp1 != 0) // 如果不是4年周期的第1年
{
day= tmp * FOUR_YEAR + tmp1 * ONE_YEAR +1; // 整年天数 = 4年周期数 * 4年天数 + 4年周期的余数*非闰年天数 +1(第1年为闰年,多1天)
t = pp1; // 以非闰年计数在本年内的天数
}
else // 如果是4年周期的第1年
{
day = tmp * FOUR_YEAR; // 整年天数 = 4年周期数 * 4年天数
t = pp2; // 以闰年计算在本年内的天数
}
day = day + t + p->day; // 天数 = 整年天数 +本年内天数
return (day* ONE_DAY + p->hour*ONE_HOUR + p->min*ONE_MINUTE +p->sec);
}
上述万年历计算中,与具体的器件无关的。2个函数,一个以秒换算成年、月、日、时、分、秒,另一个是以年、月、日、时、分、秒换算成秒。
以32位的秒数,可以支持136年,从2000年开始计算,可以支持到2136年。
jiangping_hbhm
发表于 2010-2-25 17:03:36
马克
CHENG2010
发表于 2010-2-25 19:02:05
mark
neilxiang
发表于 2010-2-25 23:28:01
学习学习,星期的计算,万年历的计算,有没有谁可以给出最简单的算法呢
GAINTRUST
发表于 2010-2-25 23:40:53
mark
901029
发表于 2010-2-27 09:20:30
好东西。。。我写了有几十行
jeremygg
发表于 2010-3-2 15:59:47
mark了
god-father
发表于 2010-3-2 16:28:41
回复【楼主位】hexixiaomao 猫云澜
// 计算2000~2099年任一天星期几
// year : 00-99
// month: 01-12
// day : 01-31
unsigned char GetWeekFromDay(unsigned char year,unsigned char month,unsigned char day)
{
if( month == 1 || month == 2 )
{
month += 12;
if( year> 0 )
year--;
else
year = 4;
}
// 返回星期几(星期一用1表示,而星期天用7表示)
return 1+(( day + 2*month + 3*(mont......
-----------------------------------------------------------------------
根据年月日可以算星期
原理是 从2000年1月1日开始计算到输入的日期共有多少天 1个星期有7天 。。。这样可以计算出星期几
当然 闰年也必须考虑
jielove2003
发表于 2010-3-2 17:32:46
好帖收藏
damoplus
发表于 2010-3-2 17:50:59
mark
tonydh
发表于 2010-3-2 21:34:37
mark
tdctdc
发表于 2010-3-3 10:03:44
回复【128楼】tonydh
-----------------------------------------------------------------------
在这里学习了很多也发个天数计算。。。。菜鸟
#include "stdio.h"
#include "math.h"
int CheckLeap( year)/*闰年的判断*/
{
if((year%4 == 0 && year%100 != 0 )|| year%400 == 0)
return 1;
else
return 0;
}
main()
{
int iyear,imonth,idate;
int sumYear = 0,sumMonth = 0,sumDate = 0;
int i,total=0,month={0,31,28,31,30,31,30,31,31,30,31,30,31};
while(1)
{
printf("please input (iyear-imonth-iday) : ");
scanf("%d,%d,%d",&iyear,&imonth,&idate);
if (!((iyear<0)||(imonth>12)||(imonth<1)))
if(CheckLeap(iyear))
{
if(imonth==2)
if(idate-month-1<=0)
break;
if (idate-month<=0)
break;
}
else
{
if(idate-month<=0)
break;
}
}
if(CheckLeap(iyear))
i=1;
else
i=0;
if(imonth==1)
sumMonth=idate;
else if (imonth== 2)
sumMonth=31+idate;
else
sumMonth=13*(imonth+1)/5-7+(imonth-1)*28+idate+i; /*月在那一年中所占的天数*/
total=sumMonth; /*总共相差的天数*/
printf("total=%d\n",total);
}
tdctdc
发表于 2010-3-3 10:11:25
回复【129楼】tdctdc
-----------------------------------------------------------------------
我的程序不知道在DEBUG的时候很慢,不知道是什么原因。但是程序运行的结果是对的。希望哪位高手解惑下~
julou
发表于 2010-3-16 14:56:59
mark
jzlxue
发表于 2010-3-29 19:29:14
mark
safan
发表于 2010-3-30 01:00:00
mark
czxf
发表于 2010-3-30 08:28:34
markj
zqhdevelopment
发表于 2010-4-10 21:29:03
本程序绝对正中,只要输入有效的年月日即可得出正确的星期数。我在好多工程上都是用的这个算法从来没出问题ourdev_545407.rar(文件大小:8K) (原文件名:weekconvter.rar)
kele2009
发表于 2010-4-10 21:59:02
记号
zqhdevelopment
发表于 2010-4-11 13:52:59
回复【28楼】wqsjob
-----------------------------------------------------------------------
28楼的楼主你好!我想请问2000.2.29日。是星期三吗?好像是星期二吧。你的这个程序是有问题的。
tick
发表于 2010-4-11 14:01:22
MARK
huihui_lzh
发表于 2010-4-11 14:57:38
人才
lovewwy
发表于 2010-4-11 14:57:47
mark
huwenhui
发表于 2010-4-11 15:15:39
mark~
kangkang
发表于 2010-4-11 16:09:12
mark
arm0756
发表于 2010-4-11 21:18:00
good
443799600
发表于 2010-4-12 14:02:06
mark在看
sangreal
发表于 2010-4-13 15:57:14
马克
mcu131368
发表于 2010-4-14 13:08:56
顶起来
guxingganyue
发表于 2010-5-3 08:54:08
值得学习
sponge
发表于 2010-5-3 22:06:33
mark
udbdxzlkc
发表于 2010-5-5 08:42:15
mark
kingmacth
发表于 2010-5-5 08:57:48
标记一下。
1123345
发表于 2010-5-5 09:35:52
不错
yinglively
发表于 2010-5-5 09:51:11
mark
hephi
发表于 2010-5-5 11:33:20
马克
chys01
发表于 2010-5-5 11:51:38
学习了
freedestiny
发表于 2010-5-5 14:27:46
马克嘿嘿
hanjiang
发表于 2010-5-5 15:53:06
验证后
怎么不准呢
过了一天
stevencao
发表于 2010-5-5 15:57:24
学习一下
xiongzdd
发表于 2010-5-5 21:27:53
mark
291811083
发表于 2010-6-29 17:06:00
好好研究一下
zsdyf
发表于 2010-6-29 18:13:50
回复【楼主位】hexixiaomao 猫云澜
-----------------------------------------------------------------------
mark
hubertboy
发表于 2010-6-29 18:57:39
回复【28楼】wqsjob
//我一直在用的代码,呵呵,至少我觉得比楼主的效率高,不论空间还是时间,另外,扩展个几千年也很容易。
//51的话,可以定义在code,不光省ram,还节省代码空间(少一条mov指令)。
uchar weekdata[]={0,3,3,6,1,4,6,2,5,0,3,5};
/*2000-2099*/
unsigned char getweekday(unsigned char year,unsigned char month,unsigned char day)
{
return ((6+weekdata+year+day+year/4)%7);
}
刚才忘了说了,这里0代表星期天,使用者应该加上日前限定的功能。<font color=#699bcd>
本贴被 wqsjob 编辑过,最后修改时间:2008-......
-----------------------------------------------------------------------
我现在使用的方法与你相似!
lv998127
发表于 2010-6-29 19:07:46
mark
ldpoh
发表于 2010-6-29 19:34:13
mark
eduhf_123
发表于 2010-6-29 21:30:17
MARK 星期算法
qq335702318
发表于 2010-6-30 09:15:58
mark
livekoko
发表于 2010-6-30 15:02:35
非常好,喜欢这样的算法分析
aiyige
发表于 2010-6-30 15:24:57
谢谢分享!!!
qq20707
发表于 2010-8-20 19:34:30
强 很强
xinyou
发表于 2010-8-20 19:51:55
mark
sunnyhook
发表于 2010-8-20 21:02:46
回复【161楼】hubertboy
-----------------------------------------------------------------------
还是你的这个代码更好,而且一看就明白怎么回事
yoya0303
发表于 2010-8-20 21:06:57
makeyixia
win2kddk
发表于 2010-8-20 21:51:33
老帖子了
qilujie
发表于 2010-8-21 00:00:41
必须马克
Notting_Hill
发表于 2010-8-21 00:11:43
mark
yiminglei
发表于 2010-8-21 02:04:36
mark
gentlerain
发表于 2010-8-21 08:33:18
蔡勒(Zeller)公式:是一个计算星期的公式。
随便给一个日期,就能用这个公式推算出是星期几。
蔡勒公式如下:
W = - 2C + y + + + d - 1
公式中的符号含义如下:
w:星期; w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六
c:世纪-1(前两位数)
y:年(后两位数)
m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算)
d:日
[ ]代表取整,即只要整数部分。
下面以中华人民共和国成立100周年纪念日那天(2049年10月1日)来计算是星期几,过程如下:
w=y++-2c++d-1
=49++-2×20++1-1
=49++5-40+
=49+12+5-40+28
=54 (除以7余5)
即2049年10月1日(100周年国庆)是星期五。
再比如计算2006年4月4日,过程如下:
w=y++-2c++d-1
=6++-2*20++4-1
=-12 (除以7余2,注意对负数的取模运算!)
不过,以上的公式都只适合于1582年(我国明朝万历十年)10月15日之后的情形。罗马教皇格里高利十三世在1582年组织了一批天文学家,根据哥白尼日心说计算出来的数据,对儒略历作了修改。将1582年10月5日到14日之间的10天宣布撤销,继10月4日之后为10月15日。
后来人们将这一新的历法称为“格里高利历”,也就是今天世界上所通用的历法,简称格里历或公历。
tomhe666
发表于 2010-8-21 08:35:17
记号
wjw123abc
发表于 2010-8-21 10:45:27
mark
feixue2588
发表于 2010-8-21 11:25:21
mark
buji
发表于 2010-8-22 10:00:49
回复【楼主位】hexixiaomao 猫云澜
-----------------------------------------------------------------------
貌似return后面的1要去掉才对
Think_lx
发表于 2010-8-22 10:18:57
记号
danielmi
发表于 2010-9-5 10:33:43
好贴,非常感谢,使用上了,呵呵……
jack_yu
发表于 2010-9-5 11:39:26
mark!
yuyu87
发表于 2010-9-5 12:13:33
mark 日期算法
_Kevin_
发表于 2010-9-5 13:53:47
标记
287355586
发表于 2010-9-5 14:49:09
回复【176楼】gentlerain
-----------------------------------------------------------------------
你太强悍了啊,一直在研究这个啊
Danson.Shen
发表于 2010-9-6 10:31:23
受教了,谢谢各位强人
delconomico
发表于 2010-9-9 15:56:52
TUWEN
jsjjccc
发表于 2010-9-9 16:24:41
有用的
electron_love
发表于 2010-9-16 16:03:08
mark
QQ373466062
发表于 2010-10-7 22:05:16
马上用
arvidwen
发表于 2010-10-8 07:03:54
thx 4 share。
wxx116zh
发表于 2010-10-8 08:23:45
mark
linghu2
发表于 2010-10-8 12:18:29
我也转贴一下
一:常用公式
W = + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D
Y是年份数,D是这一天在这一年中的累积天数,也就是这一天在这一年中是第几天。
二:蔡勒(Zeller)公式
w=y++-2c++d-1
公式中的符号含义如下,w:星期;c:世纪;y:年(两位数); m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算);d:日;[ ]代表取整,即只要整数部分。
相比于通用通用计算公式而言,蔡勒(Zeller)公式大大降低了计算的复杂度。
三:对蔡勒(Zeller)公式的改进
作者:冯思琮
相比于另外一个通用通用计算公式而言,蔡勒(Zeller)公式大大降低了计算的复杂度。不过,笔者给出的通用计算公式似乎更加简洁(包括运算过程)。现将公式列于其下:
W=+r (y/7)-2r(c/4)+m’+d
公式中的符号含义如下,r ( )代表取余,即只要余数部分;m’是m的修正数,现给出1至12月的修正数1’至12’如下:(1’,10’)=6;(2’,3’,11’)=2;(4’,7’)=5;5’=0;6’=3;8’=1;(9’,12’)=4(注意:在笔者给出的公式中,y为润年时1’=5;2’=1)。其他符号与蔡勒(Zeller)公式中的含义相同。
四:基姆拉尔森计算公式
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
在公式中d表示日期中的日数,m表示月份数,y表示年数。
注意:在公式中有个与其他公式不同的地方:
把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。好像就是公式
wozhiaihe
发表于 2010-10-8 13:56:50
mark
jpchen
发表于 2010-10-8 15:15:10
mark
bipengjiang
发表于 2010-10-8 18:45:59
mark
minipc5
发表于 2010-10-8 19:26:06
mark
superyongzhe
发表于 2010-10-8 22:19:57
mark