您可以通过准备与今天日期相关的日期来更好地准备地面:
将当前日期截断为午夜
获取昨天的日期
获取上周一的日期
然后将消息日期与这3个日期中的每一个进行比较:消息日期之前或之前的第一个日期确定消息的类别 . 如果所有三个都大于消息日期,则不需要发生任何事情 .
以下是建议的代码:
// This sample uses a fixed date so the categories can be illustrated better:
var currentDate = new Date('2017/04/27') // Or leave out the argument for actual date
currentDate.setHours(0,0,0,0); // set to midnight
// Prepare all related dates: yesterday and last Monday
var keys = [];
keys.push(['Today', new Date(currentDate)]); // clone
currentDate.setDate(currentDate.getDate() - 1);
keys.push(['Yesterday', new Date(currentDate)]); // clone
currentDate.setDate(currentDate.getDate() - (currentDate.getDay()+6)%7);
keys.push(['This week', new Date(currentDate)]); // clone
var messages = [
{ date: '2017-04-21' },
{ date: '2017-04-22' },
{ date: '2017-04-23' },
{ date: '2017-04-24' }, // Monday
{ date: '2017-04-25' },
{ date: '2017-04-26' },
{ date: '2017-04-27' },
];
var messageTypeList = {
Today: [],
Yesterday: [],
"This week": []
};
messages.forEach( message => {
var date = message.date.substring(0, 10).replace(/-/g, '\/');
var messageDate = new Date(date);
var [key] = keys.find( ([key, date]) => messageDate >= date ) || [];
if (key) messageTypeList[key].push(message);
});
console.log(messageTypeList);
.as-console-wrapper { max-height: 100% !important; top: 0; }
输出:
{
"Today": [
{
"date": "2017-04-27"
}
],
"Yesterday": [
{
"date": "2017-04-26"
}
],
"This week": [
{
"date": "2017-04-24"
},
{
"date": "2017-04-25"
}
]
}
这种工作方式(使用 setHours 和 setDate )将很好地处理由于夏令时开关更短/更长的时区和天数,只要您将字符串传递到本地时区的 Date() 即可 . 因此,他们不应指定不同的时区(例如,没有 Z 或没有 YYYY-MM-DD 表示法) .