|
こんにちは。
プログラミング関係の仕事をされている方には初歩の初歩なのかも知れま
せん。
でも、いざ無から作ろうと思うとちょっと大変。私が我流で作ったのはこ
んな感じです。良かったら使ってください。
( 何10万年も過去や未来の計算はできません。
0年は 紀元前 1年、-1年は 紀元前 2年です )
;datetolinear と lineeartodate
beginloop ; 動作check
input "年月日 001231 or 2000/12/31", #date
if( #date == "" or cancel ) exit
datetolinear #date, ##datel
if( search( #date, "/" ) == "" )
call datetolinear, #date
else
call datetolinear8, #date
endif
##lind = value( #return )
message "script func:^I" + ##lind + "^Mdatetolinear:^I" + ##datel
call lineartoweek, ##lind
#week = #return
call lineartodate, ##lind
message #date + "^M" + #return + " " + #week
endloop
datetolinear8: ;リニア化 type 99/12/31
##f = 1
goto datetolinear_p1
datetolinear10: ;リニア化 type 1999/12/31
##f = 0
datetolinear_p1:
#s = tohankaku( #1 )
##i = 3
while( 0 < ##i )
##i = ##i - 1
##p[ ##i ] = value( #s )
#s = search( #s, "/" )
if( #s == "" )
#s = "1"
else
#s = part( #s, 1, 255 )
endif
endwhile
if( 0 < ##f )
if( 0 <= ##p[2] and ##p[2] < 100 )
##p[2] = ( ##p[2] + 20 ) % 100 + 1980
endif
endif
call datetolinear_f, ##p[2], ##p[1], ##p[0]
return #return
datetolinear: ;リニア化 type 991231
call datetolinear_f, \
( value( part( #1, 0, 2 ) ) + 20 ) % 100 + 1980, \
part( #1, 2, 2 ), part( #1, 4, 2 )
return #return
datetolinear_f: ;年, 月, 日 1980/01/01からの経過日数に変換
##b = value( #2 )
##a = ( ##b + 17638463 ) / 12 - 1469872
##b = - ##a * 12 + ##b + 9
##a = ( ##b - 17 ) / 6 + value( #1 ) + ##a + 732800
return "" + ( \
( ##b % 12 * 153 + 2 ) / 5 + ( ##a * 1461 / 4 ) \
- ( ##a / 100 ) + ( ##a / 400 ) \
+ value( #3 ) - 268372825 \
)
lineartoweek: ;日付リニア値から曜日を求める
return part( "日月火水木金土", ( value( #1 ) + 268372827 ) % 7 * 2, 2 )
lineartoweek_e:
return part( "SunMonTueWedThuFriSat", ( value( #1 ) + 268372827 ) % 7 * 3, 3 )
lineartodate10: ;戻し type 1999/12/31
#rp = "lineartodate_p2"
goto lineartodate_f
lineartodate_p2:
#s = "0" + ##c
#s = "0" + ##b + "/" + part( #s, length( #s ) - 2, 2 )
#s = "" + ##a + "/" + part( #s, length( #s ) - 5, 5 )
if( 0 <= ##a and ##a < 1000 )
#s = "000" + #s
#s = part( #s, length( #s ) - 10, 10 )
endif
return #s
lineartodate: ;戻し type 991231
#rp = "lineartodate_p1"
goto lineartodate_f
lineartodate_p1:
#s = "0" + ( ( ##a * 100 + ##b ) * 100 + ##c )
return part( #s, length( #s ) - 6, 6 )
lineartodate_f: ;日付リニア値を一般形式に戻す
##c = value( #1 ) + 268372824 ; 723120+267649704= 268372824
##a = ( ##c * 4 + 3 ) / 146097
##c = - ##a * 146097 / 4 + ##c
##e = ( ##c * 4 + 3 ) / 1461
##c = - ##e * 1461 / 4 + ##c
##b = ( ##c * 5 + 2 ) / 153
##c = - ( ##b * 153 + 2 ) / 5 + 1 + ##c
##a = ##a * 100 + ##e + ( ##b / 10 ) - 732800
##b = ( ##b + 2 ) % 12 + 1
goto #rp
|
|