魔方网表 让信息化更简单

 找回密码
 注册
查看: 5503|回复: 1

[资料] 计算某一天是一年中的第几天和第几周及当月第几周

[复制链接]
pobopo 发表于 2011-2-25 18:30:23 | 显示全部楼层 |阅读模式
本帖最后由 pobopo 于 2011-2-28 17:57 编辑

http://iask.sina.com.cn/search_engine/snapshot.php?key=%D2%BB%C4%EA%C4%DA%D6%DC%CA%FD%B5%C4%BC%C6%CB%E3%B7%BD%B7%A8&url=http%3A%2F%2Fzhidao.baidu.com%2Fquestion%2F9963108.html&snapid=316095227&snap=%7B%D2%BB%2F%C4%EA%7D%2F%C4%DA%2F%D6%DC%CA%FD%2F%B5%C4%2F%BC%C6%CB%E3%2F%B7%BD%B7%A8
如何计算某一天是一年中的第几周?
悬赏分:35 - 解决时间:2006-7-28 08:55
条件是:
已经三个参数:year, month, day为整型数值,分别表示某天的年月日信息。
问题:
在不使用与语言有关的类库信息时,如何准确、快速的计算出该天是一年中的第几周?
不知道哪位高手能够给出一个算法,多谢!(仅计算原理也可以)
问题补充:
不用数据库查寻的,关键是算法与处理流程。
提问者: Amon_Yao - 三级

最佳答案
首先要知道这一天是这一年中的第几天,例如:4月16日  他就是 31+28(平年)+31+16=106天
106/7=15.....1
如果有余数就把15+1=16
如果没有余数不变。
所以4月16日应该是第16周
而4月15日 105/7=15  所以是第15周
至于平年和闰年的判定
可以被4整除但是不能被100整除的年是闰年
同时可以被400整除的年也是闰年
例如:1900,1800 都不是闰年
2000,2004,2008,1996都是闰年

------------------------------------------
拟在魔方网表中实现,其计算公式的编写:

准备字段:日期、本年第几天、本年第几周、本月第几周


平年中的第几天:
if(month($MF(日期)$)=1,day($MF(日期)$),if(month($MF(日期)$)=2,31+day($MF(日期)$),if(month($MF(日期)$)=3,31+28+day($MF(日期)$),if(month($MF(日期)$)=4,31+28+31+day($MF(日期)$),if(month($MF(日期)$)=5,31+28+31+30+day($MF(日期)$),if(month($MF(日期)$)=6,31+28+31+30+31+day($MF(日期)$),if(month($MF(日期)$)=7,31+28+31+30+31+30+day($MF(日期)$),if(month($MF(日期)$)=8,31+28+31+30+31+30+31+day($MF(日期)$),if(month($MF(日期)$)=9,31+28+31+30+31+30+31+31+day($MF(日期)$),if(month($MF(日期)$)=10,31+28+31+30+31+30+31+31+30+day($MF(日期)$),if(month($MF(日期)$)=11,31+28+31+30+31+30+31+31+30+31+day($MF(日期)$),31+28+31+30+31+30+31+31+30+31+30+day($MF(日期)$))))))))))))

闰年中的第几天:
if(month($MF(日期)$)=1,day($MF(日期)$),if(month($MF(日期)$)=2,31+day($MF(日期)$),if(month($MF(日期)$)=3,31+29+day($MF(日期)$),if(month($MF(日期)$)=4,31+29+31+day($MF(日期)$),if(month($MF(日期)$)=5,31+29+31+30+day($MF(日期)$),if(month($MF(日期)$)=6,31+29+31+30+31+day($MF(日期)$),if(month($MF(日期)$)=7,31+29+31+30+31+30+day($MF(日期)$),if(month($MF(日期)$)=8,31+29+31+30+31+30+31+day($MF(日期)$),if(month($MF(日期)$)=9,31+29+31+30+31+30+31+31+day($MF(日期)$),if(month($MF(日期)$)=10,31+29+31+30+31+30+31+31+30+day($MF(日期)$),if(month($MF(日期)$)=11,31+29+31+30+31+30+31+31+30+31+day($MF(日期)$),31+29+31+30+31+30+31+31+30+31+30+day($MF(日期)$))))))))))))


同时判断平年或闰年,得出”本年第几天“:
if(or(and(mod(year($MF(日期)$),4)=0,mod(year($MF(日期)$),100)<>0),mod(year($MF(日期)$),400)=0),if(month($MF(日期)$)=1,day($MF(日期)$),if(month($MF(日期)$)=2,31+day($MF(日期)$),if(month($MF(日期)$)=3,31+29+day($MF(日期)$),if(month($MF(日期)$)=4,31+29+31+day($MF(日期)$),if(month($MF(日期)$)=5,31+29+31+30+day($MF(日期)$),if(month($MF(日期)$)=6,31+29+31+30+31+day($MF(日期)$),if(month($MF(日期)$)=7,31+29+31+30+31+30+day($MF(日期)$),if(month($MF(日期)$)=8,31+29+31+30+31+30+31+day($MF(日期)$),if(month($MF(日期)$)=9,31+29+31+30+31+30+31+31+day($MF(日期)$),if(month($MF(日期)$)=10,31+29+31+30+31+30+31+31+30+day($MF(日期)$),if(month($MF(日期)$)=11,31+29+31+30+31+30+31+31+30+31+day($MF(日期)$),31+29+31+30+31+30+31+31+30+31+30+day($MF(日期)$)))))))))))),if(month($MF(日期)$)=1,day($MF(日期)$),if(month($MF(日期)$)=2,31+day($MF(日期)$),if(month($MF(日期)$)=3,31+28+day($MF(日期)$),if(month($MF(日期)$)=4,31+28+31+day($MF(日期)$),if(month($MF(日期)$)=5,31+28+31+30+day($MF(日期)$),if(month($MF(日期)$)=6,31+28+31+30+31+day($MF(日期)$),if(month($MF(日期)$)=7,31+28+31+30+31+30+day($MF(日期)$),if(month($MF(日期)$)=8,31+28+31+30+31+30+31+day($MF(日期)$),if(month($MF(日期)$)=9,31+28+31+30+31+30+31+31+day($MF(日期)$),if(month($MF(日期)$)=10,31+28+31+30+31+30+31+31+30+day($MF(日期)$),if(month($MF(日期)$)=11,31+28+31+30+31+30+31+31+30+31+day($MF(日期)$),31+28+31+30+31+30+31+31+30+31+30+day($MF(日期)$)))))))))))))

--------------------
最初的公式原稿:
if(month($MF(日期)$)=1,day($MF(日期)$),
if(month($MF(日期)$)=2,31+day($MF(日期)$),
if(month($MF(日期)$)=3,31+28+day($MF(日期)$),
if(month($MF(日期)$)=4,31+28+31+day($MF(日期)$),
if(month($MF(日期)$)=5,31+28+31+30+day($MF(日期)$),
if(month($MF(日期)$)=6,31+28+31+30+31+day($MF(日期)$),
if(month($MF(日期)$)=7,31+28+31+30+31+30+day($MF(日期)$),
if(month($MF(日期)$)=8,31+28+31+30+31+30+31+day($MF(日期)$),
if(month($MF(日期)$)=9,31+28+31+30+31+30+31+31+day($MF(日期)$),
if(month($MF(日期)$)=10,31+28+31+30+31+30+31+31+30+day($MF(日期)$),
if(month($MF(日期)$)=11,31+28+31+30+31+30+31+31+30+31+day($MF(日期)$),
31+28+31+30+31+30+31+31+30+31+30+day($MF(日期)$))))))))))))
------------------------------------------


第一周有几天:
判断元旦是星期几。如果不是星期日(以星期日为一周的第一天),则第一周没有七天,那么就先减去第一周的天数,再将按照”最佳答案“的方法计算出来的周数加一,否则不加一。

元旦的星期数:MFWEEKDAY(date(year($MF(日期)$),1,1))
结果1为星期日,为2是星期一,以此类推。
若,则
=7,-1
=6,-2
=5,-3
=4,-4
=3,-5
=2,-6
=1,-0

公式原稿:
------------------------
if(and(mod($MF(本年第几天)$-1,7)<>0,MFWEEKDAY(date(year($MF(日期)$),1,1))=7),int(($MF(本年第几天)$-1)/7)+1+1,
if(and(mod($MF(本年第几天)$-2,7)<>0,MFWEEKDAY(date(year($MF(日期)$),1,1))=6),int(($MF(本年第几天)$-2)/7)+1+1,
if(and(mod($MF(本年第几天)$-3,7)<>0,MFWEEKDAY(date(year($MF(日期)$),1,1))=5),int(($MF(本年第几天)$-3)/7)+1+1,
if(and(mod($MF(本年第几天)$-4,7)<>0,MFWEEKDAY(date(year($MF(日期)$),1,1))=4),int(($MF(本年第几天)$-4)/7)+1+1,
if(and(mod($MF(本年第几天)$-5,7)<>0,MFWEEKDAY(date(year($MF(日期)$),1,1))=3),int(($MF(本年第几天)$-5)/7)+1+1,
if(and(mod($MF(本年第几天)$-6,7)<>0,MFWEEKDAY(date(year($MF(日期)$),1,1))=2),int(($MF(本年第几天)$-6)/7)+1+1,
if(and(mod($MF(本年第几天)$-0,7)<>0,MFWEEKDAY(date(year($MF(日期)$),1,1))=1),int(($MF(本年第几天)$-0)/7)+1,
if(and(mod($MF(本年第几天)$-1,7)=0,MFWEEKDAY(date(year($MF(日期)$),1,1))=7),int(($MF(本年第几天)$-1)/7)+1,
if(and(mod($MF(本年第几天)$-2,7)=0,MFWEEKDAY(date(year($MF(日期)$),1,1))=6),int(($MF(本年第几天)$-2)/7)+1,
if(and(mod($MF(本年第几天)$-3,7)=0,MFWEEKDAY(date(year($MF(日期)$),1,1))=5),int(($MF(本年第几天)$-3)/7)+1,
if(and(mod($MF(本年第几天)$-4,7)=0,MFWEEKDAY(date(year($MF(日期)$),1,1))=4),int(($MF(本年第几天)$-4)/7)+1,
if(and(mod($MF(本年第几天)$-5,7)=0,MFWEEKDAY(date(year($MF(日期)$),1,1))=3),int(($MF(本年第几天)$-5)/7)+1,
if(and(mod($MF(本年第几天)$-6,7)=0,MFWEEKDAY(date(year($MF(日期)$),1,1))=2),int(($MF(本年第几天)$-6)/7)+1,int(($MF(本年第几天)$-0)/7)
)))))))))))))
------------------------

”本年第几周“最终的公式:
if(and(mod($MF(本年第几天)$-1,7)<>0,MFWEEKDAY(date(year($MF(日期)$),1,1))=7),int(($MF(本年第几天)$-1)/7)+1+1,if(and(mod($MF(本年第几天)$-2,7)<>0,MFWEEKDAY(date(year($MF(日期)$),1,1))=6),int(($MF(本年第几天)$-2)/7)+1+1,if(and(mod($MF(本年第几天)$-3,7)<>0,MFWEEKDAY(date(year($MF(日期)$),1,1))=5),int(($MF(本年第几天)$-3)/7)+1+1,if(and(mod($MF(本年第几天)$-4,7)<>0,MFWEEKDAY(date(year($MF(日期)$),1,1))=4),int(($MF(本年第几天)$-4)/7)+1+1,if(and(mod($MF(本年第几天)$-5,7)<>0,MFWEEKDAY(date(year($MF(日期)$),1,1))=3),int(($MF(本年第几天)$-5)/7)+1+1,if(and(mod($MF(本年第几天)$-6,7)<>0,MFWEEKDAY(date(year($MF(日期)$),1,1))=2),int(($MF(本年第几天)$-6)/7)+1+1,if(and(mod($MF(本年第几天)$-0,7)<>0,MFWEEKDAY(date(year($MF(日期)$),1,1))=1),int(($MF(本年第几天)$-0)/7)+1,if(and(mod($MF(本年第几天)$-1,7)=0,MFWEEKDAY(date(year($MF(日期)$),1,1))=7),int(($MF(本年第几天)$-1)/7)+1,if(and(mod($MF(本年第几天)$-2,7)=0,MFWEEKDAY(date(year($MF(日期)$),1,1))=6),int(($MF(本年第几天)$-2)/7)+1,if(and(mod($MF(本年第几天)$-3,7)=0,MFWEEKDAY(date(year($MF(日期)$),1,1))=5),int(($MF(本年第几天)$-3)/7)+1,if(and(mod($MF(本年第几天)$-4,7)=0,MFWEEKDAY(date(year($MF(日期)$),1,1))=4),int(($MF(本年第几天)$-4)/7)+1,if(and(mod($MF(本年第几天)$-5,7)=0,MFWEEKDAY(date(year($MF(日期)$),1,1))=3),int(($MF(本年第几天)$-5)/7)+1,if(and(mod($MF(本年第几天)$-6,7)=0,MFWEEKDAY(date(year($MF(日期)$),1,1))=2),int(($MF(本年第几天)$-6)/7)+1,int(($MF(本年第几天)$-0)/7))))))))))))))

字段:本月第几周
计算公式
if(and(mod(day($MF(日期)$)-1,7)<>0,MFWEEKDAY(date(year($MF(日期)$),month($MF(日期)$),1))=7),int((day($MF(日期)$)-1)/7)+1+1,if(and(mod(day($MF(日期)$)-2,7)<>0,MFWEEKDAY(date(year($MF(日期)$),month($MF(日期)$),1))=6),int((day($MF(日期)$)-2)/7)+1+1,if(and(mod(day($MF(日期)$)-3,7)<>0,MFWEEKDAY(date(year($MF(日期)$),month($MF(日期)$),1))=5),int((day($MF(日期)$)-3)/7)+1+1,if(and(mod(day($MF(日期)$)-4,7)<>0,MFWEEKDAY(date(year($MF(日期)$),month($MF(日期)$),1))=4),int((day($MF(日期)$)-4)/7)+1+1,if(and(mod(day($MF(日期)$)-5,7)<>0,MFWEEKDAY(date(year($MF(日期)$),month($MF(日期)$),1))=3),int((day($MF(日期)$)-5)/7)+1+1,if(and(mod(day($MF(日期)$)-6,7)<>0,MFWEEKDAY(date(year($MF(日期)$),month($MF(日期)$),1))=2),int((day($MF(日期)$)-6)/7)+1+1,if(and(mod(day($MF(日期)$)-0,7)<>0,MFWEEKDAY(date(year($MF(日期)$),month($MF(日期)$),1))=1),int((day($MF(日期)$)-0)/7)+1,if(and(mod(day($MF(日期)$)-1,7)=0,MFWEEKDAY(date(year($MF(日期)$),month($MF(日期)$),1))=7),int((day($MF(日期)$)-1)/7)+1,if(and(mod(day($MF(日期)$)-2,7)=0,MFWEEKDAY(date(year($MF(日期)$),month($MF(日期)$),1))=6),int((day($MF(日期)$)-2)/7)+1,if(and(mod(day($MF(日期)$)-3,7)=0,MFWEEKDAY(date(year($MF(日期)$),month($MF(日期)$),1))=5),int((day($MF(日期)$)-3)/7)+1,if(and(mod(day($MF(日期)$)-4,7)=0,MFWEEKDAY(date(year($MF(日期)$),month($MF(日期)$),1))=4),int((day($MF(日期)$)-4)/7)+1,if(and(mod(day($MF(日期)$)-5,7)=0,MFWEEKDAY(date(year($MF(日期)$),month($MF(日期)$),1))=3),int((day($MF(日期)$)-5)/7)+1,if(and(mod(day($MF(日期)$)-6,7)=0,MFWEEKDAY(date(year($MF(日期)$),month($MF(日期)$),1))=2),int((day($MF(日期)$)-6)/7)+1,int((day($MF(日期)$)-0)/7))))))))))))))
本年第几天和第几周.PNG
本年第几天本年第几周本月第几周.PNG

本年第几天本年第几周本月第几周.mft

12.14 KB, 下载次数: 5

售价: 2 魔方币  [记录]

高亮显示 发表于 2024-4-5 19:46:49 | 显示全部楼层
几天是”本年第几天“?
是不是用 TODAY()-EDATE(YEAR(TODAY()),1,1)+1
就可以算出啦?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则


Archiver|手机版|小黑屋|魔方软件 ( 京ICP备08008787号 )

京公网安备 11010702001722号

GMT+8, 2024-4-30 02:26 , Processed in 0.176921 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表