JavaScriptの日付を真夜中に初期化する最良の方法は何ですか?


438

new Date()のインスタンスを取得する最も簡単な方法は何ですか?ただし、時刻を真夜中に設定しますか?

回答:


871

このsetHoursメソッドは、オプションのと引数を取ることができますminutes。次に例を示します。secondsms

var d = new Date();
d.setHours(0,0,0,0);

これ00:00:00.000により、現在のタイムゾーンの時刻が設定されます。UTC時間で作業したい場合は、setUTCHoursメソッドを使用できます。


41
参考までに、このメソッド(d.setHours(0,0,0,0))を270K行のreduce関数で実行しています。d.setHours(0)を実行するよりも20秒以上高速です。d.setMinutes(0); d.setSeconds(0); すばらしい回答@CMS!
jbnunn 2012年

32
これは、dをDateオブジェクトとして保持するために、2行で実行する必要があります。私は最近、1行でそれを行うバグを修正しました:var d = new Date()。setHours(0、0、0、0)。ただし、setHoursが数値を返すため、dは日付ではなく数値でした。
Jason

9
私はこれに遭遇しました(私が知っているパーティーに関連して)。また、日付を返す1行のソリューションが必要です。これを探している人にとって、@ Zonの答えは完璧に機能しますnew Date(new Date().setHours(0,0,0,0))
SRack

226

受け入れられた回答からの抜粋が過去の最も近い真夜中を与えることを明確にしたかっただけです:

var d = new Date();
d.setHours(0,0,0,0); // last midnight

将来最も近い真夜中を取得したい場合は、次のコードを使用します。

var d = new Date();
d.setHours(24,0,0,0); // next midnight

6
今日が25時間の場合はどうなりますか(時計が夏時間に合わせて調整されます)。
qntm 2013

8
これはクライアント側のスクリプトです。夏時間にもかかわらず、真夜中は真夜中です。また、注目に値することです。世界中のすべての場所がDST(夏時間)を使用しているわけではありません
chris

2
@qntm:夏時間の変更は常に午前2時から午前4時に適用されるため、その日の真夜中は1つだけになります:)。しかし、はい、午前3時は日中に2回発生する可能性があります(facepalm)
Dan

@chrisいいえ、つまり2番目のスニペットです。「今日の真夜中から24時間後」と「明日の真夜中」は必ずしも同じではありません。これらの場合、2番目のスニペットは機能しますか?
qntm 2013年

3
@qntm:Date.setHoursはむやみに24時間を追加するのではなく、よりインテリジェントです。代わりに、時計が次に24を表示する瞬間のタイムスタンプを返します。時間の節約を考慮しています。自分でコンソールでプレイしてみてください。興味深いことに、setHours(25)は明日の午前1時のタイムスタンプを返します
Dan

68

オブジェクト構成のワンライナー:

new Date(new Date().setHours(0,0,0,0));

要素を作成する場合:

dateFieldConfig = {
      name: "mydate",
      value: new Date(new Date().setHours(0, 0, 0, 0)),
}

6
ありがとう!オブジェクトのプロパティを設定していたので、1行でそれを行うにはどうすればよいかと思っていました。すばらしい答えです。
Paulo Roberto Rosa

Zonに感謝します。これにより、1行で記述できました。
HungrySoul

22

これをここに追加するのは、moment.jsでこれを行う方法を探してこのページにアクセスしたためです。

[ 理由:「モーメント」という単語はすでにこのページの他の場所に表示されているため、検索エンジンがここに直接表示されます。また、moment.jsは、日付に関連する他のSOの質問でどれだけ頻繁に言及されるかについて説明するのに十分なほど広く普及しています。

したがって、バージョン2.0.0以降では:

date.startOf('day');

以前のバージョンの場合:

date.sod();

ドキュメント:

http://momentjs.com/docs/#/manipulating/start-of/


日付オブジェクトのバックを取得するには、この使用moment(DATE_OBJECT).startOf('day').toDate();
xinthose

2
ええ、52kbのJavaScriptライブラリを追加して、2行でできることを実行してみましょう。
Bruce Lim

19
そして、もしあなたがそうするかもしれない多くの正当な理由の一つのためにあなたがすでにmoment.jsを使っているなら...?皮肉なコメントを追加する前に、私が与えた理論的根拠を読んでみませんか?
andyhasit 2016年

11

あなたはおそらく使用できます

new Date().setUTCHours(0,0,0,0)

一度だけ値が必要な場合。


1
OPが必要とするため、これは日付のインスタンスを取得しません。
cobberboy 2016

これは間違いなく最良の答えですが、Dateのインスタンスを返すには少し編集する必要があります。新しい日付(新しい日付().setUTCHours(0、0、0、0));
VitFL

4

@Danの例に有用性を追加すると、次の正午または真夜中を見つける必要がありました。

var d = new Date();
if(d.getHours() < 12) {
   d.setHours(12,0,0,0); // next midnight/midday is midday
} else {
   d.setHours(24,0,0,0); // next midnight/midday is midnight
}

これにより、イベントのフリークエンシーキャップを設定できるようになりました。これは、サイトにアクセスしたすべての訪問者が午前と午後に1回だけ発生できるようにするものです。取得した日付は、Cookieの有効期限を設定するために使用されました。


4

日付を使用して計算すると、夏時間が真夜中(CEST)よりも1時間多くまたは1時間短くなります。これにより、日付が戻るときに1日の差が生じます。したがって、日付は最も近い真夜中に丸める必要があります。したがって、コードは次のようになります(jamisOnに対して):

    var d = new Date();
    if(d.getHours() < 12) {
    d.setHours(0,0,0,0); // previous midnight day
    } else {
    d.setHours(24,0,0,0); // next midnight day
    }

3

これを処理するためにいくつかのプロトタイプを作成しました。

// This is a safety check to make sure the prototype is not already defined.
Function.prototype.method = function (name, func) {
    if (!this.prototype[name]) {
        this.prototype[name] = func;
        return this;
    }
};

Date.method('endOfDay', function () {
    var date = new Date(this);
    date.setHours(23, 59, 59, 999);
    return date;
});

Date.method('startOfDay', function () {
    var date = new Date(this);
    date.setHours(0, 0, 0, 0);
    return date;
});

安全チェックが必要ない場合は、単に使用できます

Date.prototype.startOfDay = function(){
  /*Method body here*/
};

使用例:

var date = new Date($.now()); // $.now() requires jQuery
console.log('startOfDay: ' + date.startOfDay());
console.log('endOfDay: ' + date.endOfDay());

2

プロジェクトの依存関係としてすでにd3.jsがある場合、またはそれを取り込んでも構わない場合は、d3-timed3.jsライブラリはv4.0.0以降はモジュール化されています)にIntervalsがあります。

日付を「デフォルト」の値に設定する場合に役立つことがあります。たとえば、真夜中、0.00秒、月の最初などです。

var d = new Date(); // Wed Aug 02 2017 15:01:07 GMT+0200 (CEST)
d3.timeHour(d) // Wed Aug 02 2017 00:00:00 GMT+0200 (CEST)
d3.timeMonth(d) // Tue Aug 01 2017 00:00:00 GMT+0200 (CEST)

したがって、SOに投稿されたJavaScript関連の質問の傾向に気づきました。ネイティブJSを使用して提案されたソリューションの複雑さに関わらず、外部ライブラリの助けを借りて問題に対処する回答は、いつか必然的に反対票を投じることになります。これを実現するために、私は簡単な序文で回答を投稿するように気をつけました:依存関係としてすでにexample.jsがある場合。それでも、まだ反対投票の匿名SOユーザーですか?それは痛い、男: '-(
Peemster

(このコメントを書いている時点で)moment.jsの使用法を提案している人が16票の賛成票を持っているので、この回答は特に反対票を投じるべきではないと私は思いました。それは問題を非常に簡潔に解決しますが、それほど明白な方法ではありません。
lukeatdesignworks
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.