2015-08-25 2 views
1

Я знаю эту тему: Elegantly check if a given date is yesterday
Но я просто ищу решение для JavaScript. Если возможно, короткий. Я не мог понять, на 100% надежный способ ..Проверьте, соответствует ли дата сегодня, был ли он вчера или был за последние 7 дней

Это, как я делал это до сих пор:

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 

Любая идея, как я могу сказать функцию для того чтобы справиться с этим, а?
Я не ищу решение с библиотеками exterenal (включая ExtJS). Я хотел бы решить эту проблему с помощью необработанного JavaScript.

+3

Есть ли какая-либо конкретная причина, по которой вы хотите изобрести колесо? – nfechner

ответ

1

Хорошо, мы можем сделать это в следующие шаги:

  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"; 
+0

Установив время, когда я буду манипулировать объектом даты, не так ли? Мне бы очень хотелось получить исходное время от объектов. – Forivin

+0

@Forivin Посмотрите обновленный ответ. Благодарю. –

3

Вы можете использовать разницу дат между двумя датами он будет возвращать разницу в днях, если есть минус значение то, как

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")} 
+0

Это возвращает -1 для обоих: 'Sun Aug 23 2015 12:39:34 GMT + 0200 (Дневное время в Центральной Европе)' 'Пн 24 августа 2015 10:30:17 GMT + 0200 (Дневное время в Центральной Европе)' – Forivin

+1

@Forivin Вы можете это проверить здесь http://jsfiddle.net/JS69L/739/ –

+0

Нет, вам нужно сравнить текущее время с этим. Проверьте это: http://jsfiddle.net/1psf0ysb/ – Forivin

0

If вы хотите распечатать сегодня, вчера, показывать день недели, отображать дату без года, если текущий год и отображение дата с годом, если в прошлом году, ниже кода поможет вам.

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 = dt = new Date(someDateTimeStamp), 
     date = dt.getDate(), 
     month = months[dt.getMonth()], 
     timeDiff = someDateTimeStamp - Date.now(), 
     diffDays = Math.ceil(timeDiff/(1000 * 3600 * 24)), 
     diffYears = new Date().getFullYear() - dt.getFullYear(); 

    if(diffYears === 0 && diffDays === 0){ 
     return "Today"; 
    }else if(diffYears === 0 && diffDays === -1) { 
     return "Yesterday"; 
    }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() - (1000 * 3600 * 24 * 1)) //"Yesterday" 
formatDate(1519050214419 - (1000 * 3600 * 24 * 2)) //"Friday" and so on 
Смежные вопросы