2014-11-20 3 views
1

Я пытаюсь отредактировать способ объекта date даты javascript для получения даты из системных часов. Я тестирую приложение Javascript, и это не изменение, которое было бы для производства, строго для целей тестирования.Редактировать Дата объекта Javascript

Я хотел бы передать параметр с годом, месяцем и днем, и пусть объект даты получит, а не получает дату от системных часов.

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

Date {Fri Jan 20 2012 00:00:00 GMT+0700 (SE Asia Standard Time)} 
Date {Fri Jan 20 2012 00:00:00 GMT+0700 (SE Asia Standard Time)} 
Date {Fri Jan 20 2012 00:00:00 GMT+0700 (SE Asia Standard Time)} 
Date {Fri Jan 20 2012 00:00:00 GMT+0700 (SE Asia Standard Time)} 

Изменяя год, месяц и день, только, мне нужно держать минут, второй и т.д., чтобы обновить с системными часами и не быть статичным для целей тестирования.

Это то, что я делаю далеко, но не работал для меня.

Date = function (Date) { 
     return function() { 
      var date = new Date(); 
      date.setFullYear(%s) 
      date.setMonth(%s); 
      date.setDate(%s); 
      return date; 
     } 
    }(Date) 
    alert(new Date()) 

EDIT: Основная проблема с этим, что у меня есть мне нужно открыть консоль в окне, я тестирование и иметь это, как представляется, дату, которую я хочу время если он не держит секунды постоянной http://postimg.org/image/6hzjw4h7j/

EDIT: решение, которое работало изменить браузеры время выглядит следующим образом

 Date = function(Date){ 
      return function() { 
        date = new Date(); 
        date.setTime(date.getTime() - %d); 
        return date; 
      } 
     }(Date); 

Спасибо всем за их вклад и надеюсь, что это поможет другим.

+0

Почему бы не получить обычный объект Date, который будет иметь системную дату и время, а затем изменить его поля года, месяца, дня? – aa333

+0

Вы не можете сделать это в JavaScript - вы можете: A) реорганизовать тестируемый код, чтобы взять функцию или службу, которая возвращает дату (так что вы можете передать макет службы, которая возвращает нужную дату или B) Обновить фактические системные часы –

+0

Мне интересно узнать, смогу ли я сделать эту работу. Я опубликую обновление после завершения работы –

ответ

0

Я не уверен, что это то, что вы хотите.

function MyDate(year,month,day) { 
    var date = new Date(); 
    date.setFullYear(year); 
    date.setMonth(month); 
    date.setDate(day); 
    return date; 
} 

var myDate = new MyDate(1990,04,10); 

console.log(myDate); 
+0

Так что это не сработало бы из-за создания экземпляра, чтобы сохранить минуты, секунды и т. Д. Постоянными и не будет обновляться. Даже вызов setInterval на этом не сработает. Я попытался это решение, и это провалилось. Однако, спасибо. –

0

Если у вас есть <div> вроде этого:

<div id="mydate"></div> 

Вы можете обновить его непрерывно, как это:

var mydate = new Date('01/01/2015 00:00:55'); 
var el = document.getElementById('mydate'); 
setInterval(function(){ 
    mydate.setSeconds(mydate.getSeconds() + 1); 
    el.innerText=mydate.toLocaleString(); 
} , 1000); 

Вот fiddle.

+0

Jut понял, что это решение было предложено в комментариях выше от @RocketHazmat. –

0

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

[Изменено - заменить объект даты конструктор]:

Date = (function(Date) { 
    return function(y,m,d,h,min,s,mil) { 
     var newDateObj; 
     if(mil !== undefined) 
      newDateObj = new Date(y,m,d,h,min,s,mil); 
     else if(s !== undefined) 
      newDateObj = new Date(y,m,d,h,min,s); 
     else if(min !== undefined) 
      newDateObj = new Date(y,m,d,h,min); 
     else if(h !== undefined) 
      newDateObj = new Date(y,m,d,h); 
     else if(d !== undefined) 
      newDateObj = new Date(y,m,d); 
     else if(m !== undefined) 
      newDateObj = new Date(y,m); 
     else if(y !== undefined) 
      newDateObj = new Date(y); 
     else newDateObj = new Date(); 
     // Set up date object, offsets, and update function 
     var dateOffset = new Date().getTime()-newDateObj.getTime(); 
     var dateObject = new Date(new Date().getTime()-dateOffset); 
     var updateDateObj = function() { 
      dateObject.setTime(new Date().getTime()-dateOffset); 
      }; 
     // Either create a wrapper for all date/time functions to update: 
     var doGetTime = dateObject.getTime; 
     dateObject.getTime = function() { 
      updateDateObj(); 
      return doGetTime.call(dateObject); 
      }; 
     // Or do an update on interval (not reccommended): 
     window.setInterval(updateDateObj, 1); 
     return dateObject; 
     }; 
    }(Date)); 
var x = new Date(2014, 10, 20); 
window.setInterval(function() { 
    document.body.innerHTML = x; 
    }, 1000); 

Вы можете увидеть fiddle here. Вы можете увидеть edited fiddle here.

+0

Итак, да, это ближе к тому, что я ищу, но я также смотрю, что когда я открываю консоль на самой странице, она обновляет дату, когда вызывается сам объект. Вот как это выглядит, когда я пробовал это http://postimg.org/image/k91lb4urn/ –

+0

Я отредактировал свой ответ, чтобы заменить объект даты, который упрощает его. Он использует время создания объекта как временную ссылку для обновления со смещением. Если вы хотите использовать время загрузки страницы в качестве смещения, просто дайте мне знать. Я просто не уверен, что это то, чего ты хочешь. Мой отредактированный скрипт находится по адресу http://jsfiddle.net/cbo495en/4/ –

0

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

[UPDATE: Добавлен newJSSystemDate слой]

// set up newJSSystemDate with complicated scoping magic 
var newJSSystemDate = (function(actualDateObject){ 
    return function(newDate) { 
     // use actual date if new date is not specified 
     if(newDate === undefined) Date = actualDateObject; 
     // otherwise update global constructor for Date() 
     else Date = (function(Date) { // calculate offset 
      var dtOffset = new Date().getTime()-newDate.getTime(); 
      return function(y,m,d,h,min,s,mil) { 
       var newDateObj; 
       // handle all correct usages of Date() 
       if(mil !== undefined) 
        newDateObj = new Date(y, m, d, h, min, s, mil); 
       else if(s !== undefined) 
        newDateObj = new Date(y, m, d, h, min, s); 
       else if(min !== undefined) 
        newDateObj = new Date(y, m, d, h, min); 
       else if(h !== undefined) 
        newDateObj = new Date(y, m, d, h); 
       else if(d !== undefined) 
        newDateObj = new Date(y, m, d); 
       else if(m !== undefined) 
        newDateObj = new Date(y, m); 
       else if(y !== undefined) 
        newDateObj = new Date(y); 
       else // return calculated date object 
        newDateObj = new Date(new Date().getTime()-dtOffset); 
       return newDateObj; 
       }; 
      }(actualDateObject)); 
     }; 
    }(Date)); 
// set js time to a specific date/time 
newJSSystemDate(new Date(2014, 10, 20)); 
// check what Date() returns every second 
window.setInterval(function() { 
    document.body.innerHTML = new Date(); 
    }, 1000); 
// set js time back to normal after 10 seconds 
window.setTimeout(function() { 
    newJSSystemDate(); 
    }, 10000); 

Click here for the JSFiddle

+0

Удивительный сценарий использования: 'newJSSystemDate ({getTime: function() {return 0;}});' –

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