回答編集履歴

9

テキスト追加

2020/05/03 23:52

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -250,7 +250,7 @@
250
250
 
251
251
 
252
252
 
253
- ご質問にあった、
253
+ 回答した当初、サンプルコードや回答の文章の中で、変数名やプロパティ名の一部に `"step"` を使っていましたが、ご質問にある以下
254
254
 
255
255
  ```
256
256
 
@@ -260,4 +260,4 @@
260
260
 
261
261
  ```
262
262
 
263
- にあわせて、サンプルコードや回答の文章の中で、変数名やプロパティ名の一部に使っていた `"step"` を、`"set"` に修正しました。
263
+ にあわせて、`"set"` に修正しました。

8

テキスト追加

2020/05/03 23:52

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -72,15 +72,11 @@
72
72
 
73
73
 
74
74
 
75
- ある日時と別の日時との比較や、1日加えるといった処理を楽に行うために、日時を扱うのに便利なライブラリ [moment](https://momentjs.com/) を使います。
75
+ ある日時と別の日時との比較や、1日加えるといった処理を楽に行うために、日時を扱うのに便利なライブラリ [moment](https://momentjs.com/) を使います。(※最近では moment よりも [date-fns](https://date-fns.org/) のほうが好まれる場合もありますが、この回答では、momentを使います。)
76
-
77
-
78
-
79
- (※最近では moment よりも [date-fns](https://date-fns.org/) のほうが好まれる場合もありますが、この回答では、momentを使います。)
76
+
80
-
81
-
82
-
77
+
78
+
83
- momentを使って、上記の `timeSets` の各要素が表す開始時刻と終了時刻の間にあるかどうかを判定する時刻を入れる変数を `time` として、ここに moment オブジェクトを入れます。
79
+ 上記の `timeSets` の各要素が表す開始時刻と終了時刻の間にあるかどうかを判定する時刻を含むmomentオブジェクトを入れる変数を `time` とします。
84
80
 
85
81
 
86
82
 

7

テキスト追加

2020/05/03 03:35

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -40,27 +40,27 @@
40
40
 
41
41
 
42
42
 
43
- サンプルデータとして以下のような配列 `steps` を考えます。
43
+ サンプルデータとして以下のような配列 `timeSets` を考えます。
44
44
 
45
45
  ```javascript
46
46
 
47
47
  // サンプルデータ
48
48
 
49
- const steps = [
49
+ const timeSets = [
50
-
50
+
51
- { step1: [["07", "00"], ["08", "30"]] },
51
+ { set1: [["07", "00"], ["08", "30"]] },
52
-
52
+
53
- { step2: [["22", "45"], ["02", "00"]] },
53
+ { set2: [["22", "45"], ["02", "00"]] },
54
-
54
+
55
- { step3: [["15", "00"], ["16", "30"]] },
55
+ { set3: [["15", "00"], ["16", "30"]] },
56
-
56
+
57
- { step4: [["22", "00"], ["23", "30"]] },
57
+ { set4: [["22", "00"], ["23", "30"]] },
58
-
58
+
59
- { step5: [["15", "30"], ["17", "00"]] },
59
+ { set5: [["15", "30"], ["17", "00"]] },
60
-
60
+
61
- { step6: [["23", "00"], ["01", "00"]] },
61
+ { set6: [["23", "00"], ["01", "00"]] },
62
-
62
+
63
- { step7: [["04", "30"], ["05", "45"]] }
63
+ { set7: [["04", "30"], ["05", "45"]] }
64
64
 
65
65
  ];
66
66
 
@@ -80,7 +80,7 @@
80
80
 
81
81
 
82
82
 
83
- momentを使って、上記の steps の各要素が表す開始時刻と終了時刻の間にあるかどうかを判定する時刻を入れる変数を `time` として、ここに moment オブジェクトを入れます。
83
+ momentを使って、上記の `timeSets` の各要素が表す開始時刻と終了時刻の間にあるかどうかを判定する時刻を入れる変数を `time` として、ここに moment オブジェクトを入れます。
84
84
 
85
85
 
86
86
 
@@ -104,7 +104,7 @@
104
104
 
105
105
 
106
106
 
107
- `steps`の要素の中で、`time` が開始と終了の間にある(両端も含む)もののキーを表示するコードは以下のように書けます。
107
+ `timeSets`の要素の中で、`time` が開始と終了の間にある(両端も含む)もののキーを表示するコードは以下のように書けます。
108
108
 
109
109
 
110
110
 
@@ -120,21 +120,21 @@
120
120
 
121
121
 
122
122
 
123
- // stepsの要素の中で、time が開始と終了の間にある(両端も含む)ときの stepsの要素のキーを表示
123
+ // timeSetsの要素の中で、time が開始と終了の間にある(両端も含む)ときのキーを表示
124
-
124
+
125
- steps.forEach(step => {
125
+ timeSets.forEach(set => {
126
-
126
+
127
- const [[stepKey, [startAry, endAry]]] = Object.entries(step);
127
+ const [[key, [startAry, endAry]]] = Object.entries(set);
128
-
129
-
128
+
129
+
130
130
 
131
131
  const start = moment(`${startAry.join(":")}`, TIME_FORMAT),
132
132
 
133
- end = moment(`${endAry.join(":")}`, TIME_FORMAT);
133
+ end = moment(`${endAry.join(":")}`, TIME_FORMAT);
134
-
135
-
136
-
134
+
135
+
136
+
137
- // hour が 日付の変わる時刻未満であれば、日付を1日加算する。
137
+ // hour が 日付の変わる時刻未満であれば、日付を1日加算する。
138
138
 
139
139
  if (start.hour() < START_HOUR_OF_DAY) {
140
140
 
@@ -146,15 +146,15 @@
146
146
 
147
147
  end.add(1, 'day');
148
148
 
149
- }
149
+ }
150
-
151
-
150
+
151
+
152
152
 
153
153
  // time が、start以上、end以下であれば、オブジェクトのキーを表示
154
154
 
155
155
  if (start.isSameOrBefore(time) && end.isSameOrAfter(time)) {
156
156
 
157
- console.log(stepKey);
157
+ console.log(key);
158
158
 
159
159
  }
160
160
 
@@ -170,11 +170,11 @@
170
170
 
171
171
 
172
172
 
173
- > "step2"
173
+ > "set2"
174
-
174
+
175
- "step4"
175
+ "set4"
176
-
176
+
177
- "step6"
177
+ "set6"
178
178
 
179
179
 
180
180
 
@@ -196,7 +196,15 @@
196
196
 
197
197
  ```
198
198
 
199
- に変更すると、該当するstepsの要素として、`step7` だけが表示されます。
199
+ に変更すると、該当するtimeSetsの要素として、
200
+
201
+
202
+
203
+ > "set7"
204
+
205
+
206
+
207
+ だけが表示されます。
200
208
 
201
209
 
202
210
 
@@ -239,3 +247,21 @@
239
247
 
240
248
 
241
249
  によってリファクタして、`forEach`ループ本体のコード行数を減らしたものです。
250
+
251
+
252
+
253
+ ### 追記2
254
+
255
+
256
+
257
+ ご質問にあった、
258
+
259
+ ```
260
+
261
+ {'set1' : { [12, 00], [16, 00] } }
262
+
263
+ {'set2' : { [22, 00], [1, 00] } }
264
+
265
+ ```
266
+
267
+ にあわせて、サンプルコードや回答の文章の中で、変数名やプロパティ名の一部に使っていた `"step"` を、`"set"` に修正しました。

6

テキスト追加

2020/05/03 03:29

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -184,7 +184,7 @@
184
184
 
185
185
 
186
186
 
187
- - **動作確認用サンプル:** [https://codepen.io/jun68ykt/pen/QWjMVmJ?editors=0012](https://codepen.io/jun68ykt/pen/QWjMVmJ?editors=0012)
187
+ - **動作確認用サンプル1:** [https://codepen.io/jun68ykt/pen/QWjMVmJ?editors=0012](https://codepen.io/jun68ykt/pen/QWjMVmJ?editors=0012)
188
188
 
189
189
 
190
190
 
@@ -205,3 +205,37 @@
205
205
 
206
206
 
207
207
  以上、参考になれば幸いです。
208
+
209
+
210
+
211
+
212
+
213
+ ### 追記
214
+
215
+
216
+
217
+ 上記のサンプル1を、リファクタリングしたコードを挙げておきます。
218
+
219
+
220
+
221
+
222
+
223
+ - **動作確認用サンプル2:** [https://codepen.io/jun68ykt/pen/qBOVZba?editors=0012](https://codepen.io/jun68ykt/pen/qBOVZba?editors=0012)
224
+
225
+
226
+
227
+
228
+
229
+ これは、サンプル1を以下の2点
230
+
231
+
232
+
233
+ - moment のプラグインで、2つの日時による幅を表すオブジェクトを作ることのできる [moment-range](https://github.com/rotaready/moment-range) を使用し、これの [contains](https://github.com/rotaready/moment-range#contains)メソッドを、時間帯の範囲内かどうかの判定に利用
234
+
235
+     
236
+
237
+ - 時刻を表す、文字列の配列(`["07", "00"]` や `["01", "00"]`など) から、この配列の示す時刻を含む momentオブジェクトを作る関数を `momentFromHHMM` として、`forEach` ループから切り出す。
238
+
239
+
240
+
241
+ によってリファクタして、`forEach`ループ本体のコード行数を減らしたものです。

5

テキスト追加

2020/05/03 01:25

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -76,7 +76,7 @@
76
76
 
77
77
 
78
78
 
79
- (※最近では moment よりも [date-fns](https://date-fns.org/) のほうが好まれる場合もありますれは好みで選んでください。この回答では、momentを使います。)
79
+ (※最近では moment よりも [date-fns](https://date-fns.org/) のほうが好まれる場合もありますが、この回答では、momentを使います。)
80
80
 
81
81
 
82
82
 

4

テキスト追加

2020/05/02 10:54

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -150,7 +150,7 @@
150
150
 
151
151
 
152
152
 
153
- // date が、開始日時以上、終了日時以下であれば、オブジェクトのキーを表示
153
+ // time が、start以上、end以下であれば、オブジェクトのキーを表示
154
154
 
155
155
  if (start.isSameOrBefore(time) && end.isSameOrAfter(time)) {
156
156
 

3

テキスト追加

2020/05/02 02:37

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -110,7 +110,7 @@
110
110
 
111
111
  ```javascript
112
112
 
113
- // 比較対象となる時刻のhour未満であれば、日付を1日加算する。
113
+ // hour が 日付の変わる時刻未満であれば、日付を1日加算する。
114
114
 
115
115
  if (time.hour() < START_HOUR_OF_DAY) {
116
116
 
@@ -134,7 +134,7 @@
134
134
 
135
135
 
136
136
 
137
- // hour が 日付の変わる時刻のhour未満であれば、日付を1日加算する。
137
+ // hour が 日付の変わる時刻未満であれば、日付を1日加算する。
138
138
 
139
139
  if (start.hour() < START_HOUR_OF_DAY) {
140
140
 

2

テキスト追加

2020/05/02 02:31

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -18,11 +18,11 @@
18
18
 
19
19
 
20
20
 
21
- 上記によって、例えば今日が4月30日だとすると、
21
+ 上記によって、
22
-
22
+
23
- - `["06", "00"]` が、 4月30日の朝6時を表し、
23
+ - `["06", "00"]` は今日の朝6時を表し、
24
-
24
+
25
- - `["05", "59"]`が、**翌日5月1日**の午前5時59分を表す
25
+ - `["05", "59"]`翌日の午前5時59分を表す
26
26
 
27
27
 
28
28
 
@@ -80,15 +80,21 @@
80
80
 
81
81
 
82
82
 
83
- momentを使って、上記の steps の各要素が表す開始時刻と終了時刻の間にあるかどうかを判定する時を入れる変数を `now` として、ここに moment オブジェクトを入れます。
83
+ momentを使って、上記の steps の各要素が表す開始時刻と終了時刻の間にあるかどうかを判定する時を入れる変数を `time` として、ここに moment オブジェクトを入れます。
84
-
85
-
86
-
84
+
85
+
86
+
87
- ```javascript
87
+ ```javascript
88
+
88
-
89
+ // 時刻のフォーマット
90
+
91
+ const TIME_FORMAT = "HH:mm";
92
+
93
+
94
+
89
- // 比較対象となる
95
+ // 比較対象となる時
90
-
96
+
91
- const date = moment("2020-04-30 23:15:00");
97
+ const time = moment("23:15",TIME_FORMAT);
92
98
 
93
99
  ```
94
100
 
@@ -98,13 +104,23 @@
98
104
 
99
105
 
100
106
 
101
- `steps`の要素の中で、`date` が開始と終了の間にある(両端も含む)もののキーを表示するコードは以下のように書けます。
107
+ `steps`の要素の中で、`time` が開始と終了の間にある(両端も含む)もののキーを表示するコードは以下のように書けます。
102
-
103
-
104
-
108
+
109
+
110
+
105
- ```javascript
111
+ ```javascript
112
+
106
-
113
+ // 比較対象となる時刻のhour未満であれば、日付を1日加算する。
114
+
115
+ if (time.hour() < START_HOUR_OF_DAY) {
116
+
117
+ time.add(1, 'day');
118
+
119
+ }
120
+
121
+
122
+
107
- // stepsの要素の中で、date が開始と終了の間にある(両端も含む)ときの stepsの要素のキーを表示
123
+ // stepsの要素の中で、time が開始と終了の間にある(両端も含む)ときの stepsの要素のキーを表示
108
124
 
109
125
  steps.forEach(step => {
110
126
 
@@ -112,9 +128,9 @@
112
128
 
113
129
 
114
130
 
115
- const start = moment(`${startAry.join("")}`, "HHmm"),
131
+ const start = moment(`${startAry.join(":")}`, TIME_FORMAT),
116
-
132
+
117
- end = moment(`${endAry.join("")}`, "HHmm");
133
+ end = moment(`${endAry.join(":")}`, TIME_FORMAT);
118
134
 
119
135
 
120
136
 
@@ -136,7 +152,7 @@
136
152
 
137
153
  // date が、開始日時以上、終了日時以下であれば、オブジェクトのキーを表示
138
154
 
139
- if (start.isSameOrBefore(date) && end.isSameOrAfter(date)) {
155
+ if (start.isSameOrBefore(time) && end.isSameOrAfter(time)) {
140
156
 
141
157
  console.log(stepKey);
142
158
 
@@ -144,6 +160,10 @@
144
160
 
145
161
  });
146
162
 
163
+
164
+
165
+
166
+
147
167
  ```
148
168
 
149
169
  上記を実行すると
@@ -168,6 +188,16 @@
168
188
 
169
189
 
170
190
 
191
+ 上記のサンプルで、比較対象となる時刻 `time` を
192
+
193
+ ```javascript
194
+
195
+ const time = moment("05:00",TIME_FORMAT);
196
+
197
+ ```
198
+
199
+ に変更すると、該当するstepsの要素として、`step7` だけが表示されます。
200
+
171
201
 
172
202
 
173
203
 

1

テキスト追加

2020/05/02 01:35

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -18,7 +18,19 @@
18
18
 
19
19
 
20
20
 
21
+ 上記によって、例えば今日が4月30日だとすると、
22
+
23
+ - `["06", "00"]` が、 4月30日の朝6時を表し、
24
+
21
- 上記は、例えば今日が4月30日だとすると、 `["06", "00"]` が、 4月30日の朝6時を表し、 `["05", "59"]`が、**翌日5月1日**の午前5時59分を表すことになります。
25
+ - `["05", "59"]`が、**翌日5月1日**の午前5時59分を表す
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+ ことになります。
22
34
 
23
35
 
24
36