javascript Datetime сравнить - PullRequest
       0

javascript Datetime сравнить

1 голос
/ 23 ноября 2011

Мне нужно сравнить две даты в JavaScript.

В моем коде я вызываю метод веб-службы, который сериализует и возвращает в формате JSON экземпляр следующего класса

public class MyPeriod
{
    public int PeriodID { get; set; }
    public DateTime BeginDate { get; set; }
    public DateTime FirstDeadline { get; set; }
    public DateTime SecondDeadline { get; set; }
    public DateTime EndDate { get; set; }
} 

это создаст фрагмент JSON, подобный этому:

{
    "d": {
        "PeriodID":26,
        "BeginDate":"\/Date(1321743660000)\/",
        "FirstDeadline":"\/Date(1322002860000)\/",
        "SecondDeadline":"\/Date(1322002860000)\/",
        "EndDate":"\/Date(1322168400000)\/"
    }
}

Теперь мне нужно сравнить FirstDeadline с SecondDeadline, и поэтому в моем JavaScript есть фрагмент, подобный этому

var date1 = eval(data.d.FirstDeadline.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));
var date2 = eval(data.d.SecondDeadline.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));
if (date1 === date2) {
    ...
}

К сожалению, сравнение не работает, даже если даты имеют одинаковое значение. Любая помощь?

ОБНОВЛЕНИЕ 1

Я забыл упомянуть, что мне нужно сравнивать только часть даты (поэтому я не сравниваю миллисекунды с той эпохи).

Ответы [ 7 ]

4 голосов
/ 23 ноября 2011

Вы можете сделать

if(date1.toDateString() === date2.toDateString()) {
3 голосов
/ 23 ноября 2011

Попробуйте сравнить их значения времени (миллисекунды с начала эпохи):

if (date1.getTime() === date2.getTime()) {
  // OK
}

[Изменить]

Если вы только заботитесь о дате, а не о времени, тогда будет работать что-то вроде этого:

function sameDate(d1, d2) {
  return ((d1.getFullYear() === d2.getFullYear())
       && (d1.getMonth() === d2.getMonth())
       && (d1.getDate() === d2.getDate()));
}
if (sameDate(date1, date2)) {
  // OK
}
2 голосов
/ 23 ноября 2011

Прежде всего, ваше сравнение в случае неудачи, потому что оператор === ищет абсолютное равенство.Но вы создаете два разных даты объектов .Сравнение объектов даты - это не то же самое, что сравнение простого значения, такого как число.Таким образом, === всегда будет неудачным, даже если даты представляют одно и то же значение.

var a = new Date(100000);
var b = new Date(100000); 
console.log(a === b); // false
console.log(a.getTime() === b.getTime()); // true

var a = new Date(100000);
var a = b;
console.log(a === b); // true

Во-вторых, если вы захватываете числовую часть этого значения (значение эпохи в миллисекундах),на самом деле не нужно создавать новый объект Date для их сравнения.Почему бы просто не сравнить числа друг с другом напрямую?

РЕДАКТИРОВАТЬ: В соответствии с вашим редактированием, если вы просто хотите сравнить часть "дата":

 if(date1.getDay() === date2.getDay() && date1.getMonth() === date2.getMonth() && date1.getFullYear() === date2.getFullYear()){ 
 }
2 голосов
/ 23 ноября 2011

Попробуйте использовать getTime метод объекта Date для сравнения дат.что-то вроде этого, которое будет сравнивать временные тики

0 голосов
/ 23 ноября 2011

Вы можете использовать JSON.parse вместо eval и использовать reviver для построения дат, как описано здесь: Как использовать параметр reviver JSON.parse для разбора строки даты

Если вы знаете, что JSON получен из надежного источника, вы можете изменить

.replace(/\/Date\((\d+)\)\//gi, "new Date($1)")

на

.replace(/\/Date\((\d+)\)\//gi,
         function (_, n) { return new Date(+n); })

, который использует замену на функцию заменителя для создания нового объекта даты, чей миллисэпоха - это числовое значение из группы 1.

0 голосов
/ 23 ноября 2011

Вы должны преобразовать их в объект Date в формате javascript, например:

var d = new Date();
d.setTime(1321743660000);

тогда вы можете сравнить. См. http://www.w3schools.com/jsref/jsref_obj_date.asp для получения дополнительной информации

0 голосов
/ 23 ноября 2011

Прежде всего, когда у вас есть «Дата (1322002860000)», числовая часть - это количество миллисекунд с начала эпохи.

Что вам нужно сделать:* Вы также можете использовать более продвинутый конвертер эпох, что-то вроде того, что они там делают: http://www.esqsoft.com/javascript_examples/date-to-epoch.htm

Надеюсь, это поможет!

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