2016-08-12 3 views
7

Я наткнулся на, казалось бы, авторитетный источник странных манипуляций с датами, которые я не понимаю. Это часть образцов в сопроводительной документации для популярных рамках пользовательского интерфейса:Javascript странная манипуляция датами

var startDate = start.value(); // returns Date object 
startDate = new Date(startDate); 
startDate.setDate(startDate.getDate()); 

Теперь построчно var startDate = start.value(); эти строки возвращает объект Date и сохраняет его в startDate переменной. Отлично, не проблема.

Затем мы создаем новый объект Date с тем же значением и присваиваем его той же переменной (слегка запутанной, но я могу жить с ней).

Третья строка - настоящая головоломка - мы получаем день месяца (через getDate) и назначаем его как день месяца (через setDate) в той же переменной.

Теперь вопрос: это плохой код, возможно, остатки от незавершенного рефакторинга? Или это действительно имеет смысл, и он делает некоторые манипуляции, как удаление времени (не похоже на это)? Если да, то что он делает?

UPD: образец кода здесь http://demos.telerik.com/kendo-ui/datepicker/rangeselection

+1

Этот код устаревшего для определенного браузера? Помимо этого варианта я не могу придумать никаких возможных причин для этого. – Nit

+0

@Nit code sample - ничего о наследии или браузерах – trailmax

+0

Появляется (по крайней мере, когда я запускаю его в консоли Chrome) для создания нескольких новых объектов даты. Если нет конкретной цели, то этот код на самом деле довольно неэффективен. –

ответ

3

Источник доступен в различных форматах, и если мы исследуем их все:

html5/JavaScript:

startDate.setDate(startDate.getDate()); 

жереха.нетто:

startDate.setDate(startDate.getDate() + 1); 

JSP:

startDate.setDate(startDate.getDate() + 1); 

PHP:

startDate.setDate(startDate.getDate() + 1); 

Мы можем ясно видеть, первый (тот, который вы связаны с) выделяется, где они должны быть одинаковыми. Это привело бы к тому, что проблема была простой опечаткой.

+0

ОК, тогда в последней строке нет магии. Уф! – trailmax

2

Едем построчно:

startDate = new Date(startDate); 

возвращает ту же дату, если startDate является Date

var someDate = new Date(5555555113); 
 
console.log(someDate); 
 
startDate = new Date(someDate); 
 
console.log(startDate);

Но если start.value() возвращает либо милисекунд, или строка, передавая ее new Date обеспечит любой из этих 3-х способов представлять Date используется, вы получите Date объект.

var someDate = 5555555113; 
 
var startDate = new Date(someDate); 
 
console.log(startDate); 
 

 
someDate = "1970-03-06T07:12:35.113Z"; 
 
startDate = new Date(someDate); 
 
console.log(startDate);

Теперь следующая строка:

startDate.setDate(startDate.getDate()); 

Это не имеет никакого смысла, так как это будет возвращать тот же Date

var startDate = new Date(); 
 
console.log(startDate); 
 
startDate.setDate(startDate.getDate()) 
 
console.log(startDate);

+0

Хорошая мысль о преобразовании из строки или миллисекунды! – trailmax

Смежные вопросы