|
|
2008/2/28(Thu) 12:20:37|NO.13795
日々,掲示板を利用しながら,勉強しており,感謝してます.
また初心者の質問ですが,ご助言ください.
日付の計算をさせて,日数や月数を計算させたいのですが,
いい関数は,どなたかご存知でしょうか?
例えばですが,
A=2008/5/1
B=2009/10/1
C=B−A です.(Cは,日数や月数を求めます.)
調べましたけど,現在時刻しか見当たらず.
以上,どなたかご助言よろしくお願いします.
|
|
2008/2/28(Thu) 15:12:37|NO.13797
なんかあたっているかどうかわからないけど
width 12+300+12,12+19+6+21+6+400+12
nen=1:gatu=1:hi=1
syscolor 15:boxf
objsize 33,19
pos 12,12:input nen
pos 12+33+6,12:input gatu
pos 12+33+6+33+6,12:input hi
pos 12,12+19+6:objsize 88,21:button "ok",*a
m(0)=0,0,31,58,89,119,150,180,211,242,272,303,334
b=""
pos 12,12+19+6+21+6:mesbox b,300,400
stop
*a
b=""
repeat nen-1
c=cnt+1
uru=0:if c\4=0:uru=1:if c\100=0:uru=0:if c\400=0:uru=1
gokei+=365+uru
b+="西暦 "+strf("%04d",c)+" 年の日数 "+(365+uru)+""
if uru=1 :b+=" * "
b+="\n"
await 0
loop
gokei2=gokei:gokei=0
uru=0:if nen\4=0:uru=1:if nen\100=0:uru=0:if nen\400=0:uru=1
p=0:if uru=1:if gatu>2:p=uru
gokei3=m(gatu)+p+hi
b+="\n西暦 "+(nen-1)+" 年 12 月 31 日までの経過日数は "+gokei2+" 日\n"
b+="西暦 "+nen+" 年 1 月 1 日からの経過日数は "+(gokei3-1)+" 日\n\n"
b+="西暦 0001 年 1 月 1 日からの経過日数は "+(gokei2+gokei3-1)+" 日\n"
objprm 4,b
|
|
2008/2/28(Thu) 15:23:46|NO.13799
モジュール化すると
#module
#defcfunc gregorius int nen,int gatu,int hi
m(0)=0,0,31,58,89,119,150,180,211,242,272,303,334
repeat nen-1
c=cnt+1
uru=0:if c\4=0:uru=1:if c\100=0:uru=0:if c\400=0:uru=1
gokei+=365+uru
await 0
loop
gokei2=gokei:gokei=0
uru=0:if nen\4=0:uru=1:if nen\100=0:uru=0:if nen\400=0:uru=1
p=0:if uru=1:if gatu>2:p=uru
gokei3=m(gatu)+p+hi
keka=gokei2+gokei3-1
return keka
#global
mes gregorius(2018,4,6)-gregorius(2008,2,28)
正しいかどうか検証してもらいたい。
|
|
2008/2/28(Thu) 15:34:57|NO.13800
西暦0001年1月1日は日曜らしいので
今日も求められるはず。
s(0)="土","日","月","火","水","木","金"
mes s((gregorius(1,1,1)+1)\7)
mes s((gregorius(2008,2,28)+1)\7)
間違ってる・・・?^^:
|
|
2008/2/28(Thu) 15:48:32|NO.13802
意外と単純じゃなかった(^^;
・平年は元旦と大晦日は同じ曜日
・西暦0004年は平年
|
|
2008/2/28(Thu) 15:54:47|NO.13803
m(0)=0,0,31,58,89,119,150,180,211,242,272,303,334
58が59で、そこから後が全て1少ないと思いますが、どうでしょう?
|
|
2008/2/28(Thu) 16:26:46|NO.13804
ご指摘ありがとうございます
修正版
#module
#defcfunc gregorius int nen,int gatu,int hi
m(0)=0,0,31,59,90,120,151,181,212,243,273,304,334
repeat nen-1
c=cnt+1
uru=0:if c\4=0:uru=1:if c\100=0:uru=0:if c\400=0:uru=1
if c=4:uru=0
gokei+=365+uru
await 0
loop
gokei2=gokei:gokei=0
uru=0:if nen\4=0:uru=1:if nen\100=0:uru=0:if nen\400=0:uru=1
if nen=4:uru=0
p=0:if uru=1:if gatu>2:p=uru
gokei3=m(gatu)+p+hi
keka=gokei2+gokei3-1
return keka
#global
s(0)="火","水","木","金","土","日","月"
mes "2008 2 28 は"+s(gregorius(2008,2,28)\7)+"曜日"
mes "2000 1 1 は"+s(gregorius(2000,1,1)\7)+"曜日"
mes "2009 3 5 は"+s(gregorius(2009,3,5)\7)+"曜日"
mes "2000 1 1 から 2011 7 31 までは"+abs(gregorius(2000,1,1)-gregorius(2011,7,31))+"日間"
mes "グレゴリオ暦 の始まった 1582 10 15 から有効 ちなみに"+s(gregorius(1582,10,15)\7)+"曜日"
|
|
2008/2/28(Thu) 16:31:04|NO.13805
ユリウス暦が1582年10月4日までで次の日からグレゴリオ暦の1582年10月15日と言うことなので
複雑なのでそこらへんやってません・・・
まぁ十分でしょう。
|
|
2008/2/29(Fri) 12:24:32|NO.13827
ども皆様ありがとうございました.
このルーチンで解決できました.
|
|
2008/2/29(Fri) 13:10:47|NO.13829
日数計算、ユリウス日で検索するとたくさんヒットします。
たしかhspstdlibにもsampleがあったと思います。
#module
#defcfunc mjd int yy,int mm,int dd
if mm<3 :mm_=mm+12: yy_=yy-1:else:mm_=mm:yy_=yy
md= 0.0+int(365.25 *yy_) +int(yy_/400) -int(yy_/100) +int(30.59*(mm_-2))+dd -678912
return md
#global
screen 0,250,200
pos 60,
mes "yyyy mm dd"
objsize 30,20
pos 60,20
input yy1,,,4:in(0)=stat
input yy2,,,4:in(1)=stat
pos 100,20
input mm1,,,2:in(2)=stat
input mm2,,,2:in(3)=stat
pos 140,20
input dd1,,,2:in(4)=stat
input dd2,,,2:in(5)=stat
pos 60
objsize 110,20
input dummy,,,10:in(6)=stat
button "計算(C=B-A)",*calc
button "クリア",*clear
pos 45,23
mes "A\nB\nC"
*clear
repeat 7
objprm in(cnt),""
loop
stop
*calc
A=mjd(yy1,mm1,dd1)
B=mjd(yy2,mm2,dd2)
C=int(B-A)
objprm in(6),C
stop
|
|
2008/2/29(Fri) 13:15:59|NO.13830
遅かったか?・・・
|
|
2008/2/29(Fri) 20:27:19|NO.13833
私のプログラムではグレゴリオ暦をシュミレートしているため遅いです。
2000年なら(2000-1)回ループしますし、
knock2さんの提示しているスクリプトのほうが優れています(^^
|
|