按时间分组消息的算法

时间:2017-04-24 18:57:46

标签: javascript algorithm date timestamp

我需要按以下顺序对邮件进行排序:收到TodayYesterdayThis Week

This Week的规则:从最近一个星期一开始 - 不包括TodayYesterday

意义:

如果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,因为月份不同

2 个答案:

答案 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"
    }
  ]
}

这种工作方式(使用setHourssetDate)可以很好地处理由于夏令时开关更短/更长的时区和天数,只要您将字符串传递给{{1在本地时区。因此,他们不应指定不同的时区(例如,没有Date()或没有Z符号。