回答編集履歴

13

テキスト追加

2021/11/27 19:44

投稿

退会済みユーザー
test CHANGED
@@ -222,7 +222,7 @@
222
222
 
223
223
 
224
224
 
225
- - ご例示の、d1=`"2021-6-1"` と d2=`"2021-7-15"` であれば、`d2.diff(d1,'month', true)` は、私の手元の環境では
225
+ - ご例示の、dateFrom:`"2021-6-1"` と dateTo:`"2021-7-15"` であれば、`d2.diff(d1,'month', true)` は、私の手元の環境では
226
226
 
227
227
  1.4516129032258065
228
228
 

12

テキスト追加

2021/11/27 19:44

投稿

退会済みユーザー
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

テキスト追加

2021/11/27 19:32

投稿

退会済みユーザー
test CHANGED
@@ -230,7 +230,7 @@
230
230
 
231
231
 
232
232
 
233
- - これの小数部分`r` = 0.4516129032258065 を日数に換算するために、この 0.45・・・に何を掛ければよいかというと、上記のソースコードに出てくる`d3` と `d4` の日数差です。この差は月でいえば一ヶ月ですが、日数換算だと`d3`の月の月末が何日なのかによって変わります。このへんを任せられるのがdayjsの強みですね
233
+ - これの小数部分`r` = 0.4516129032258065 を日数に換算するために、この 0.45・・・に何を掛ければよいかというと、上記のソースコードに出てくる`d3` と `d4` の日数差です。この差は月でいえば一ヶ月ですが、日数換算だと`d3`の月の月末が何日なのかによって変わります。また2月だったら年が閏年かも考慮しなければなりませんが、このへんを任せられるのがdayjsの強みですね
234
234
 
235
235
 
236
236
 

10

テキスト追加

2021/11/27 14:57

投稿

退会済みユーザー
test CHANGED
@@ -238,4 +238,4 @@
238
238
 
239
239
  14.000000000000002
240
240
 
241
- となりました。これの小数を Math.round で切り捨てれば、得たい剰余日数の14が得られます。
241
+ となりました。これの小数を Math.round で切り捨て(または切り上げ)れば、得たい剰余日数の14が得られます。

9

テキスト追加

2021/11/27 14:49

投稿

退会済みユーザー
test CHANGED
@@ -144,7 +144,7 @@
144
144
 
145
145
 
146
146
 
147
- // d1 と d1 との差分を月単位で得る。その際に小数点以下も取得する。
147
+ // d1 と d2 との差分を月単位で得る。その際に小数点以下も取得する。
148
148
 
149
149
  const monthDiff = d2.diff(d1,'month', true);
150
150
 

8

テキスト追加

2021/11/27 14:36

投稿

退会済みユーザー
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

テキスト追加

2021/11/27 14:24

投稿

退会済みユーザー
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

テキスト追加

2021/11/26 23:37

投稿

退会済みユーザー
test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- アドバイスといいますか、自分ならこういのをやるとき、標準のDateではなく[Day.js](https://day.js.org/en/)を使います。たとえば以下ように monthDiff(dateFrom, dateTo) を書けます。
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`の文字列としてパースしてオブジェクトを作ると、それは指定された月の月初(1日)の日付を表すものになることを利用して、以下のようにも書けます。
59
+ または、与えられた`YYYY-M-D`形式の文字列の`-D`の部分を削除した文字列を、`dayjs()`に渡して、`YYYY-M`の文字列としてパースしてオブジェクトを作ると、指定された月の月初(1日)の日付を表すものになることを利用して、以下のようにも書けます。
60
60
 
61
61
  ```javascript
62
62
 

5

テキスト追加

2021/11/26 23:24

投稿

退会済みユーザー
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

テキスト追加

2021/11/26 23:09

投稿

退会済みユーザー
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 [ n, m ];
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] = [dateFrom, dateTo].map(
65
+ [dateFrom, dateTo] = [dateFrom, dateTo].map(dateStr =>
66
66
 
67
- dateStr => dayjs(dateStr.replace(/-\d{1,2}$/, ''), 'YYYY-M')
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 [ n, m ];
75
+ return [n, m];
76
76
 
77
- }
77
+ };
78
78
 
79
79
  ```
80
80
 

3

テキスト追加

2021/11/26 22:55

投稿

退会済みユーザー
test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- 自分ならこういうのやるとき、標準のDateで頑張らいで、迷わず [Day.js](https://day.js.org/en/)を使います。たとえば以下のように monthDiff(dateFrom, dateTo) を作れます。
5
+ アドバイスといいますか、自分ならこういうのやるとき、標準のDateで[Day.js](https://day.js.org/en/)を使います。たとえば以下のように monthDiff(dateFrom, dateTo) を書けます。
6
6
 
7
7
 
8
8
 

2

テキスト追加

2021/11/26 22:32

投稿

退会済みユーザー
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

テキスト追加

2021/11/26 18:13

投稿

退会済みユーザー
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