🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

893閲覧

今注文すると○日に出荷。のスクリプトが知りたい。

lionheart.jp

総合スコア15

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2021/02/26 08:36

通販サイトでよくある今の注文で○日に出荷のスクリプトを以下のように作りました。

【判定基準】
・土日祝日は休み
・営業日12時までの注文で当日出荷
【やりたいこと】
2/26金曜11:30の注文 2月26日月曜出荷
2/26金曜12:00の注文 2月26日月曜出荷
2/26金曜12:01の注文 3月1日月曜出荷
2/26金曜17:30の注文 3月1日月曜出荷

2/22月曜11:30の注文 2月22日月曜出荷
2/22月曜12:01の注文 2月24日月曜出荷 ※23日は祝日設定


var date=new Date();
var youbi=new Array("(日)","(月)","(火)","(水)","(木)","(金)","(土)");
//祝日設定
var syuku=new Array("1/1","1/2","1/3","1/4","2/11","2/23","4/29","4/30","5/1","5/2","5/3","5/4","5/5","7/22","7/23","8/9","8/13","9/20","9/23","11/3","11/23","12/30","12/31");
var m=9;
for (i=0; i<10; i++) {
do {
yasumi = false;
var y = date.getFullYear();
var m = date.getMonth()+1;
var d = date. getDate();
var ww = date.getDay();
var h = date.getHours();
var jww=youbi[ww];

if ((ww == 0) || (ww == 6)) {yasumi = true;}
for (j=0; j<22; j++) {
if ((m + "/" + d ) == syuku[j]) {yasumi = true;}
}
date.setTime(date.getTime()+(1 * 4700 * 1000)); ●ここ
} while (yasumi);
}

document.write("今注文すると商品の出荷は<br>" + "<span style='color:#fff;'>" + "  " + y + "年" + m + "月" + d + "日" + jww + "曜日</span><p>");


上記で動くのですが、上記のやりたいことの時間判定が思うようにいきません。
12時30分くらいにならないと翌営業日の出荷に変わらないです。

自分の予想では●ここの
date.setTime(date.getTime()+(1 * 4700 * 1000));
4700の箇所かなと思います。
3600だと13時頃まで当日の出荷でした。

誰か分かる方いませんか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

int32_t

2021/02/26 09:16 編集

なぜ 4700*1000 (78分20秒) を足すようにしたのですか?
guest

回答3

0

日付&時間の計算は内部に任せるべきです。(ちょっとだけ、ずるしてますが)

js

1class A extends Date { 2 constructor (...args) { 3 super (...args); 4 } 5 6 shukkaDate () { 7 let 8 [Y,M,D,w,h,m] = this.value, 9 dt = new this.constructor (Y,M,D,h,m), 10 isAM = (h * 60 + m) <= 720; 11 12 if (! dt.isHoliday && isAM) 13 return dt; 14 else 15 return dt.nextSaleDate (); 16 } 17 18 nextSaleDate (day = 1) { 19 this.setDate (this.getDate () + day); 20 return this.isHoliday ? this.nextSaleDate () : this; 21 } 22 23 get string () { 24 let 25 [Y,M,D,W] = this.value, 26 WJ = [...'日月火水木金土'][W]; 27 return `${Y}${M+1}${D}日(${WJ}曜日)`; 28 } 29 30 get value () { 31 return ['FullYear', 'Month', 'Date', 'Day', 'Hours', 'Minutes'].map (fn=> this['get'+fn]()); 32 } 33 34 get isHoliday () { 35 const HO = [ 36 "1/1","1/2","1/3","1/4","2/11","2/23","4/29","4/30", 37 "5/1","5/2","5/3","5/4","5/5","7/22","7/23","8/9", 38 "8/13","9/20","9/23","11/3","11/23","12/30","12/31" 39 ]; 40 let [,M,D,w] = this.value, md = (M+1)+'/'+D; 41 return (0 == w || 6 == w || HO.includes (md)) 42 } 43} 44//______ 45 46let test = [ 47 new A (2021,1,26,11,30), 48 new A (2021,1,26,12,0), 49 new A (2021,1,26,12,1), 50 new A (2021,1,26,15,30), 51 new A (2021,1,22,11,30), 52 new A (2021,1,22,12,1), 53 new A, 54]; 55 56test.forEach (t=> console.log (t.string, t.shukkaDate ().string+"出荷")) 57</script>

投稿2021/02/26 12:20

編集2021/02/28 07:35
babu_babu_baboo

総合スコア616

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

提示されているコードのアルゴリズムを擬似コードで書くと以下のような感じです。

javascript

1var date = 現在時刻 2for (10回繰り返し) { 3 do { 4 date に 7820秒を足す 5 } (dateが休日なら繰り返し) 6} 7date が出荷日

78分20秒を9回たすと11時間45分なので、12時15分まで当日出荷になりますね。

少々理解しにくいコードなので、以下のように書き直したらいかがでしょうか?

javascript

1var date = 現在時刻 2if (dateが休日ではない && dateが12:00以前) { 3 dateが出荷日 4} else { 5 do { 6 date に1日を足す 7 } (dateが休日なら繰り返し) 8 dateが出荷日 9}

dateが休日かどうかを判定する関数を作っておくとすっきりすると思います。

投稿2021/02/26 09:31

編集2021/02/26 09:33
int32_t

総合スコア21679

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

日本時間になっていないのでは?
以下参考
日本時間を取得

投稿2021/02/26 08:59

sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問