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

Bdf*_*dfy 236 javascript

今天如何以时间戳(GMT)开始(00:00:00)和结束(23:59:59)?电脑使用当地时间.

tva*_*son 461

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() );
Run Code Online (Sandbox Code Playgroud)

如果您需要从那些获得UTC时间,您可以使用UTC().

  • 我建议`var end = new Date(start.getTime());`以确保你有相同的时间点 - 如果你在开始和结束初始化之间改变日期 - 它可能发生 - 只是一个好习惯进入 (22认同)
  • 我还建议使用`setUTCHours`而不是`setHours`来获得通用时间 (13认同)
  • 请阅读@sidonaldson的极其重要的评论。使用`setHours`是危险的,因为它会设置本地时间,而不是UTC时间。 (5认同)
  • 事情可能已经改变,但对我来说,这将开始前一天的UTC开始,以及前一天的UTC结束. (2认同)

chr*_*dam 215

使用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
Run Code Online (Sandbox Code Playgroud)

对于UTC:

var start = moment.utc().startOf('day'); 
var end = moment.utc().endOf('day'); 
Run Code Online (Sandbox Code Playgroud)

  • momentjs是所有与JavaScript时间处理相关的一站式商店.总是值得进口. (21认同)
  • 我们最后应该使用`.toDate()`来获取日期.`var end = moment().endOf('day').toDate();` (8认同)
  • 在末尾添加`.unix()`以获得unix时间戳,以秒为单位:)像这样:`moment().startOf('day').unix()` (5认同)
  • 如果我有一个预定义的Date对象,例如`moment(new Date()).endOf("day");`不起作用,但是`moment().endOf("day"); `确实有效. (5认同)
  • @KlasMellbourn要获得指定时区的开始,你可以使用`moment-timezone`并执行此操作:`moment().tz('America/Chicago').startOf('day').toDate()` . (4认同)

Ema*_*uel 12

一艘班轮 - 考虑当地时区且不带图书馆

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,
})
Run Code Online (Sandbox Code Playgroud)


Ash*_*Jha 8

MomentJs我们可以这样声明:

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


rom*_*mor 8

由于您对 UTC 一天的开始/结束感兴趣,您还可以使用模运算符:

const now = new Date().getTime();
let startOfDay = now - (now % 86400000);
let endDate = startOfDay + 86400000;
Run Code Online (Sandbox Code Playgroud)

其中 86400 是一天的秒数,结果变量是纪元(以毫秒为单位)。

如果您更喜欢Date对象:

const now = new Date().getTime();
let startOfDay = new Date(now - (now % 86400000));
let endDate = new Date(now - (now % 86400000) + 86400000);
Run Code Online (Sandbox Code Playgroud)


tk1*_*404 6

使用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
Run Code Online (Sandbox Code Playgroud)

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

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


Mik*_*kov 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')));
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/date-fns/1.29.0/date_fns.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

  • 不支持 UTC 处理。 (2认同)

afi*_*key 6

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

  • **重要警告:** 这仅在您需要 UTC 时间时才有效。(这就是问题所要求的......但我觉得我应该警告任何通过谷歌搜索来到这里但没有意识到这一点的人。) (3认同)

Mus*_*usa 5

仅供参考(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()
  }
}
Run Code Online (Sandbox Code Playgroud)

// 如何使用

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

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


小智 5

我们可以用moment这个。

// for day start time
moment(moment().startOf('day')).format('HH:mm')

// for day end time
moment(moment().endOf('day')).format('HH:mm')
Run Code Online (Sandbox Code Playgroud)


Jos*_*igo 5

基于评分最高的答案,但仅在一行中定义日期:

const startToday = new Date(new Date().setUTCHours(0,0,0,0));
const endToday = new Date(new Date().setUTCHours(23,59,59,999));
Run Code Online (Sandbox Code Playgroud)

解释:

new Date().setUTCHours(0,0,0,0) // returns the epoch time number
new Date(/* epoch number */) // returns that epoch Date object 
Run Code Online (Sandbox Code Playgroud)

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