Bagaimana cara memulai dan mengakhiri hari di Javascript?

271

Bagaimana cara memulai (00:00:00) dan mengakhiri (23:59:59) hari ini di timestamp (GMT)? Komputer menggunakan waktu setempat.

Bdfy
sumber

Jawaban:

527
var start = new Date();
start.setHours(0,0,0,0);

var end = new Date();
end.setHours(23,59,59,999);

alert( start.toUTCString() + ':' + end.toUTCString() );

Jika Anda perlu mendapatkan waktu UTC dari waktu tersebut, Anda dapat menggunakannya UTC().

tvanfosson
sumber
24
Saya akan merekomendasikan bahwa var end = new Date(start.getTime());untuk memastikan bahwa Anda memiliki titik waktu yang sama - jika Anda mengubah tanggal antara awal dan akhir inisialisasi - itu bisa terjadi - hanya kebiasaan yang baik untuk masuk
Martyn Davis
@ MartynDavis ketika semua operasi normal, biasanya sekitar 0-2 kutu terjadi di antara tetapi tergantung pada seberapa sibuk cpu begitu maka masuk akal untuk melakukan itu jika Anda khawatir tentang presisi 1 kutu.
Jason Sebring
14
Saya juga merekomendasikan menggunakan setUTCHoursdaripada setHoursuntuk mendapatkan waktu Universal
sidonaldson
2
Hal-hal mungkin telah berubah tetapi bagi saya ini menetapkan awal ke UTC mulai untuk hari sebelumnya, dan ke UTC berakhir untuk hari sebelumnya.
David J
5
Silakan baca komentar @ sidonaldson yang sangat penting. Menggunakan setHoursberbahaya karena mengatur jam lokal, bukan jam UTC.
Michael
229

Menggunakan perpustakaan momentjs , ini dapat dicapai dengan startOf()dan endOf()metode pada objek tanggal saat ini saat ini, melewati string 'day'sebagai argumen:

GMT Lokal:

var start = moment().startOf('day'); // set to 12:00 am today
var end = moment().endOf('day'); // set to 23:59 pm today

Untuk UTC:

var start = moment.utc().startOf('day'); 
var end = moment.utc().endOf('day'); 
chridam
sumber
22
momentjs adalah one-stop-shop untuk semua hal terkait penanganan waktu JavaScript. Selalu bernilai impor.
Daniel F
8
Dan kita harus menggunakan .toDate()pada akhirnya untuk mendapatkan tanggalnya. var end = moment().endOf('day').toDate();
YaTaras
5
tambahkan .unix()di akhir untuk mendapatkan cap waktu unix dalam hitungan detik :) seperti ini:moment().startOf('day').unix()
Lukas Liesis
5
js saat entah bagaimana tidak bekerja jika saya memiliki objek Date yang telah ditentukan misalnya moment(new Date()).endOf("day");tidak bekerja, tetapi moment().endOf("day");bekerja.
B. Kemmer
5
@KlasMellbourn Untuk mendapatkan awal hari untuk zona tertentu, Anda dapat menggunakan moment-timezonedan melakukan hal ini: moment().tz('America/Chicago').startOf('day').toDate().
Chad Johnson
8

Menggunakan perpustakaan luxon.js , hal yang sama dapat dicapai dengan menggunakan metode startOf dan endOf dengan melewatkan 'hari' sebagai parameter

var DateTime = luxon.DateTime;
DateTime.local().startOf('day').toUTC().toISO(); //2017-11-16T18:30:00.000Z
DateTime.local().endOf('day').toUTC().toISO(); //2017-11-17T18:29:59.999Z
DateTime.fromISO(new Date().toISOString()).startOf('day').toUTC().toISO(); //2017-11-16T18:30:00.000Z

hapus .toUTC () jika Anda hanya membutuhkan waktu setempat

dan Anda mungkin bertanya mengapa tidak moment.js , jawabannya ada di sini untuk itu.

tk120404
sumber
6

Dalam MomentJs Kita dapat mendeklarasikannya seperti:

   const start = moment().format('YYYY-MM-DD 00:00:01');
   const end = moment().format('YYYY-MM-DD 23:59:59');
Ashutosh Jha
sumber
jauh lebih bermanfaat!
Darlan Dieterich
6

Jika Anda hanya tertarik pada cap waktu dalam GMT, Anda juga dapat melakukan ini, yang dapat disesuaikan dengan mudah untuk interval yang berbeda (jam:, 1000 * 60 * 6012 jam 1000 * 60 * 60 * 12:, dll.)

const interval = 1000 * 60 * 60 * 24; // 24 hours in milliseconds

let startOfDay = Math.floor(Date.now() / interval) * interval;
let endOfDay = startOfDay + interval - 1; // 23:59:59:9999
afinemonkey
sumber
1
Peringatan penting: ini hanya berfungsi jika Anda menginginkan waktu di UTC. (Inilah pertanyaan yang diajukan ... tapi saya rasa saya harus memperingatkan siapa pun yang datang ke sini dari pencarian Google dan tidak menyadarinya.)
Kip
4

FYI (versi gabungan Tvanfosson)

itu akan mengembalikan tanggal aktual => tanggal saat Anda memanggil fungsi

export const today = {
  iso: {
    start: () => new Date(new Date().setHours(0, 0, 0, 0)).toISOString(),
    now: () => new Date().toISOString(),
    end: () => new Date(new Date().setHours(23, 59, 59, 999)).toISOString()
  },
  local: {
  start: () => new Date(new Date(new Date().setHours(0, 0, 0, 0)).toString().split('GMT')[0] + ' UTC').toISOString(),
  now: () => new Date(new Date().toString().split('GMT')[0] + ' UTC').toISOString(),
  end: () => new Date(new Date(new Date().setHours(23, 59, 59, 999)).toString().split('GMT')[0] + ' UTC').toISOString()
  }
}

// Cara Penggunaan

today.local.now(); //"2018-09-07T01:48:48.000Z" BAKU +04:00
today.iso.now(); // "2018-09-06T21:49:00.304Z" * 

* ini berlaku untuk tipe waktu Instan di Java8 yang mengubah waktu lokal Anda secara otomatis tergantung pada wilayah Anda. (jika Anda berencana menulis aplikasi global)

Musa
sumber
0

Saya lebih suka menggunakan perpustakaan tanggal-fns untuk memanipulasi tanggal. Ini adalah alat modular yang sangat bagus dan konsisten. Anda bisa memulai dan mengakhiri hari dengan cara ini:

var startOfDay = dateFns.startOfDay;
var endOfDay = dateFns.endOfDay;

console.log('start of day ==> ', startOfDay(new Date('2015-11-11')));
console.log('end of day ==> ', endOfDay(new Date('2015-11-11')));
<script src="https://cdnjs.cloudflare.com/ajax/libs/date-fns/1.29.0/date_fns.min.js"></script>

Mikhail Shabrikov
sumber
Tidak ada dukungan untuk penanganan UTC.
Dobromir Hristov