如何在Javascript中获取一天的起始时间和结束时间?

437

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

14个回答

810

var start = new Date();
start.setUTCHours(0,0,0,0);

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

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

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


45
我建议使用 var end = new Date(start.getTime());,以确保你在同一时间点上 - 如果你在初始化开始和结束日期之间更改了日期,则可能会发生这种情况 - 这只是一个良好的习惯。请注意,我的翻译保留了原文的意思,并尽力让内容更通俗易懂,但没有加入额外的解释。 - Martyn Davis
当一切正常运行时,通常会在0-2个时钟周期之间发生,但这取决于CPU的繁忙程度,因此如果您担心1个时钟周期的精度,那么这样做是有意义的。 - King Friday
25
我建议使用setUTCHours而非setHours来获取世界标准时间。 - sidonaldson
2
事情可能已经改变,但对我而言,这为前一天的UTC开始设置了起点,并为前一天的UTC结束设置了终点。 - David J
5
请阅读 @sidonaldson 的极其重要的评论。使用 setHours 是危险的,因为它设置的是本地时间而不是 UTC 时间。 - Michael
显示剩余2条评论

262

使用dayjs库,按照以下方式使用startOfendOf方法:

本地GMT:

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

对于UTC:

const utc = require('dayjs/plugin/utc');
dayjs.extend(utc);

const start = dayjs.utc().startOf('day'); 
const end = dayjs.utc().endOf('day'); 

使用已经废弃的momentjs库,可以通过在当前日期对象上使用 startOf()endOf() 方法,并将字符串'day'作为参数传递来实现这一目标:

本地 GMT:

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

对于协调世界时:

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

9
最终要使用.toDate()来获取日期。var end = moment().endOf('day').toDate(); - YaTaras
5
在结尾处添加.unix()可以获得以秒为单位的Unix时间戳 :) 就像这样:moment().startOf('day').unix() - Lukas Liesis
5
Moment.js 在我使用预定义的日期对象时似乎无法工作,例如 moment(new Date()).endOf("day"); 无法工作,但是 moment().endOf("day"); 可以工作。 - B. Kemmer
5
要获取指定时区一天的开始时间,你可以使用 moment-timezone,并执行以下操作:moment().tz('America/Chicago').startOf('day').toDate() - Chad Johnson
1
MomentJs现已弃用 - 可以考虑在date.fns中提供一个选项。 - kristjan reinhold
显示剩余3条评论

15
使用 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,答案在这里


解释为什么不使用moment.js的链接。简短的回答是:Moment Js最近宣布该库已被弃用。Luxon非常好! - SebaReal

14

FYI(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上的Instant时间类型,它会根据您所在的区域自动转换您的本地时间。(如果您计划编写全球应用程序)


11

一句话总结 - 考虑本地时区并且不使用库

const todayStart = new Date(new Date().setHours(0, 0, 0, 0))
const todayEnd = new Date(new Date().setHours(23, 59, 59, 999))

const tomorrowStart = new Date(new Date(new Date().setHours(0, 0, 0, 0)).setDate(new Date().getDate() + 1))
const tomorrowEnd = new Date(new Date(new Date().setHours(23, 59, 59, 999)).setDate(new Date().getDate() + 1))

const monthStart = new Date(new Date(new Date().getFullYear(), new Date().getMonth(), 1).setHours(0, 0, 0, 0))
const monthEnd = new Date(new Date(new Date().getFullYear(), new Date().getMonth() + 1, 0).setHours(23, 59, 59, 999))

const nextMonthStart = new Date(new Date(new Date().getFullYear(), new Date().getMonth() + 1, 1).setHours(0, 0, 0, 0))
const nextMonthEnd = new Date(new Date(new Date().getFullYear(), new Date().getMonth() + 2, 0).setHours(23, 59, 59, 999))

console.log({
  todayStart,
  todayEnd,
  tomorrowStart,
  tomorrowEnd,
  monthStart,
  monthEnd,
  nextMonthStart,
  nextMonthEnd,
})


10

MomentJs 中,我们可以这样声明:

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

如此更有帮助! - Darlan Dieterich

8

如果你只对 GMT 时间戳感兴趣,你也可以这样做,这样可以方便地适应不同的时间间隔(1小时: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

3
重要提示:这仅适用于想要获取UTC时间的情况。(这是问题所要求的...但我觉得我应该警告一下那些从谷歌搜索进来并没有意识到这一点的人。) - Kip

7

如果你对UTC一天的开始/结束时间感兴趣,你也可以使用取模运算符:

const now = new Date().getTime();
let startOfDay = now - (now % 86400000);
let endDate = startOfDay + 86400000;

这里的86400表示一天的秒数,结果变量的单位为毫秒。

如果您更喜欢使用Date对象:

const now = new Date().getTime();
let startOfDay = new Date(now - (now % 86400000));
let endDate = new Date(now - (now % 86400000) + 86400000);

结束时间将是“第二天的12点”,我认为你想要使用let endDate = startOfDay + 86400000 - 1来获取当前一天的最后一毫秒。 - Josh M.

6

我更喜欢使用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>


2
不支持UTC处理。 - Dobromir Hristov
1
关于UTC和时区支持,您可以查看https://github.com/marnusw/date-fns-tz。 - esbanarango

5

基于最受欢迎的答案,仅用一行定义日期:

const startToday = new Date(new Date().setUTCHours(0,0,0,0));
const endToday = new Date(new Date().setUTCHours(23,59,59,999));

说明:

new Date().setUTCHours(0,0,0,0) // returns the epoch time number
new Date(/* epoch number */) // returns that epoch Date object 

这就是为什么需要使用两个new Date构造函数。

1
这更加简洁、美观。 - Josh M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接