Apa cara terbaik untuk menginisialisasi Tanggal JavaScript hingga tengah malam?

441

Apa cara paling sederhana untuk mendapatkan turunan dari Date baru () tetapi atur waktunya di tengah malam?

Sixty4Bit
sumber

Jawaban:

877

The setHoursMetode dapat mengambil opsional minutes, secondsdan msargumen, misalnya:

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

Yang akan mengatur waktu untuk 00:00:00.000dari zona waktu Anda saat ini , jika Anda ingin bekerja di waktu UTC, Anda dapat menggunakan setUTCHoursmetode.

CMS
sumber
42
FYI, saya menjalankan metode ini (d.setHours (0,0,0,0)) dalam fungsi pengurangan pada baris 270K, dan ini lebih cepat 20 detik daripada melakukan d.setHours (0); d.setMinutes (0); d.setSeconds (0); Jawaban yang bagus @CMS!
jbnunn
32
Ini perlu dilakukan dalam dua baris untuk menjaga d sebagai objek Date. Baru-baru ini saya memperbaiki bug yang melakukannya dalam satu baris: var d = Date baru (). SetHours (0, 0, 0, 0). Namun, d adalah angka, bukan tanggal karena setHours mengembalikan angka.
Jason
9
Saya baru saja menemukan ini (terlambat ke pesta yang saya tahu), juga membutuhkan solusi satu baris mengembalikan Tanggal. Untuk orang yang mencari ini, jawaban @ Zon ini bekerja sempurna: new Date(new Date().setHours(0,0,0,0)).
SRack
227

Hanya ingin mengklarifikasi bahwa cuplikan dari jawaban yang diterima memberikan waktu tengah malam terdekat :

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

Jika Anda ingin mendapatkan tengah malam terdekat di masa mendatang , gunakan kode berikut:

var d = new Date();
d.setHours(24,0,0,0); // next midnight
Dan
sumber
6
Apa yang terjadi jika hari ini panjangnya 25 jam (jam menyesuaikan ke depan untuk Daylight Saving)?
qntm
8
Ini adalah skrip sisi klien, tengah malam adalah tengah malam, meskipun ada penghematan di siang hari .. Juga disebutkan ... tidak semua tempat di dunia menggunakan DST (waktu musim panas)
chris
2
@ qntm: perubahan waktu musim panas selalu diterapkan pukul 2 pagi - 4 pagi, sehingga hanya satu tengah malam selama hari itu :). Tapi ya, 03:00 bisa terjadi dua kali di siang hari (facepalm)
Dan
@ Chris Tidak, maksud saya cuplikan kedua. "24 jam setelah tengah malam hari ini" tidak selalu sama dengan "tengah malam besok". Dalam kasus ini, apakah cuplikan kedua berfungsi?
qntm
3
@ qntm: Date.setHours tidak menambahkan secara membabi buta 24 jam, itu lebih cerdas. Sebagai gantinya, ia mengembalikan stempel waktu saat itu, ketika jam akan menunjukkan 24 waktu berikutnya. Mempertimbangkan penghematan waktu. Cobalah bermain sendiri di konsol. Menarik, setHours (25) mengembalikan stempel waktu hari esok 01:00
Dan
68

Satu-liner untuk konfigurasi objek:

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

Saat membuat elemen:

dateFieldConfig = {
      name: "mydate",
      value: new Date(new Date().setHours(0, 0, 0, 0)),
}
Zon
sumber
6
Terima kasih! saya bertanya-tanya bagaimana saya bisa melakukannya dalam satu baris karena saya menetapkan properti objek! Jawaban yang bagus
Paulo Roberto Rosa
Terima kasih Zon, ini membantu saya untuk menulisnya satu baris.
HungrySoul
22

Hanya akan menambahkan ini di sini karena saya mendarat di halaman ini mencari cara untuk melakukan hal ini di moment.js dan lain-lain dapat melakukan terlalu.

[Dasar Pemikiran: kata "saat" sudah muncul di tempat lain di halaman ini sehingga mesin telusur langsung ke sini, dan moment.js cukup luas untuk menjamin akan dibahas tentang seberapa sering disebutkan dalam pertanyaan SO terkait tanggal lainnya]

Jadi, dalam versi 2.0.0 dan lebih tinggi:

date.startOf('day');

Untuk versi sebelumnya:

date.sod();

Docs:

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

andyhasit
sumber
untuk mendapatkan objek tanggal kembali, gunakan inimoment(DATE_OBJECT).startOf('day').toDate();
xinthose
2
ya, mari kita tambahkan perpustakaan javascript 52kb untuk melakukan sesuatu yang dapat Anda lakukan dalam 2 baris.
Bruce Lim
19
Dan bagaimana jika Anda sudah menggunakan moment.js karena salah satu alasan bagus Anda mungkin ...? Bagaimana dengan membaca alasan yang saya berikan sebelum menambahkan komentar sarkastik?
andyhasit
11

Anda mungkin bisa menggunakan

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

jika Anda membutuhkan nilai hanya sekali.

Stan
sumber
1
Ini tidak mendapatkan turunan dari Tanggal, seperti yang diperlukan OP.
cobberboy
Ini adalah jawaban terbaik yang pasti, tetapi perlu sedikit suntingan untuk mengembalikan turunan Tanggal. Tanggal baru (Tanggal baru (). setUTCHours (0, 0, 0, 0));
VitFL
4

Menambahkan kegunaan pada contoh Dan, saya harus menemukan tengah hari atau tengah malam berikutnya.

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
}

Ini memungkinkan saya untuk menetapkan batas frekuensi untuk suatu acara, hanya memungkinkannya terjadi sekali di pagi hari dan sekali di sore hari untuk setiap pengunjung ke situs saya. Tanggal yang diambil digunakan untuk mengatur kedaluwarsa cookie.

jamis0n
sumber
4

Jika menghitung dengan tanggal, musim panas akan menyebabkan sering 1 jam lebih atau satu jam kurang dari tengah malam (CEST). Ini menyebabkan perbedaan 1 hari ketika tanggal kembali. Jadi kurma harus membulatkan ke tengah malam terdekat. Jadi kodenya adalah (ths to 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
    }
pengguna3887038
sumber
3

Saya telah membuat beberapa prototipe untuk menangani ini untuk saya.

// 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;
});

jika Anda tidak ingin memeriksa keselamatan, maka Anda bisa menggunakannya

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

Contoh penggunaan:

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

Jika Anda sudah memiliki d3.js sebagai dependensi dalam proyek Anda, atau tidak keberatan membawanya, d3-time ( pustaka d3.js modular pada v4.0.0 ) telah mendapat Interval .

Mereka mungkin terbukti berguna ketika menetapkan tanggal ke nilai "default", misalnya tengah malam, 0,00 detik, yang pertama bulan, dll.

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)
Peemster
sumber
Jadi saya perhatikan tren terkait pertanyaan JavaScript yang diposting di SO: tidak peduli kompleksitas solusi yang diajukan menggunakan JS asli, jawaban apa pun yang mengatasi masalah dengan bantuan perpustakaan eksternal pasti akan turun pada waktu tertentu akan diturunkan. Menyadari hal ini, saya berhati-hati untuk mengirim jawaban saya dengan kata pengantar cepat: Jika Anda sudah memiliki example.js sebagai ketergantungan . Namun masih downvote, pengguna SO anonim? itu menyakitkan, man: '- (
Peemster
Saya merasa bahwa jawaban ini tidak boleh turun sebagai suara terutama karena yang mengusulkan penggunaan moment.js memiliki 16 suara (pada saat menulis komentar ini). Itu memecahkan masalah dengan cara yang sangat ringkas dan tidak begitu jelas.
lukeatdesignworks