Dateオブジェクトから成分値(年~ミリ秒)を数値配列として取得する場合、1つずつ取得する方法しか思いつきません。Dateのメソッドはまだ理解が及んでいない部分も残っているため、実際にはより適切な方法があるのではないかと疑っています。 これは現在、数値配列で成分値を取得するという目標を達成するための最良かつ唯一の方法ですか?
js
1const date = new Date(); 2const array =[date.getFullYear(),date.getMonth(),date.getDate(),date.getHours(),date.getMinutes(),date.getSeconds(),date.getMilliseconds()];
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/08 08:43
2021/09/10 05:28
2021/09/10 07:23
回答3件
0
問題点が具体化されていない
JavaScript
1const date = new Date(); 2const array =[date.getFullYear(),date.getMonth(),date.getDate(),date.getHours(),date.getMinutes(),date.getSeconds(),date.getMilliseconds()];
このコードの問題点が具体化されていないのが、本質問の問題と感じています。
私の見立てでは問題点が見当たりませんが、何が問題なのでしょうか。
Dateのメソッドはまだ理解が及んでいない部分も残っているため、実際にはより適切な方法があるのではないかと疑っています。
問題点を洗い出してから質問をするのがよいと思います。
ないかもしれない問題点を回答者が洗い出すのは難儀な作業依頼(リファクタリング依頼)になります。
XY問題
これは現在、数値配列で成分値を取得するという目標を達成するための最良かつ唯一の方法ですか?
最適解を得るには「上位の目的」を明らかにする必要があります。
X(Dateオブジェクトから成分値(年~ミリ秒)を数値配列として取得する)は判明していますが、Yが判明していないので回答不可能になっています。
Y
例えば、「new Date
をシリアライズする(Y)」の為に「Dateオブジェクトから成分値(年~ミリ秒)を数値配列として取得する(X)」を実装したいとします。
const Date2 = { stringify: date => [date.getFullYear(),date.getMonth(),date.getDate(),date.getHours(),date.getMinutes(),date.getSeconds(),date.getMilliseconds()], parse: dateData => new Date(...dateData) }; const dateData = Date2.stringify(new Date(2021,8,10,15,30,0,0)); // [2021, 8, 10, 15, 30, 0, 0] console.log(dateData); // [2021, 8, 10, 15, 30, 0, 0] console.log(Date2.parse(dateData)); // Fri Sep 10 2021 15:30:00 GMT+0900 (日本標準時)
一見、正常動作しているように見えますが、new Date
はブラウザのロケールを元にタイムゾーンを設定する為、「Date2.stringify()
実行時のロケール」と「Date2.parse()
実行時のロケール」が不一致の場合に期待通りに復元できません。
私が考える最もスマートな方法は、ISO 8601形式でシリアライズすることです。
JavaScript
1const input = '2021-09-10T06:41:16.081Z'; 2const output = new Date(input).toISOString(); 3console.log(input === output); // true
Re: 3_April_2021 さん
投稿2021/09/10 06:52
編集2021/09/11 01:56総合スコア18189
0
自分で書かないですでにある便利グッズを利用するというスタンスもありでっか? ええんやったら、Dayjs に toArrayプラグインを追加すればいけまっせ。
javascript
1const now = new Date(); 2 3const arr = dayjs(now).toArray(); 4 5console.log(arr); // => [2021,8,8,18,40,33,301]
➡ サンプル
補足(Dateをイテラブルにしてまう):
自分で書く案、一個挙げときます。もし頻繁にDateオブジェクトからその配列にする場合があるんやったら、いっそDateをイテラブルに拡張してしまって、スプレッド構文でバラせるようにしとけば?
ゆうて、こない
javascript
1Date.prototype[Symbol.iterator] = function* () { 2 yield* [ 3 this.getFullYear(), 4 this.getMonth(), 5 this.getDate(), 6 this.getHours(), 7 this.getMinutes(), 8 this.getSeconds(), 9 this.getMilliseconds() 10 ]; 11}
な仕込みしといてからの
javascript
1const d = new Date('2021-09-08T19:12:34.567'); 2 3const arr = [...d]; 4 5console.log(arr); // => [2021,8,8,19,12,34,567] 6 7for (let x of d) { 8 console.log(x); // => 2021,8,8,19,12,34,567 が順に出力される 9}
みたいな。 ➡ サンプル
補足(Intl.DateTimeFormat使うてみる):
javascript
1const date = new Date('2021-09-08T19:12:34.567'); 2 3const arr = new Intl.DateTimeFormat('ja-jp', { 4 year: 'numeric', month: 'numeric', day: 'numeric', 5 hour: 'numeric', minute: 'numeric', second: 'numeric', fractionalSecondDigits: 3 6 }) 7 .formatToParts(date) 8 .filter(({type}) => type !== 'literal') 9 .map(({value}, i) => +value - (i==1)); 10 11console.log(arr); // => [2021,8,8,19,12,34,567]
➡ サンプル
投稿2021/09/08 09:53
編集2021/09/09 00:39退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/10 05:25
退会済みユーザー
2021/09/10 07:47
2021/09/10 21:01
2021/09/10 21:04
退会済みユーザー
2021/09/10 23:46
0
ベストアンサー
文字列でうけてsplitしては?
(msは返ってこないので別途処理)
javascript
1const date = new Date(); 2const ms=date.getMilliseconds(); 3const res=[...date.toLocaleString().split(/[/ :]/).map(x=>parseInt(x)),ms]; 4res[1]--; 5console.log(res);
別解
javascript
1const date = new Date(); 2const res=["FullYear","Month","Date","Hours","Minutes","Seconds","Milliseconds"].map(x=>Date.prototype[`get${x}`].call(date)); 3console.log(res);
投稿2021/09/08 08:57
編集2021/09/10 05:45総合スコア116738
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/08 09:09
2021/09/08 09:17
2021/09/10 05:21
2021/09/10 05:45
2021/09/11 04:59
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。