getdate で取得した日付の一週間前の日付No.00253
とほほ さん 00/01/09 16:07
 

皆さんこんにちはm(__)m

いえ、別に一週間前でなくても良いのですが(^^ゞ
「特定の日付の何日前は何月何日だ」と言う結果をスクリプトで出せないか
悩んでいるんです。

例えば私の参加しているネットでは未読の判定を「読了ポインタ」を設定し
それより後の書きこみを未読として処理しているわけですが、その読了
ポインタの設定をスクリプトを使って一週間前に設定しなおしたい訳です。

getdate で取得した文字列を使ってなんとかそれが出来ないものか?
と言う悩みなんですがやっぱり無理ですかね?(^^;

 datetolinear文 の逆の処理が出来れば答えは簡単なんですが、、。

                         とほほ


[ ]
RE:00253 getdate で取得した日付の一週No.00255
よこしま さん 00/01/11 19:22
 
こんにちは, とほほさん.

以前作成したスクリプトからいかのものを発見しました
のでご参考まで

使い方は

call CalDate "000101", "1"

message #return

みたいな感じです.

メッセージボックスに

991231

が表示されます



;ここから


;************ 日付の計算 *********
; 渡された日数分さかのぼった日付を返す
; 閏年と2000年以降にも一応対応

CalDate:
        datetolinear(#1), ##target0
        ##target = ##target0 - value(#2)
        #year = part(#1, 0, 2)
        datetolinear(#year + "0101"), ##gantan
        ##year = value(#year)

CalDateSub:
        ##day = ##target - ##gantan
        ;##day=1/1から何日経過しているか

        switch ##year
                case 96, 92, 88, 84, 80, 0, 4, 8, 12
                        ##add = 1
                case default
                        ##add = 0
        endswitch

        if(##day<0)
                ##year = ##year - 1
                if(##year<0)
                        ##year = ##year + 100
                endif
                switch ##year
                        case 96, 92, 88, 84, 80, 0, 4, 8, 12
                                ##backdays = 366
                        case default
                                ##backdays = 365
                endswitch
                ##gantan = ##gantan - ##backdays
                goto CalDateSub
        elseif(##day<31)
                #month = "01"
        elseif(##day<59 + ##add)
                #month = "02"
        elseif(##day<90 + ##add)
                #month = "03"
        elseif(##day<120 + ##add)
                #month = "04"
        elseif(##day<151 + ##add)
                #month = "05"
        elseif(##day<181 + ##add)
                #month = "06"
        elseif(##day<212 + ##add)
                #month = "07"
        elseif(##day<243 + ##add)
                #month = "08"
        elseif(##day<273 + ##add)
                #month = "09"
        elseif(##day<304 + ##add)
                #month = "10"
        elseif(##day<334 + ##add)
                #month = "11"
        else
                #month = "12"
        endif

        if(##year<10)
                #year == "0" + ##year
        else
                #year == ##year
        endif

        datetolinear(#year + #month + "01"), ##target0

        ##day = ##target - ##target0 + 1

        if(##day<10)
                #day = "0" + ##day
        else
                #day = ##day
        endif
        #target == #year + #month + #day
return #target



;ここまで




よこしま

Send 00/01/11


[ ]
RE:00255 getdate で取得した日付の一週No.00260
とほほ さん 00/01/14 23:45
 
‖>以前作成したスクリプトからいかのものを発見しました
‖>のでご参考まで

あーーなるほどーー、ありがとうございます。m(__)m
実は私スクリプトをネットで公開しているのですがこのサブルーチンを
公開版スクリプトで使わせていただいてもよろしいものなんでしょうか?

どちらにしても大変勉強になりました。m(__)m


[ ]
RE:00260 getdate で取得した日付の一週No.00261
よこしま さん 00/01/15 22:42
 
こんにちは, とほほさん.

> 公開版スクリプトで使わせていただいてもよろしいものなんでしょうか?

どうぞ, ご自由にお使い下さい.

> どちらにしても大変勉強になりました。m(__)m

お役に立てて良かったです.



よこしま

Send 00/01/15


[ ]
RE:00255 "getdate で取得した日付の一週No.00308
iceaxs さん 00/12/20 20:06
 
iceaxsです。

いつもお世話になっております。

すみません。ご質問です。
何日前の日付を算出したくて検索していたら、
以前に同じようなことで、質問があったのですが、
こちらの使い方が良く分からなかったので、教えてください。
また、私はスクリプトを起動時に自動的にPCの日付を元に、
1日前の日付を算出しその結果を元にいろいろ加工していきたいと
考えているのですが、なにか参考となるスクリプトがありましたら、
教えてください。
よろしくお願いします。





>こんにちは, とほほさん.
>
>以前作成したスクリプトからいかのものを発見しました
>のでご参考まで
>
>使い方は
>
>call CalDate "000101", "1"
>
>message #return
>
>みたいな感じです.
>
>メッセージボックスに
>
>991231
>
>が表示されます
>
>
>
>;ここから
>
>
>;************ 日付の計算 *********
>; 渡された日数分さかのぼった日付を返す
>; 閏年と2000年以降にも一応対応
>
>CalDate:
>        datetolinear(#1), ##target0
>        ##target = ##target0 - value(#2)
>        #year = part(#1, 0, 2)
>        datetolinear(#year + "0101"), ##gantan
>        ##year = value(#year)
>
>CalDateSub:
>        ##day = ##target - ##gantan
>        ;##day=1/1から何日経過しているか
>
>        switch ##year
>                case 96, 92, 88, 84, 80, 0, 4, 8, 12
>                        ##add = 1
>                case default
>                        ##add = 0
>        endswitch
>
>        if(##day<0)
>                ##year = ##year - 1
>                if(##year<0)
>                        ##year = ##year + 100
>                endif
>                switch ##year
>                        case 96, 92, 88, 84, 80, 0, 4, 8, 12
>                                ##backdays = 366
>                        case default
>                                ##backdays = 365
>                endswitch
>                ##gantan = ##gantan - ##backdays
>                goto CalDateSub
>        elseif(##day<31)
>                #month = "01"
>        elseif(##day<59 + ##add)
>                #month = "02"
>        elseif(##day<90 + ##add)
>                #month = "03"
>        elseif(##day<120 + ##add)
>                #month = "04"
>        elseif(##day<151 + ##add)
>                #month = "05"
>        elseif(##day<181 + ##add)
>                #month = "06"
>        elseif(##day<212 + ##add)
>                #month = "07"
>        elseif(##day<243 + ##add)
>                #month = "08"
>        elseif(##day<273 + ##add)
>                #month = "09"
>        elseif(##day<304 + ##add)
>                #month = "10"
>        elseif(##day<334 + ##add)
>                #month = "11"
>        else
>                #month = "12"
>        endif
>
>        if(##year<10)
>                #year == "0" + ##year
>        else
>                #year == ##year
>        endif
>
>        datetolinear(#year + #month + "01"), ##target0
>
>        ##day = ##target - ##target0 + 1
>
>        if(##day<10)
>                #day = "0" + ##day
>        else
>                #day = ##day
>        endif
>        #target == #year + #month + #day
>return #target
>
>
>
>;ここまで
>
>
>
>
>よこしま
>
>Send 00/01/11
>

[ ]
RE:00308 "getdate で取得した日付の一週No.00309
秀まるお さん 00/12/22 18:50
 
 日付を数値に変換するにはdatetolinearという関数がありますが、これから元の日
付文字列に戻す関数はありません。したがって、スクリプトの標準的な文だけを使っ
て1日前の日付を計算するのは無理です。

 しいてやるとしたら、うるう年の計算なんかを自前でやって、前の日を計算するっ
て方法になると思います。


[ ]
RE:00309 "getdate で取得した日付の一週No.00315
iceaxs さん 01/01/15 20:11
 
連絡が遅くなりました。
やはり、難しいですか。

ちなみに以前のスクリプトは、どのような意味なのでしょうか。
これをうまく起動させるにはどうすればいいでしょうか。


> 日付を数値に変換するにはdatetolinearという関数がありますが、これから元の日
>付文字列に戻す関数はありません。したがって、スクリプトの標準的な文だけを使っ
>て1日前の日付を計算するのは無理です。
>
> しいてやるとしたら、うるう年の計算なんかを自前でやって、前の日を計算するっ
>て方法になると思います。
>

[ ]
RE:00315 "getdate で取得した日付の一週No.00316
ひろ さん 01/01/16 13:16
 
 iceaxs さん今日は、ひろです。
> ちなみに以前のスクリプトは、どのような意味なのでしょうか。
> これをうまく起動させるにはどうすればいいでしょうか。
 失礼な書き方になりますが、iceaxs はスクリプトが書いた事があるので
しょうか? あるのでしたら、スクリプト・ヘルプで call をキーワードして
検索してください。

[ ]
RE:00315 "getdate で取得した日付の一週No.00317
大森鉄工所 さん 01/02/09 20:23
 
こんにちは。  

プログラミング関係の仕事をされている方には初歩の初歩なのかも知れま
せん。  
でも、いざ無から作ろうと思うとちょっと大変。私が我流で作ったのはこ
んな感じです。良かったら使ってください。  
( 何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

[ ]
RE:00317 "getdate で取得した日付の一週No.00318
iceaxs さん 01/02/13 10:45
 
すみません。iceaxeです。
回答がおそくなりましてすみません。


まだまだ、初心者であるため、helpを見ても理解できないところが
あったりして失礼な投稿をしてしまいましたけども、大森鉄工所さんの
注釈が入り少し理解できたかと思っています。

まだまだスクリプト作成の初心者ではありますが、よろしくお願いします。

ありがとうございました。






>こんにちは。  
>
>プログラミング関係の仕事をされている方には初歩の初歩なのかも知れま
>せん。  
>でも、いざ無から作ろうと思うとちょっと大変。私が我流で作ったのはこ
>んな感じです。良かったら使ってください。  
>( 何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

[ ]