質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

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

Q&A

解決済

2回答

652閲覧

Sring型の2つの日付の間の全部の日にちを表示させる方法について

rena_168

総合スコア72

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

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

0グッド

0クリップ

投稿2023/03/30 07:11

編集2023/03/30 07:13

実現したいこと

1日の24時間はその日の朝8:30~翌日の朝8:30です。
(例)
開始日時:2023/03/27 08:00:00
終了日時:2023/04/02 09:00:00

【出力結果】
[ '2023/03/26',
'2023/03/27',
'2023/03/28',
'2023/03/29',
'2023/03/30',
'2023/03/31',
'2023/04/01',
'2023/04/02' ]

該当のソースコード

javascript

1function getEveryDays(sdate,edate) { 2 var result = []; 3 sdate = "2023/03/27 08:00:00"; 4 edate = "2023/04/02 09:00:00"; 5 var basic_sdate = sdate.split(" ")[0] + " 08:30:00"; 6 var date = new Date(basic_sdate); 7 date.setDate(date.getDate() + 1); 8 var basic_sdate2 = Utilities.formatDate(new Date(date.getFullYear(),date.getMonth(),date.getDate(),8,30,0), "Asia/Tokyo", "yyyy/MM/dd HH:mm:ss"); 9 10 var basic_edate = edate.split(" ")[0] + " 08:30:00"; 11 var date2 = new Date(basic_edate); 12 date2.setDate(date2.getDate() + 1); 13 var basic_edate2 = Utilities.formatDate(new Date(date2.getFullYear(),date2.getMonth(),date2.getDate(),8,30,0), "Asia/Tokyo", "yyyy/MM/dd HH:mm:ss"); 14 15 if (basic_sdate <= sdate && sdate <= basic_sdate2) { 16 var loop = new Date(sdate.split(" ")[0] + " 08:30:00"); 17 // console.log("s_between = " + Utilities.formatDate(loop, "Asia/Tokyo", "yyyy/MM/dd HH:mm:ss")); 18 } else { 19 var loop = new Date(date.getFullYear(),date.getMonth(),date.getDate()-2,8,30,0); 20 // console.log("not s_between = " + Utilities.formatDate(loop, "Asia/Tokyo", "yyyy/MM/dd HH:mm:ss")); 21 } 22 if (basic_edate <= edate && edate <= basic_edate2) { 23 var end = new Date(edate); 24 // console.log("e_between = " + Utilities.formatDate(end, "Asia/Tokyo", "yyyy/MM/dd HH:mm:ss")); 25 } else if (edate >= (edate.split(" ")[0] + " 00:00:00") && edate < basic_edate){ 26 var end = new Date(date2.getFullYear(),date2.getMonth(),date2.getDate()-1,8,30,0); 27 } else { 28 var end = new Date(date2.getFullYear(),date2.getMonth(),date2.getDate()-2,8,30,0); 29 // console.log("not e_between = " + Utilities.formatDate(end, "Asia/Tokyo", "yyyy/MM/dd HH:mm:ss")); 30 } 31 while(loop < end){ 32 var strLoop = Utilities.formatDate(loop, "Asia/Tokyo", "yyyy/MM/dd"); 33 result.push(strLoop); 34 var newDate = loop.setDate(loop.getDate() + 1); 35 loop = new Date(newDate); 36 } 37 console.log(result); 38 return result; 39}

補足情報(FW/ツールのバージョンなど)

上記の書き方で実現できたものの、自分的には書き方が冗長で一番バカっぽい書き方のようですが、
いかがでしょうか。

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

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

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

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

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

yambejp

2023/03/30 07:29 編集

8:30ぴったりのときは前日なのでしょうか当日なのでしょうか? 仮に 開始日時:2023/03/27 08:30:00 終了日時:2023/04/02 08:30:00 だとすると3/27-4/1?
guest

回答2

0

ベストアンサー

javascript

1const sdate = "2023/03/27 08:29:00"; 2const edate = "2023/04/02 08:30:00"; 3const d=[sdate,edate] 4 .map(x=>new Date(new Date(x).getTime()-(8*60+30)*60*1000)) 5 .map(x=>["setHours","setMinutes","setSeconds"].reduce((y,z)=>(Date.prototype[z].call(y,0),y),x)); 6const res=Array((d[1]-d[0])/24/60/60/1000+1).fill(null).map((_,x)=>new Date(d[0].getTime()+(x*24+9)*60*60*1000).toLocaleDateString([],{year:"numeric",month:"2-digit",day:"2-digit"})); 7console.log(res);

# 再調整

javascript

1<script> 2window.addEventListener('DOMContentLoaded', ()=>{ 3 btn.addEventListener('click',()=>{ 4 const d=[sdate.value,edate.value] 5 .map((x,y)=>new Date(new Date(x).getTime()-((8*60+30)*60+y)*1000)) 6 .map(x=>["setHours","setMinutes","setSeconds"].reduce((y,z)=>(Date.prototype[z].call(y,0),y),x)); 7 res.value=Array((d[1]-d[0])/24/60/60/1000+1).fill(null).map((_,x)=>new Date(d[0].getTime()+x*24*60*60*1000).toLocaleDateString([],{year:"numeric",month:"2-digit",day:"2-digit"})).join("\n"); 8 }); 9}); 10</script> 11<input id="sdate" value="2023/04/01 08:30:00"><br> 12<input id="edate" value="2023/04/02 08:30:00"><br> 13<input type="button" id="btn" value="calc"><br> 14<textarea id="res" cols=20 rows=20> 15</textarea>

※注意:UTCを使わないので日付に9時間足すのをやめました

投稿2023/03/30 12:38

編集2023/03/31 05:51
yambejp

総合スコア114773

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

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

rena_168

2023/03/31 00:52

書き方が非常に難しいようで、私にはちょっと理解しにくいですが、 4月1日の範囲が、4/1 8:30~4/2 8:30までですので、4月2日8:30までなら、最後の出力結果には4/2はあっていけないのですが、どうすべきでしょうか。
yambejp

2023/03/31 01:00

> 4月1日の範囲が、4/1 8:30~4/2 8:30 普通は以下のどちらか 4/1 8:30:00~4/2 8:29:59 4/1 8:30:01~4/2 8:30:00 もしご指摘の処理を希望するならsdateは含んで、edateは含まないという特殊な設定を説明スべきです
rena_168

2023/03/31 02:05

すみません、説明不足ですみません。時間は30分刻みの表記ですので、Inputデータの分の表記は00か30分の2パターンのみです。 ですから、4/1の24時間は4/1 8:30-4/2 8:30で、4/2の24時間は4/2 8:30-4/3 8:30です。
yambejp

2023/03/31 02:27

一応再調整分で仕様に合っていると思いますが違うようならご指摘ください
rena_168

2023/03/31 05:35

出来ています!!! こんな短くて冗長じゃない書き方は、レベルが高くて私には書けそうにないです。。。 普段map reduceは単発で使ったことがありますが、こんなに組み合わせすることは使ったことがないです。 fillも初めてみます! 参考として勉強させてもらいます!
guest

0

例えばこのような感じでしょうか?
(当初の回答に1行追加しました。)

javascript

1function getEveryDays(strBegin, strEnd) { 2 strBegin = '2023/03/27 08:00:00'; 3 strEnd = '2023/04/02 09:00:00'; 4 const dateBegin = new Date(strBegin); 5 let dateEnd = new Date(strEnd); 6 dateBegin.setMinutes(dateBegin.getMinutes() - 30); 7 dateBegin.setHours(dateBegin.getHours() - 8); 8 dateEnd.setMilliseconds(dateEnd.getMilliseconds() - 1);//ここを追加 9 dateEnd.setMinutes(dateEnd.getMinutes() - 30); 10 dateEnd.setHours(dateEnd.getHours() - 8); 11 dateEnd.setDate(dateEnd.getDate() + 1); 12 dateEnd = new Date(Utilities.formatDate(dateEnd, 'JST', 'yyyy/MM/dd')); 13 const result = []; 14 while (dateBegin < dateEnd) { 15 result.push(Utilities.formatDate(dateBegin, 'JST', 'yyyy/MM/dd')); 16 dateBegin.setDate(dateBegin.getDate() + 1); 17 } 18 console.log(result); 19 return result; 20}

ログの内容
[ '2023/03/26',
'2023/03/27',
'2023/03/28',
'2023/03/29',
'2023/03/30',
'2023/03/31',
'2023/04/01',
'2023/04/02' ] ← strEndに 4/2 8:30:00を指定すると表示されない。

投稿2023/03/30 08:04

編集2023/03/31 01:11
YellowGreen

総合スコア731

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

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

YellowGreen

2023/03/30 08:09

日付の判断が違っていたので修正します。
YellowGreen

2023/03/30 08:27

dateBegin = new Date(Utilities.formatDate(dateBegin, 'JST', 'yyyy/MM/dd')); は、無くても良かったですね。
YellowGreen

2023/03/30 12:38

dateBeginの時刻はクリアしないように修正しました。 宣言もlet→constにしました。
rena_168

2023/03/31 00:49

strEnd を"8:30"に変更したら、4/2も出力されたので、ちょっと違う気がします。4/1 8:30~4/2 8:30までが4/1ですので、4/2が出力されないのが正しいですが。。。
YellowGreen

2023/03/31 00:58 編集

4/2 8:30までではなく、4/2 8:30より前までと理解していました。 4/2 8:29:59 だと4/1と表示されるようにしたのですが、 4/2 8:30:00のときも4/1扱いとすればよろしいですね。 4/2 8:30:01は4/2扱いでよろしいですか。
YellowGreen

2023/03/31 01:14

修正の例をアップしました。 終了時刻は、8:30:00ちょうどのときには前日扱いとし、1ミリ秒でも過ぎたら当日と扱われます。
rena_168

2023/03/31 02:10

すみません、説明不足ですみません。時間は30分刻みの表記ですので、Inputデータの分の表記は00か30分の2パターンのみです。 ちゃんと説明してないのに、結果的に私と同じ結果になっています! このような書き方もあるなんて勉強になりました! ありがとうございます!
YellowGreen

2023/04/02 09:54 編集

> Inputデータの分の表記は00か30分の2パターンのみです。 何パターンあっても動作するようになってます。 ミリ秒単位で判断しますので...(笑)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問