曜日を裏切る方法

[新着] Webテンプレートを仮オープンしました



0   名前: black-sabath : 2006/09/30(土) 04:21  ID:TYSqO2aG
お世話になります。
日付関数でgetDay()を取ったときにスクリプトの動作状況を確認したいの
ですが、いちいちコントロールパネルから日付設定をずらして確認したり
しています。いかにもこれはOSによくないと思います。
それで、スクリプトレヴェルで今日の曜日を裏切るように変えたいのです
が、どう書けばよいでしょうか。事情あって、setDate関数は使えません。


1   名前: m035 ◆Wpzr1YKOiq : 2006/09/30(土) 04:21  [URL]  ID:Bueo8Jwn
>setDate関数は使えません。
setTimeが使えれば、
var d=new Date();
d.setTime((new Date).getTime()-1000*60*60*24*A);

のようにして、A日前に。
もしくは、-を+に直してA日後に。

2   名前: black-sabath  : 2006/09/30(土) 04:21  ID:P7ooBfPM
ありがとうございました!

3   名前: 匿名 : 2006/09/30(土) 04:21  ID:i4s77xzC
setTimeが使えてsetDateが使えない状況というのが想像できないな…(?
とにかく、DateはUTCで1970/1/1からのミリ秒を保持しているから、それを逆手に取れば

d.setTime(d - Date.UTC(1970, 0, 1 + 3));
d.getDate(); // 3 日前


で3日分を引くこともできる。
# new Date(1970, 0, 1 + 3)だと地方時間(日本なら9時間分引かれる)になるので注意。

本当は、具体的な数値計算は表に出さずに隠蔽した方がいいんだが。

4   名前: black-sabath  : 2006/09/30(土) 04:21  ID:pvvULTld
トンデモ返答でした。
setTimeももちろんダメです。> >>3. 匿名(ID:i4s77xzC)さん、すいません。

5   名前: m035 ◆Wpzr1YKOiq : 2006/09/30(土) 04:21  [URL]  ID:RQa2Vabo
getDay()だけをごまかせば良いという条件なので、、以下のようにgetDayをオーバーライド。
var d=new Date();
var A=0;//プラスする日数(引くときはマイナス指定で)
d.getDay=(function(n){return function(){return (n+A)%7}})(d.getDay());
document.write(d.getDay());

もしくは、以下のようにするとか。
var d=new Date();
var A=0;//0以上の数を自分で指定
d.getDay=function(){return A%7};
document.write(d.getDay());

で、テスト段階でソースのAの値を直接書き換えるか、実行中にAを変更してgetDayすれば良いかと。

6   名前: m035 ◆Wpzr1YKOiq : 2006/09/30(土) 04:21  [URL]  ID:RQa2Vabo
おまけ。
すべてのgetDayを+Aだけずらす例。
これでシステム時間をいじったときと同等にテスト可能。
他のメソッドも同じ手法で一括してずらせそうな予感。
Date.prototype.getDayOld=Date.prototype.getDay;
Date.prototype.getDay=function(){return (this.getDayOld()+A)%7};
var A=3;

var d1=new Date();
var d2=new Date();
d2.setDate(d2.getDate()+1);
document.write(d1.getDay()+"<br>"+d2.getDay());

7   名前: 匿名 : 2006/09/30(土) 04:21  ID:i4s77xzC
>>0
> 日付関数でgetDay()を取ったときにスクリプトの動作状況を確認したい

思うんだが(ちょっと>>5-6の手法にも通じるところがある)

var d = new Date;
var day = d.getDay();


のように、いったん変数に代入して、
メイン処理ではdayを使えば良いだけの話じゃないのかな?
そうすれば、必要に応じてdayの値を変更すれば良いだけでしょ。

構造とデータは分離せよというのは何もHTMLとCSSに限った話じゃない。
スパゲッティなコードを使い続けるよりは、設計しなおした方が早い可能性もある。

だいたい、new DateとgetDayは可で、setTimeとsetDateは不可という状況が分からない。
情報を小出しにするのはよくないぞ。

8   名前: 匿名 : 2006/09/30(土) 04:21  ID:i4s77xzC
>>7
> ちょっと>>5-6の手法にも通じるところがある

ごめん、誤解を生みそうな文面だったので補足しとくけど、
>>5-6と>>7は、本質的に同じことを言ってる。と思う。
ただ前者はグローバルな書き換え、後者はローカルな書き換えを主眼にしている
と言えるかな。だから「発想が似通っているかも」という意味で書いた。
だから、>>7は>>5-6への批判ではない。念のため。

一覧へ戻る