检查日期是否为今天、昨天或过去7天内的日期。

9
我知道这个帖子:Elegantly check if a given date is yesterday
但我只是特别寻找JavaScript的解决方案,如果可能的话,需要一个简短的解决方案。我无法想出一个100%可靠的方法…

目前我的做法是:

function FormatDate(someDtUTC) {
    var someDt = new Date(someDtUTC.getTime() + someDtUTC.getTimezoneOffset() * 60 * 1000);
    var dtNow = new Date();
    if (dtNow.getUTCFullYear() == someDt.getUTCFullYear() && dtNow.getUTCMonth() == someDt.getUTCMonth()) {
        if (dtNow.getUTCDate() == someDt.getUTCDate())
            var dateString = "Today, " + Ext.Date.format(someDt, 'G:i'); // Today, 15:32
        else if (dtNow.getUTCDate() - 1 == someDt.getUTCDate())
            var dateString = "Yesterday, " + Ext.Date.format(someDt, 'G:i'); //Yesterday, 13:26
        else if (dtNow.getUTCDate() - someDt.getUTCDate() < 7)
            var dateString = Ext.Date.format(someDt, 'l, G:i'); //Sunday, 14:03
    } else
        var dateString = Ext.Date.format(someDt, 'j.n.y\, G:i'); //7.8.15, 8:25
    return dateString;
}

不用担心Ext.Date.format()函数,它并不是问题的一部分。
这段代码的问题在于它无法处理以下情况:
Today: 01.08.15  
Yesterday: 31.07.15 

你有什么想法可以让该函数也处理这个问题吗?
我不想使用外部库来解决这个问题(包括ExtJS)。我希望用原始的JavaScript来解决。


5
为什么你要重新发明轮子? - nfechner
8个回答

12

如果你想打印今天、昨天、显示星期几、如果是今年则显示不带年份的日期,如果是去年则显示带年份的日期,以下代码将会对你有所帮助。

var fulldays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];


function formatDate(someDateTimeStamp) {
    var dt = new Date(someDateTimeStamp),
        date = dt.getDate(),
        month = months[dt.getMonth()],
        timeDiff = someDateTimeStamp - Date.now(),
        diffDays = new Date().getDate() - date,
        diffMonths = new Date().getMonth() - dt.getMonth(),
        diffYears = new Date().getFullYear() - dt.getFullYear();

    if(diffYears === 0 && diffDays === 0 && diffMonths === 0){
      return "Today";
    }else if(diffYears === 0 && diffDays === 1) {
      return "Yesterday";
    }else if(diffYears === 0 && diffDays === -1) {
      return "Tomorrow";
    }else if(diffYears === 0 && (diffDays < -1 && diffDays > -7)) {
      return fulldays[dt.getDay()];
    }else if(diffYears >= 1){
      return month + " " + date + ", " + new Date(someDateTimeStamp).getFullYear();
      }else {
        return month + " " + date;
      }
}

formatDate(Date.now()) //"Today"
formatDate(Date.now() - 86400000) // "Yesterday"
formatDate(Date.now() - 172800000) // it will return the name of the week if it is beyond two days

这很棒。但是你还需要检查一下“今天”部分的月份,否则今天就是今天,上个月的同一天也会返回今天。 - Pape
1
@Pape,分析得很好。代码已修复。谢谢! - Kapilrc
2
昨天的条件怎么样...我认为应该检查diffMonths,否则昨天就是昨天,同一年的其他月份的同一天也会返回昨天。 - BrunoElo

6
好的,我们可以按照以下步骤完成:
  1. 获取两个日期的 Date() 对象。
  2. 使用 .setTime() 设置特定时间。
  3. 使用 .getTime() 计算毫秒数。
  4. 计算两个日期之间的时间差。
  5. 检查以下情况:
    1. 如果时间差为 86400000,则为昨天。
    2. 如果时间差是 86400000 的倍数,则为相应的天数。

JavaScript 代码

var a = new Date(2015, 8 - 1, 25);  // Today
var b = new Date(2015, 8 - 1, 24);  // Yesterday
var c = new Date();                 // Now

c.setHours(0);
c.setMinutes(0);
c.setSeconds(0, 0);

if (a.getTime() == c.getTime())
  return "Today";
else if (b.getTime() == c.getTime())
  return "Yesterday";
else if ((new Date(2015, 8 - 1, 25 - 7)).getTime() < c.getTime())
  return "Less than a week";

通过设置时间,我可以操作日期对象,对吧?之后我真的很想能够从对象中获取原始时间。 - Forivin

4

我在 @Kapilrc 的源代码基础上进行了改进。语言变量应该对 toLocaleString() 有效。祝使用愉快!

function create_human_friendly_date(
  timestamp,
  yesterday_text,
  today_text,
  tomorrow_text,
  language
) {
  var in_the_last_7days_date_options = { weekday: 'long'};
  var in_the_next_7days_date_options = { month: 'short', day: 'numeric' };
  var same_year_date_options = { month: 'short', day: 'numeric' };
  var far_date_options = { year: 'numeric', month: 'short', day: 'numeric' };

  var dt = new Date(timestamp);
  var date = dt.getDate();
  var time_diff = timestamp - Date.now();
  var diff_days = new Date().getDate() - date;
  var diff_months = new Date().getMonth() - dt.getMonth();
  var diff_years = new Date().getFullYear() - dt.getFullYear();

  var is_today = diff_years === 0 && diff_months === 0 && diff_days === 0;
  var is_yesterday = diff_years === 0 && diff_months === 0 && diff_days === 1;
  var is_tomorrow = diff_years === 0 && diff_months === 0 && diff_days === -1;
  var is_in_the_last_7days = diff_years === 0 && diff_months === 0 && (diff_days > 1 && diff_days < 7);
  var is_in_the_next_7days = diff_years === 0 && diff_months === 0 && (diff_days < -1 && diff_days > -7);
  var is_same_year = diff_years === 0;

  if(is_today){
    return today_text;
  }else if(is_yesterday) {
    return yesterday_text;
  }else if(is_tomorrow) {
    return tomorrow_text;
  }else if(is_in_the_last_7days) {
    return dt.toLocaleString(language, in_the_last_7days_date_options);
  }else if(is_in_the_next_7days) {
    return dt.toLocaleString(language, in_the_next_7days_date_options);
  }else if(is_same_year){
    return dt.toLocaleString(language, same_year_date_options);
  }else{
    return dt.toLocaleString(language, far_date_options);
  }
}

console.log(create_human_friendly_date(Date.now(), "Yesterday", "Today", "Tomorrow", "en")); // Today

console.log("***********************************");

console.log(create_human_friendly_date(Date.now() - (1000 * 3600 * 24 * 1), "Yesterday", "Today", "Tomorrow", "en")); // Yesterday
console.log(create_human_friendly_date(Date.now() - (1000 * 3600 * 24 * 2), "Yesterday", "Today", "Tomorrow", "en")); // 2 days ago
console.log(create_human_friendly_date(Date.now() - (1000 * 3600 * 24 * 10), "Yesterday", "Today", "Tomorrow", "en")); // 10 days ago
console.log(create_human_friendly_date(Date.now() - (1000 * 3600 * 24 * 900), "Yesterday", "Today", "Tomorrow", "en")); // Some years ago

console.log("***********************************");

console.log(create_human_friendly_date(Date.now() + (1000 * 3600 * 24 * 1), "Yesterday", "Today", "Tomorrow", "en")); // Tomorrow
console.log(create_human_friendly_date(Date.now() + (1000 * 3600 * 24 * 2), "Yesterday", "Today", "Tomorrow", "en")); // In 2 days
console.log(create_human_friendly_date(Date.now() + (1000 * 3600 * 24 * 10), "Yesterday", "Today", "Tomorrow", "en")); // In 10 days
console.log(create_human_friendly_date(Date.now() + (1000 * 3600 * 24 * 900), "Yesterday", "Today", "Tomorrow", "en")); // In some years


1

这对我有效。

const generatingDates = () => {
  let dates = {
    today: null,
    yesterday: null,
    oneDayBeforeYesterday: null,
    twoDayBeforeYesterday: null,
    threeDayBeforeYesterday: null,
    fourDayBeforeYesterday: null,
    fiveDayBeforeYesterday: null,
  };
 
  let keys = Object.keys(dates);
 
  keys.map((x) => {
    prev = null;
    if (prev === null && dates[x] === null) {
      dates[x] = new Date();
      prev = dates[x];
    } else if (value === null && prev !== null) {
      dates[x] = prev;
    }
  });
 
  return dates;
};
 
function findDay(date) {
  let dateToCheck = new Date(date);
 
  const datesDict = generatingDates();
  //   console.log(datesDict);
 
  datesDict.yesterday.setDate(datesDict.yesterday.getDate() - 1);
  datesDict.oneDayBeforeYesterday.setDate(datesDict.yesterday.getDate() - 1);
  datesDict.twoDayBeforeYesterday.setDate(datesDict.yesterday.getDate() - 2);
  datesDict.threeDayBeforeYesterday.setDate(datesDict.yesterday.getDate() - 3);
  datesDict.fourDayBeforeYesterday.setDate(datesDict.yesterday.getDate() - 4);
  datesDict.fiveDayBeforeYesterday.setDate(datesDict.yesterday.getDate() - 5);
 
  let days = [
    "Sunday",
    "Monday",
    "Tuesday",
    "Wednesday",
    "Thursday",
    "Friday",
    "Saturday",
  ];
 
  if (dateToCheck.toDateString() === datesDict.today.toDateString()) {
    return "Today";
  } else if (
    dateToCheck.toDateString() === datesDict.yesterday.toDateString()
  ) {
    return "Yesterday";
  } else if (
    dateToCheck.toDateString() ===
    datesDict.oneDayBeforeYesterday.toDateString()
  ) {
    return days[date.getDay()];
  } else if (
    dateToCheck.toDateString() ===
    datesDict.twoDayBeforeYesterday.toDateString()
  ) {
    return days[date.getDay()];
  } else if (
    dateToCheck.toDateString() ===
    datesDict.threeDayBeforeYesterday.toDateString()
  ) {
    return days[date.getDay()];
  } else if (
    dateToCheck.toDateString() ===
    datesDict.fourDayBeforeYesterday.toDateString()
  ) {
    return days[date.getDay()];
  } else if (
    dateToCheck.toDateString() ===
    datesDict.fiveDayBeforeYesterday.toDateString()
  ) {
    return days[dateToCheck.getDay()];
  } else {
    return dateToCheck;
  }
}

1
这对我来说有效:

  private _isSameDay(date1: Date, date2: Date): boolean {
    return (
      date1.getUTCFullYear() === date2.getUTCFullYear() &&
      date1.getMonth() === date2.getMonth() &&
      date1.getDate() === date2.getDate()
    );
  }

  private _getSeparatorBody(date: Date): string {
    if (this._isSameDay(date, new Date())) {
      return 'Today';
    }
    const yesterday = new Date();
    yesterday.setDate(yesterday.getDate() - 1);
    if (this._isSameDay(date, yesterday)) {
      return 'Yesterday';
    }
    return date.toISOString();
  }

1
  1. Why don't you try something like this
  2. You can do this also for 7 days ago:

    export function isToday(date, now) {
      const yearDate = date.getYear();
      const monthDate = date.getMonth();
      const dayDate = date.getDate();
      const yearNow = now.getYear();
      const monthNow = now.getMonth();
      const dayNow = now.getDate();
      if (yearDate === yearNow && monthDate === monthNow && dayDate === 
        dayNow) {
        return true
      }
      return false
    }
    

0

您可以使用此函数并将日期作为参数传递,它将返回星期几,并在7天后返回给定日期。

function findDay(date) {
    let dateToCheck = new Date(date);
    
    const today = new Date();
    const yesterday = new Date(today);
    const oneDayBeforeYesterday = new Date(yesterday);
    const twoDayBeforeYesterday = new Date(yesterday);
    const threeDayBeforeYesterday = new Date(yesterday);
    const fourDayBeforeYesterday = new Date(yesterday);
    const fiveDayBeforeYesterday = new Date(yesterday);

    yesterday.setDate(yesterday.getDate() - 1);
    oneDayBeforeYesterday.setDate(yesterday.getDate() - 1);
    twoDayBeforeYesterday.setDate(yesterday.getDate() - 2);
    threeDayBeforeYesterday.setDate(yesterday.getDate() - 3);
    fourDayBeforeYesterday.setDate(yesterday.getDate() - 4);
    fiveDayBeforeYesterday.setDate(yesterday.getDate() - 5);

    let days = [
        "Sunday",
        "Monday",
        "Tuesday",
        "Wednesday",
        "Thursday",
        "Friday",
        "Saturday",
    ];

    if (dateToCheck.toDateString() === today.toDateString()) {
        return "Today";
    } else if (dateToCheck.toDateString() === yesterday.toDateString()) {
        return "Yesterday";
    } else if (dateToCheck.toDateString() === oneDayBeforeYesterday.toDateString()) {
        return days[date.getDay()];
    } else if (dateToCheck.toDateString() === twoDayBeforeYesterday.toDateString()) {
        return days[date.getDay()];
    } else if (dateToCheck.toDateString() === threeDayBeforeYesterday.toDateString()) {
        return days[date.getDay()];
    } else if (dateToCheck.toDateString() === fourDayBeforeYesterday.toDateString()) {
        return days[date.getDay()];
    } else if (dateToCheck.toDateString() === fiveDayBeforeYesterday.toDateString()) {
        return days[dateToCheck.getDay()];
    } else {
        return dateToCheck;
    }
}

console.log(findDay("07-10-2020"));


1
我已经尝试过这个并且可行,我已将myDate编辑为date,但是dateToCheck应该可以工作。我相信这个函数可以大大缩短。 - m3nda

-1
你可以使用两个日期之间的日期差异来获取它们之间的天数差,如果结果为负值,则表示一个日期早于另一个日期。
var date1 = new Date("12/15/2010");
var date2 = new Date("12/14/2010");
var timeDiff = date2.getTime() - date1.getTime();
var diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24)); 
if(diffDays == -1){ alert("Yesterday")}

这两个日期都返回了-1:Sun Aug 23 2015 12:39:34 GMT+0200 (Central Europe Daylight Time) Mon Aug 24 2015 10:30:17 GMT+0200 (Central Europe Daylight Time) - Forivin
不,你必须将当前时间与其中一个进行比较。请查看此链接:http://jsfiddle.net/1psf0ysb/。 - Forivin
@Forivin 我明白了,这是时间问题(即上午和下午等时间),你现在可以在这里检查它 http://jsfiddle.net/1psf0ysb/1/ - Muhammad Usman
好吧,这并没有帮助我,你只是删除了时间。我的日期有时间,我需要它们... - Forivin
4
不好,因为它无法检测到昨天的时间,如果时间差小于24小时:http://jsfiddle.net/JS69L/1720/ - Jorge Fuentes González

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