Làm thế nào để bắt đầu và kết thúc một ngày trong Javascript?


271

Làm thế nào để bắt đầu (00:00:00) và kết thúc (23:59:59) của ngày hôm nay trong dấu thời gian (GMT)? Máy tính sử dụng một giờ địa phương.

Câu trả lời:


525
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() );

Nếu bạn cần lấy thời gian UTC từ những người đó, bạn có thể sử dụng UTC().


24
Tôi khuyên bạn nên var end = new Date(start.getTime());đảm bảo rằng bạn có cùng thời điểm - trong trường hợp bạn thay đổi ngày giữa khởi đầu và kết thúc - điều đó có thể xảy ra - chỉ là một thói quen tốt để tham gia
Martyn Davis

@MartynDavis khi tất cả đều hoạt động bình thường, thường có khoảng 0-2 tích tắc xảy ra ở giữa nhưng nó phụ thuộc vào mức độ bận rộn của cpu nên sẽ rất hợp lý nếu bạn lo lắng về độ chính xác 1 tick.
Jason Sebring

14
Tôi cũng sẽ khuyên bạn nên sử dụng setUTCHoursthay vì setHoursđể có được Thời gian toàn cầu
sidonaldson

2
Mọi thứ có thể đã thay đổi nhưng đối với tôi, điều này đặt bắt đầu cho UTC bắt đầu cho ngày hôm trước và kết thúc UTC cho ngày hôm trước.
David J

5
Vui lòng đọc bình luận cực kỳ quan trọng của @ sidonaldson. Sử dụng setHourslà nguy hiểm vì nó đặt giờ địa phương, thay vì giờ UTC.
Michael

229

Sử dụng thư viện Momentjs , điều này có thể đạt được bằng startOf()endOf()các phương thức trên đối tượng ngày hiện tại của thời điểm, chuyển chuỗi 'day'dưới dạng đối số:

GMT địa phương:

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

Đối với UTC:

var start = moment.utc().startOf('day'); 
var end = moment.utc().endOf('day'); 

22
Momentjs là một cửa cho tất cả những thứ liên quan đến xử lý thời gian JavaScript. Luôn luôn có giá trị nhập khẩu.
Daniel F

8
Và chúng ta nên sử dụng .toDate()cuối cùng để có được ngày. var end = moment().endOf('day').toDate();
YaTara

5
thêm .unix()vào cuối để có dấu thời gian unix trong vài giây :) như thế này:moment().startOf('day').unix()
Lukas Liesis

5
Khoảnh khắc js bằng cách nào đó không hoạt động nếu tôi có một đối tượng Ngày được xác định trước, ví dụ như moment(new Date()).endOf("day");không hoạt động, nhưng moment().endOf("day");không hoạt động.
B. Kemmer

5
@KlasMellbourn Để bắt đầu một ngày cho một múi giờ được chỉ định, bạn có thể sử dụng moment-timezonevà làm điều này : moment().tz('America/Chicago').startOf('day').toDate().
Chad Johnson

8

Sử dụng thư viện luxon.js , có thể đạt được điều tương tự bằng cách sử dụng các phương thức startOf và endOf bằng cách chuyển 'ngày' làm tham số

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

xóa .toUTC () nếu bạn chỉ cần giờ địa phương

và bạn có thể hỏi tại sao không phải khoảnh khắc.js , câu trả lời là ở đây cho điều đó.


6

Trong MomentJs Chúng ta có thể khai báo nó như sau:

   const start = moment().format('YYYY-MM-DD 00:00:01');
   const end = moment().format('YYYY-MM-DD 23:59:59');

rất nhiều hữu ích
Darlan Dieterich

6

Nếu bạn chỉ quan tâm đến dấu thời gian trong GMT, bạn cũng có thể thực hiện việc này, có thể được điều chỉnh thuận tiện cho các khoảng thời gian khác nhau (giờ : 1000 * 60 * 60, 12 giờ : 1000 * 60 * 60 * 12, v.v.)

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

1
Thông báo trước quan trọng: điều này chỉ hoạt động nếu bạn muốn có thời gian ở UTC. (Đây là những gì câu hỏi yêu cầu ... nhưng tôi cảm thấy nên cảnh báo bất kỳ ai đến đây từ một tìm kiếm của Google và không nhận ra điều này.)
Kip

4

FYI (phiên bản hợp nhất của Tvanfosson)

nó sẽ trả về ngày thực tế => ngày khi bạn đang gọi chức năng

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()
  }
}

// cách sử dụng

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

* nó có thể áp dụng cho loại thời gian tức thì trên Java8, tự động chuyển đổi giờ địa phương của bạn tùy thuộc vào khu vực của bạn. (nếu bạn đang lập kế hoạch viết ứng dụng toàn cầu)


0

Tôi thích sử dụng thư viện date-fns để thao tác ngày. Nó thực sự là công cụ mô-đun và nhất quán tuyệt vời. Bạn có thể bắt đầu và kết thúc một ngày theo cách này:

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>


Không hỗ trợ xử lý UTC.
Dobromir Hristov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.