添加分钟到日期(javascript)无效的日期

时间:2014-06-06 14:48:25

标签: javascript date

我有这个功能在javascript中添加分钟到日期

  function addMinutes(date, minutes) {
            var DateObject = new Date(date);
            var modifiedDate =  DateObject.getTime() + minutes * 60000;
            return date = modifiedDate;
        }   

该脚本在我的大多数页面上都能正常运行,但在我正在处理的当前页面上我已经有了这个日期:2014-06-07 01:00:00

这只适用于谷歌浏览器..我喜欢IE / Safari等浏览器无法使用YYYY / MM / DD格式。

我试图用Date解析它,但这对我来说有点新鲜,我不确定我做错了什么。

2 个答案:

答案 0 :(得分:1)

这是原始的固定副本,已实施建议:

  function addMinutes(date, minutes) {
            var DateObject = new Date(String(date).replace(/\ /g,"T")+"Z"),
            modifiedDate = DateObject.getTime() + 
                 (minutes* 60000) + 
                 (new Date(DateObject).getTimezoneOffset()*60*1000) ;
            return date = modifiedDate;
   }   

new Date(addMinutes("2014-06-07 01:00:00", 15)).toLocaleString();
// shows: "6/7/2014 1:15:00 AM"

答案 1 :(得分:1)

这里有两个不同的问题,你应该在心理上分开:

  1. YYYY-MM-DD hh:mm:ss的特定格式的字符串解析为Date个对象。
  2. Date对象添加分钟。
  3. 解析字符串

    您应该知道,将字符串传递给Date构造函数时的解析行为是特定于实现的,并且浏览器供应商之间的实现会有所不同。

    • 通常,当存在短划线(-)时,这些值将被视为UTC,并且当存在斜杠(-)时,这些值将被视为对于时区的本地值。代码正在运行。
    • 但是,这仅适用于时间不存在,或者日期和时间组件使用T而不是空格分隔时。 (YYYY-MM-DDThh:mm:ss
    • 当使用空格分隔日期和时间组件时,某些浏览器(如Chrome)会将其视为本地时间,但其他浏览器(如IE和Firefox)会将其视为无效日期。
    • T替换空格将允许解析日期,但如果这就是你所做的一切,那么Chrome会将其视为UTC,而IE和Firefox会将其视为当地时间。
    • 如果您还添加了尾随Z,(YYYY-MM-DDThh:mm:ssZ),则所有浏览器都会将其解析为UTC。
    • 如果您想要一种所有浏览器都会识别为本地时间的格式,那么只有一种格式,而且它不是ISO标准:YYYY/MM/DD hh:mm:ss。因此,您可以考虑:

      var s = "2014-06-07 01:00:00";
      var dt = new Date(s.replace(/-/g,'/'));
      

    添加分钟

    这更简单:

    dt.setMinutes(dt.getMinutes() + 15);
    

    这将简单地改变Date值以增加15分钟。不要担心溢出 - 如果getMinutes返回55,设置70分钟将正确添加1小时10分钟。

    更好的解决方案

    Moment.js消除了解析变体的所有猜测,并为您提供了更清晰的API。考虑:

    // parse a string using a specific format
    var m = moment("2014-06-07 01:00:00","YYYY-MM-DD HH:mm:ss");
    
    // adding time
    m.add(15, 'minutes');
    
    // format the output as desired, with lots of options
    var s = m.format("L h:mm:ss A");