我需要按以下顺序对邮件进行排序:收到Today
,Yesterday
和This Week
This Week
的规则:从最近一个星期一开始 - 不包括Today
或Yesterday
意义:
如果Today
是星期日,Yesterday
是星期六,This Week
是星期五,星期四,星期三,星期二和星期一
如果Today
是星期四,Yesterday
是星期三,This Week
是星期二和星期一
但如果Today
是星期二,Yesterday
是星期一 - This Week
没有天
如果Today
是星期一,Yesterday
是星期日 - This Week
没有天
我一直在努力弄清楚如何解决This Week
。我不断收到错误,还有很多边缘情况需要考虑。
这是我的尝试:
var currentDate = new Date()
var currentMonth = currentDate.getMonth()+1
var currentYear = currentDate.getFullYear()
var currentDayofMonth = currentDate.getDate()
var currentDayofWeek = currentDate.getDay()
messages.forEach((message, index) => {
var date = message.date.substring(0, 10).replace(/-/g, '\/')
var messageDate = new Date(date)
var messageMonth = messageDate.getMonth()+1;
var messageYear = messageDate.getFullYear();
var messageDayOfMonth = messageDate.getDate();
var messageDayOfWeek = messageDate.getDay();
//TODAY
if(currentDayofMonth == messageDayOfMonth && currentMonth == messageMonth && currentYear == messageYear) {
messageTypeList["Today"].push(message)
return
}
//YESTERDAY
if(currentDayofMonth == messageDayOfMonth+1 && currentMonth == messageMonth && currentYear == messageYear) {
messageTypeList["Yesterday"].push(message)
return
}
//THIS WEEK
if(currentDayofWeek != 1 && currentDayofWeek != 2 && currentMonth == messageMonth && currentYear == messageYear) {
messageTypeList["This Week"].push(message)
return
}
})
有什么想法吗?
注意
我相信我在Yesterday
中有一个边缘案例错误 - 例如,如果Today
是5月1日,它将不会将4月30日计为Yesterday
,因为月份不同
答案 0 :(得分:0)
首先:将代码分离到函数中。它将更容易测试和调试。 第二步,添加'else',并在thisWeek()中计算最后一个星期一(作为日期),并检查当前日期是否大于此日期(如果日期是在最后一个星期日之后) - 示例 messageDate.getTime()> = lastMondayDate.getTime()
唯一要做的就是计算上周一
伪:
if (isToday(message, currentDate)){
messageTypeList["Today"].push(message)
} else if (isYesterday(message, currentDate)){
messageTypeList["Yesterday"].push(message)
} else if (isThisWeek(message, currentDate)) {
messageTypeList["This Week"].push(message)
}
答案 1 :(得分:0)
您可以通过准备与今天日期相关的日期来更好地做好准备:
然后将消息日期与这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
)可以很好地处理由于夏令时开关更短/更长的时区和天数,只要您将字符串传递给{{1在本地时区。因此,他们不应指定不同的时区(例如,没有Date()
或没有Z
符号。