回答編集履歴
13
テキスト追加
test
CHANGED
@@ -222,7 +222,7 @@
|
|
222
222
|
|
223
223
|
|
224
224
|
|
225
|
-
- ご例示の、d
|
225
|
+
- ご例示の、dateFrom:`"2021-6-1"` と dateTo:`"2021-7-15"` であれば、`d2.diff(d1,'month', true)` は、私の手元の環境では
|
226
226
|
|
227
227
|
1.4516129032258065
|
228
228
|
|
12
テキスト追加
test
CHANGED
@@ -192,7 +192,7 @@
|
|
192
192
|
|
193
193
|
|
194
194
|
|
195
|
-
console.log(n, k);
|
195
|
+
console.log([n, k]);
|
196
196
|
|
197
197
|
```
|
198
198
|
|
11
テキスト追加
test
CHANGED
@@ -230,7 +230,7 @@
|
|
230
230
|
|
231
231
|
|
232
232
|
|
233
|
-
- これの小数部分`r` = 0.4516129032258065 を日数に換算するために、この 0.45・・・に何を掛ければよいかというと、上記のソースコードに出てくる`d3` と `d4` の日数差です。この差は月でいえば一ヶ月ですが、日数換算だと`d3`の月の月末が何日なのかによって変わります。
|
233
|
+
- これの小数部分`r` = 0.4516129032258065 を日数に換算するために、この 0.45・・・に何を掛ければよいかというと、上記のソースコードに出てくる`d3` と `d4` の日数差です。この差は月でいえば一ヶ月ですが、日数換算だと`d3`の月の月末が何日なのかによって変わります。また2月だったら年が閏年かも考慮しなければなりませんが、このへんを任せられるのがdayjsの強みですね。
|
234
234
|
|
235
235
|
|
236
236
|
|
10
テキスト追加
test
CHANGED
@@ -238,4 +238,4 @@
|
|
238
238
|
|
239
239
|
14.000000000000002
|
240
240
|
|
241
|
-
となりました。これの小数を Math.round で切り捨てれば、得たい剰余日数の14が得られます。
|
241
|
+
となりました。これの小数を Math.round で切り捨て(または切り上げ)れば、得たい剰余日数の14が得られます。
|
9
テキスト追加
test
CHANGED
@@ -144,7 +144,7 @@
|
|
144
144
|
|
145
145
|
|
146
146
|
|
147
|
-
// d1 と d
|
147
|
+
// d1 と d2 との差分を月単位で得る。その際に小数点以下も取得する。
|
148
148
|
|
149
149
|
const monthDiff = d2.diff(d1,'month', true);
|
150
150
|
|
8
テキスト追加
test
CHANGED
@@ -105,3 +105,137 @@
|
|
105
105
|
const m = Math.ceil(n / 3)
|
106
106
|
|
107
107
|
```
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
### 追記2
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
コメントから頂きました、
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
> ・・・得たい結果としては1(か月)+14日(剰余日数)となります。
|
120
|
+
|
121
|
+
|
122
|
+
|
123
|
+
を得るための関数 `monthDiff_md(dateFrom, dateTo)` を作ってみました。
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
> ・・・もっとdayjsでスマートに行けるのであれば、お知恵を頂きたくご返信させていただきました。
|
128
|
+
|
129
|
+
|
130
|
+
|
131
|
+
とのことでしたが、スマートなものになっているかは分かりませんが挙げておきます。
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
```javascript
|
136
|
+
|
137
|
+
const monthDiff_md = (dateFrom, dateTo) => {
|
138
|
+
|
139
|
+
// 引数で与えられた YYYY-M-D 形式の文字列からdayjsオブジェクトを作る
|
140
|
+
|
141
|
+
const d1 = dayjs(dateFrom, 'YYYY-M-D');
|
142
|
+
|
143
|
+
const d2 = dayjs(dateTo,'YYYY-M-D');
|
144
|
+
|
145
|
+
|
146
|
+
|
147
|
+
// d1 と d1 との差分を月単位で得る。その際に小数点以下も取得する。
|
148
|
+
|
149
|
+
const monthDiff = d2.diff(d1,'month', true);
|
150
|
+
|
151
|
+
|
152
|
+
|
153
|
+
// 上記で得た monthDiff の整数部分 n と小数部分 r を取得する。
|
154
|
+
|
155
|
+
const n = Math.floor(monthDiff);
|
156
|
+
|
157
|
+
const r = monthDiff - n;
|
158
|
+
|
159
|
+
|
160
|
+
|
161
|
+
// d1 に n月 および (n+1)月を加えた日付を作って、d3 および d4 とする。
|
162
|
+
|
163
|
+
const [d3, d4] = [n, n+1].map(x => d1.add(x, 'month'));
|
164
|
+
|
165
|
+
|
166
|
+
|
167
|
+
// d4 と d3 の日数差を計算して m とする。
|
168
|
+
|
169
|
+
const m = d4.diff(d3, 'day');
|
170
|
+
|
171
|
+
|
172
|
+
|
173
|
+
// m に r を乗じた数を作る。この数の単位は日であり理屈上は整数だが、計算結果は整数にごく近い小数になるのでMath.roundする。
|
174
|
+
|
175
|
+
const k = Math.round(m * r)
|
176
|
+
|
177
|
+
|
178
|
+
|
179
|
+
// n と k を返す
|
180
|
+
|
181
|
+
return [n, k];
|
182
|
+
|
183
|
+
}
|
184
|
+
|
185
|
+
```
|
186
|
+
|
187
|
+
実行例:
|
188
|
+
|
189
|
+
```javascript
|
190
|
+
|
191
|
+
const [n, k] = monthDiff_md("2021-6-1","2021-7-15");
|
192
|
+
|
193
|
+
|
194
|
+
|
195
|
+
console.log(n, k);
|
196
|
+
|
197
|
+
```
|
198
|
+
|
199
|
+
出力結果:
|
200
|
+
|
201
|
+
> [ 1, 14 ]
|
202
|
+
|
203
|
+
|
204
|
+
|
205
|
+
この`14`日の算出方法を説明します。
|
206
|
+
|
207
|
+
|
208
|
+
|
209
|
+
- dayjsのドキュメントでの[diffの説明](https://day.js.org/docs/en/display/difference) に
|
210
|
+
|
211
|
+
|
212
|
+
|
213
|
+
```javascript
|
214
|
+
|
215
|
+
const date1 = dayjs('2019-01-25')
|
216
|
+
|
217
|
+
date1.diff('2018-06-05', 'month', true) // 7.645161290322581
|
218
|
+
|
219
|
+
```
|
220
|
+
|
221
|
+
とあるとおり、diff の第三引数に true を渡すと、小数点以下ありの数値が返ってきます。この小数部分を日数に換算することを考えます。
|
222
|
+
|
223
|
+
|
224
|
+
|
225
|
+
- ご例示の、d1=`"2021-6-1"` と d2=`"2021-7-15"` であれば、`d2.diff(d1,'month', true)` は、私の手元の環境では
|
226
|
+
|
227
|
+
1.4516129032258065
|
228
|
+
|
229
|
+
という数を返しました。
|
230
|
+
|
231
|
+
|
232
|
+
|
233
|
+
- これの小数部分`r` = 0.4516129032258065 を日数に換算するために、この 0.45・・・に何を掛ければよいかというと、上記のソースコードに出てくる`d3` と `d4` の日数差です。この差は月でいえば一ヶ月ですが、日数換算だと`d3`の月の月末が何日なのかによって変わります。(このへんを任せられるのがdayjsの強みですね)
|
234
|
+
|
235
|
+
|
236
|
+
|
237
|
+
- `d3` と `d4` の日数差を `m` として得て、`m`に先の小数 `r` = 0.45・・・ を乗じると、欲しい剰余日数が出るはずですが、計算結果としては整数にごく近い小数になると思います。私の手元では、
|
238
|
+
|
239
|
+
14.000000000000002
|
240
|
+
|
241
|
+
となりました。これの小数を Math.round で切り捨てれば、得たい剰余日数の14が得られます。
|
7
テキスト追加
test
CHANGED
@@ -79,3 +79,29 @@
|
|
79
79
|
```
|
80
80
|
|
81
81
|
- ???? [動作確認のサンプル](https://codepen.io/kilesa/pen/ZEJgqgb?editors=0012) @codepen
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
|
86
|
+
|
87
|
+
### 追記
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
上記のコードで、`n` から `m` を得る計算は、以下でもできます。
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
```javascript
|
96
|
+
|
97
|
+
const m = Math.floor((n + 2) / 3);
|
98
|
+
|
99
|
+
```
|
100
|
+
|
101
|
+
あるいは
|
102
|
+
|
103
|
+
```javascript
|
104
|
+
|
105
|
+
const m = Math.ceil(n / 3)
|
106
|
+
|
107
|
+
```
|
6
テキスト追加
test
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
アドバイスといいますか、自分ならこうい
|
5
|
+
アドバイスといいますか、自分ならこういった、二つの日付や日時の差分を、何らかの単位(月や日、時間など)で算出する必要があるとき、標準のDateではなく[Day.js](https://day.js.org/en/)を使います。たとえば、ご質問の`monthDiff(dateFrom, dateTo)` を以下のように書けます。
|
6
6
|
|
7
7
|
|
8
8
|
|
@@ -56,7 +56,7 @@
|
|
56
56
|
|
57
57
|
|
58
58
|
|
59
|
-
または、与えられた`YYYY-M-D`形式の文字列の`-D`の部分を削除した文字列を、`dayjs()`に渡して、`YYYY-M`の文字列としてパースしてオブジェクトを作ると、
|
59
|
+
または、与えられた`YYYY-M-D`形式の文字列の`-D`の部分を削除した文字列を、`dayjs()`に渡して、`YYYY-M`の文字列としてパースしてオブジェクトを作ると、指定された月の月初(1日)の日付を表すものになることを利用して、以下のようにも書けます。
|
60
60
|
|
61
61
|
```javascript
|
62
62
|
|
5
テキスト追加
test
CHANGED
@@ -64,7 +64,7 @@
|
|
64
64
|
|
65
65
|
[dateFrom, dateTo] = [dateFrom, dateTo].map(dateStr =>
|
66
66
|
|
67
|
-
dayjs(dateStr.replace(/-\d{1,2}$/, ''), 'YYYY-M')
|
67
|
+
dayjs(dateStr.replace(/-\d{1,2}$/, ''), 'YYYY-M')
|
68
68
|
|
69
69
|
);
|
70
70
|
|
4
テキスト追加
test
CHANGED
@@ -36,15 +36,15 @@
|
|
36
36
|
|
37
37
|
const d2 = dayjs(dateTo, 'YYYY-M-D').endOf('month').add(1, 'second');
|
38
38
|
|
39
|
-
|
39
|
+
|
40
40
|
|
41
41
|
const n = d2.diff(d1, 'month');
|
42
42
|
|
43
43
|
const m = Math.floor(n / 3) + (n % 3 > 0);
|
44
44
|
|
45
|
-
return [
|
45
|
+
return [n, m];
|
46
46
|
|
47
|
-
}
|
47
|
+
};
|
48
48
|
|
49
49
|
|
50
50
|
|
@@ -62,19 +62,19 @@
|
|
62
62
|
|
63
63
|
const monthDiff = (dateFrom, dateTo) => {
|
64
64
|
|
65
|
-
[dateFrom, dateTo] =
|
65
|
+
[dateFrom, dateTo] = [dateFrom, dateTo].map(dateStr =>
|
66
66
|
|
67
|
-
da
|
67
|
+
dayjs(dateStr.replace(/-\d{1,2}$/, ''), 'YYYY-M'),
|
68
68
|
|
69
|
-
);
|
69
|
+
);
|
70
70
|
|
71
71
|
const n = dateTo.diff(dateFrom, 'month') + 1;
|
72
72
|
|
73
|
-
const m = Math.floor(n / 3) + (n % 3 > 0);
|
73
|
+
const m = Math.floor(n / 3) + (n % 3 > 0);
|
74
74
|
|
75
|
-
return [
|
75
|
+
return [n, m];
|
76
76
|
|
77
|
-
}
|
77
|
+
};
|
78
78
|
|
79
79
|
```
|
80
80
|
|
3
テキスト追加
test
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
自分なら
|
5
|
+
アドバイスといいますか、自分ならこういうのをやるとき、標準のDateではなく[Day.js](https://day.js.org/en/)を使います。たとえば以下のように monthDiff(dateFrom, dateTo) を書けます。
|
6
6
|
|
7
7
|
|
8
8
|
|
2
テキスト追加
test
CHANGED
@@ -56,7 +56,7 @@
|
|
56
56
|
|
57
57
|
|
58
58
|
|
59
|
-
または、与えられた`YYYY-M-D`形式の文字列の`-D`の部分を削除した文字列を、`dayjs()`に渡して、`YYYY-M`の文字列としてパースしてオブジェクトを作ると、それは月初(1日)の日付を表すものになることを利用して、以下のようにも書けます。
|
59
|
+
または、与えられた`YYYY-M-D`形式の文字列の`-D`の部分を削除した文字列を、`dayjs()`に渡して、`YYYY-M`の文字列としてパースしてオブジェクトを作ると、それは指定された月の月初(1日)の日付を表すものになることを利用して、以下のようにも書けます。
|
60
60
|
|
61
61
|
```javascript
|
62
62
|
|
1
テキスト追加
test
CHANGED
@@ -53,3 +53,29 @@
|
|
53
53
|
|
54
54
|
|
55
55
|
- ???? [動作確認のサンプル](https://codepen.io/kilesa/pen/QWMeZWx?editors=0012) @codepen
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
または、与えられた`YYYY-M-D`形式の文字列の`-D`の部分を削除した文字列を、`dayjs()`に渡して、`YYYY-M`の文字列としてパースしてオブジェクトを作ると、それは月初(1日)の日付を表すものになることを利用して、以下のようにも書けます。
|
60
|
+
|
61
|
+
```javascript
|
62
|
+
|
63
|
+
const monthDiff = (dateFrom, dateTo) => {
|
64
|
+
|
65
|
+
[dateFrom, dateTo] = [dateFrom, dateTo].map(
|
66
|
+
|
67
|
+
dateStr => dayjs(dateStr.replace(/-\d{1,2}$/, ''), 'YYYY-M')
|
68
|
+
|
69
|
+
);
|
70
|
+
|
71
|
+
const n = dateTo.diff(dateFrom, 'month') + 1;
|
72
|
+
|
73
|
+
const m = Math.floor(n / 3) + (n % 3 > 0);
|
74
|
+
|
75
|
+
return [ n, m ];
|
76
|
+
|
77
|
+
}
|
78
|
+
|
79
|
+
```
|
80
|
+
|
81
|
+
- ???? [動作確認のサンプル](https://codepen.io/kilesa/pen/ZEJgqgb?editors=0012) @codepen
|