如何开始和结束一天中的Javascript?


271

如何在时间戳记(GMT)中获取今天的开始(00:00:00)和结束(23:59:59)?计算机使用当地时间。

Answers:


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

如果您需要从中获取UTC时间,可以使用UTC()


24
我建议var end = new Date(start.getTime());,以确保您有相同的时间点-在事件中,你改变的开始和结束初始化之间的日期-它可能发生-只是一个良好的习惯进入
马丁戴维斯

@MartynDavis正常运行时,通常介于大约0-2滴答之间,但这取决于CPU的繁忙程度,因此如果您担心1滴答的精度,则可以这样做。
杰森·塞布林

14
我也建议您使用setUTCHours而不是setHours获得通用时间
sidonaldson

2
事情可能已经改变,但是对我来说,这将开始设置为前一天的UTC开始,并设置为前一天的UTC结束。
David J

5
请阅读@sidonaldson的极其重要的评论。使用会setHours很危险,因为它会设置本地时间,而不是UTC时间。
迈克尔

229

使用momentjs库,可以通过将当前字符串作为参数传递给当前日期对象的startOf()and endOf()方法来实现'day'

当地格林尼治标准时间:

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

对于UTC:

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

22
momentjs是与JavaScript时间处理相关的所有事情的一站式服务。永远值得进口。
Daniel F

8
最后我们应该使用.toDate()它来获取日期。 var end = moment().endOf('day').toDate();
YaTaras

5
.unix()在结尾添加以秒为单位的unix时间戳:)像这样:moment().startOf('day').unix()
Lukas Liesis

5
如果我有预定义的Date对象,例如moment(new Date()).endOf("day");,js 无法工作,但moment().endOf("day");确实可以工作。
B. Kemmer

5
@KlasMellbourn要获取指定时区的开始时间,可以使用moment-timezone并执行以下操作:moment().tz('America/Chicago').startOf('day').toDate()
乍得·约翰逊

8

使用luxon.js库,可以通过将'day'作为参数使用startOf和endOf方法来实现相同的效果

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

如果只需要本地时间,请删除.toUTC()

您可能会问为什么不使用moment.js,答案就在这里



6

如果您只是对GMT中的时间戳感兴趣,也可以这样做,可以方便地将其适应于不同的时间间隔(小时:1000 * 60 * 60,12小时:1000 * 60 * 60 * 12等)

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
重要警告:仅当您想要使用UTC的时间时,此方法才有效。(这就是这个问题的要点……但是我觉得我应该警告所有从Google搜索来到这里的人,但没有意识到这一点。)
Kip

4

仅供参考(Tvanfosson的合并版本)

调用函数时它将返回实际日期=>日期

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

// 如何使用

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

*它适用于Java8上的即时时间类型,该时间类型会根据您所在的地区自动转换您的本地时间。(如果您打算编写全局应用程序)


0

我更喜欢使用date-fns库进行日期处理。这确实是很棒的模块化和一致的工具。您可以通过以下方式开始和结束一天:

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>


不支持UTC处理。
Dobromir Hristov '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.