HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0930
可憐指定日時から現在の日時を計算したい3解決


可憐

リンク

2013/9/30(Mon) 08:52:43|NO.57470

日付の計算をしたいのですが
指定日時から現在の日時の差を引いたものを出力したいです。
2014年2月30日が指定日時だとして
今日現在の日時2013年9月30日の差は150日と差を出したいです。
何か良い案はありませんか?
よろしくお願いします。



この記事に返信する


hamyuu

リンク

2013/9/30(Mon) 09:39:30|NO.57471

調べてみたら指定した年月の日数を取得するサンプルをみつけました。
http://hspcenter.com/hsptvm/archives/3hsp/

repeat 8
y=2000+cnt :m=2 :gosub *ymdays mes ""+y+"年"+m+"月の日数="+d loop stop *ymdays ; 指定された年(西暦)月の日数を返します。 ; d=31 if m=2 { d=28 if (y\4)=0 { d=29 if ((y\100)=0)&((y\400)!0) :d=28 } } if (m=4)|(m=6)|(m=9)|(m=11) :d=30 return

うるう年の計算も入っているそうなので
あとは足し算で簡単にできそうですね。



asdf

リンク

2013/9/30(Mon) 10:44:21|NO.57472

すでに似たような回答がありますが
書いてしまったので関数版を

西暦1年1月1日からの日数に換算して引き算するのはどうでしょう?
(下の例では0001/01/00からの日数を求める関数を作っています)

#module #defcfunc getDay int arg_Year, int arg_Month, int arg_Day dim DayTable, 12 DayTable = 0,31,59,90,120,151,181,212,243,273,304,334 //DayTable(n)=01/01から満n月までの日数の合計 //例: DayTable(1) = 31 満1月までの日数の合計 // DayTable(3) = 90 満3月までの日数の合計(31+28+31) //年を日にちに換算 YearToDay = (arg_Year-1)*365//arg_Year年目はまだ365日に達していない //うるう年の数(4の倍数かつ100の倍数ではない年を閏年、しかし400の倍数であれば閏年) //あまりは切り捨て LeapYear = (arg_Year/4) - arg_Year/100 + (arg_Year/400) //arg_Year年が閏年でも02/28日をすぎていなければ加算しない //(arg_Month<=2)はなくてもいいけど、あった方が早いかも if ((arg_Year\4 == 0) && (arg_Month<=2) && ((DayTable(arg_Month-1)+arg_Day) <= 59)):LeapYear-- //求める日数は 365*年数分 + 閏年の分補正 + その年の01/01〜指定した日にちまでの日数 //例 getDay(2014,2,30) // 2013*365 + 488(2014年までに閏年は488回) + 31(満1月) + 30(指定した日付が30日なので) Day = YearToDay + LeapYear + DayTable(arg_Month-1) + arg_Day return Day #global //西暦0001/01/00から現在までの日数 ToDay = getDay(gettime(0),gettime(1),gettime(3)) //西暦0001/01/00から2014/02/30までの日数 Day = getDay(2014,2,30) mes (Day - ToDay)
関数を作りましたが、作らずにそのまま計算しても問題はありません

このプログラムでは2013/9/30→2014/2/30は153日でした
間違いはないと思うのですが、もしかしたら間違いがあるかもしれません
あと、2014年は閏年ではないので02/30は03/02と等しくなるようです
本来はここも2/30を指定した場合エラーを出すべきですが
このままにしておいても問題はないと思います

組み込み用

#module #defcfunc getDay int arg_Year, int arg_Month, int arg_Day dim DayTable, 12 DayTable = 0,31,59,90,120,151,181,212,243,273,304,334 YearToDay = (arg_Year-1)*365 LeapYear = (arg_Year>>2) - arg_Year/100 + arg_Year/400 if ((arg_Year\4 == 0) && (arg_Month<=2) && ((DayTable(arg_Month-1)+arg_Day) <= 59)):LeapYear-- return (YearToDay + LeapYear + DayTable(arg_Month-1) + arg_Day) #global



可憐

リンク

2013/9/30(Mon) 14:33:16|NO.57478

長く手間のかかったソースを作って頂き大変嬉しい限りです。
今パソコンの前にいないので何とも言えませんが
hamyuuさんのソースもasdfさんのソースも
どちらも閏年込みで正しい計算結果が出るという事ですね!
大切に使わせて頂きます。今後もお世話になることがあると思い
ます。その時はお世話かけますがよろしくお願いします。
また分からないことがありましたら聞いても宜しいでしょうか?
ありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.