【问题标题】:Edit Date object Javascript编辑日期对象 Javascript
【发布时间】:2015-01-18 22:04:03
【问题描述】:

我正在尝试编辑 javascript 日期对象从系统时钟中检索日期的方式。我正在测试一个 Javascript 应用程序,这不是用于生产的更改,严格用于测试目的。

我想传递一个带有年、月和日的参数,并让日期对象检索它,而不是从系统时钟中获取日期。

创建一个新实例的问题是它会返回相同的日期而不用系统时钟更新时间。 IE。返回

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())

编辑: 我遇到的主要问题是我需要在我正在测试的窗口中打开控制台,并让它看起来是我想要的日期,而如果它不能保持秒数不变http://postimg.org/image/6hzjw4h7j/

编辑: 改变浏览器时间的解决方案如下

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

感谢大家的意见,希望这对其他人有所帮助。

【问题讨论】:

  • 为什么不获取一个具有系统日期和时间的普通 Date 对象,然后修改它的年、月、日字段?
  • 您不能在 JavaScript 中执行此操作 - 您可以: A) 重构被测代码以获取返回日期的函数或服务(因此您可以传入一个返回日期的模拟服务您想要的日期或 B) 更新实际的系统时钟
  • 我很想看看我能不能完成这项工作。完成后我会发布更新
  • 你只需要返回对象期望的所有可能的方法。
  • 你想做什么?您知道 JavaScript 中的 Date 对象允许您传递其构造函数参数,对吗? var myDate = new Date(year, month, day);developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

标签: javascript date object prototype


【解决方案1】:

我不确定这是否是你想要的。

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);

【讨论】:

  • 所以这行不通,因为创建实例会使分钟、秒等保持不变并且不会更新。即使调用 setInterval 也行不通。我尝试过这个解决方案,但失败了。不过谢谢。
【解决方案2】:

如果你有这样的<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

【讨论】:

  • Jut 意识到 @RocketHazmat 在上面的 cmets 中建议了这个解决方案。
【解决方案3】:

我不会涉及替换日期对象构造函数本身(如果这就是你的意思),但我认为这几乎就是你想要做的:

[已编辑 - 替换日期对象构造函数]:

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

【讨论】:

  • 所以是的,这更接近我正在寻找的内容,但我也在寻找当我在页面本身上打开控制台时,它会更新对象本身的日期叫。这是我尝试此操作时的样子postimg.org/image/k91lb4urn
  • 我已经编辑了我的答案以替换日期对象,这使它更简单。它使用对象的创建时间作为使用偏移量进行更新的时间参考。如果您想使用页面加载时间作为偏移量,请告诉我。我只是不确定这是否是你想要的。我编辑的小提琴位于jsfiddle.net/cbo495en/4
【解决方案4】:

经过一番思考,我决定添加另一个答案。在重新检查了您的帖子和 cmets 后,我想出了这个,我相信您会接受这个作为正确答案:

[更新:添加 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

【讨论】:

  • 令人惊讶的用例场景:newJSSystemDate({getTime: function() { return 0; }});
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
  • 2021-07-19
  • 2022-01-20
  • 1970-01-01
相关资源
最近更新 更多