【问题标题】:Adding 1 or 2 days to a date string向日期字符串添加 1 或 2 天
【发布时间】:2011-08-10 15:47:17
【问题描述】:

我有一个字符串,可能是date = "10/08/2011"; 英文时间样式。

它是一个普通字符串,所以我需要能够添加 1 或 2 天。

我尝试了一些方法,但无法解决,因为我通常是 PHP 人而不是 JavaScript。

非常感谢任何帮助。

谢谢

更新

为什么这似乎很难,我已经坚持了一个小时......我想给代码一个纯字符串,即 mm/dd/yyyy - 10/08/2011我想要回来像 11/08/2011

为什么这么难??这就是为什么我讨厌 javascript 而更喜欢 PHP :-(

【问题讨论】:

标签: javascript date


【解决方案1】:

没那么复杂:

//convert string to date
var dattmp = "10/08/2011".split('/').reverse().join('/');
var nwdate =  new Date(dattmp);

// to add 1 day use:
nwdate.setDate(nwdate.getDate()+1);

//to retrieve the new date use
[nwdate.getDate(),nwdate.getMonth()+1,nwdate.getFullYear()].join('/');

//all in one:
function dateAddDays( /*string dd/mm/yyyy*/ datstr, /*int*/ ndays){
  var dattmp = datstr.split('/').reverse().join('/');
  var nwdate =  new Date(dattmp);
  nwdate.setDate(nwdate.getDate() + (ndays || 1));
  return [ zeroPad(nwdate.getDate(), 10)
          ,zeroPad(nwdate.getMonth()+1, 10)
          ,nwdate.getFullYear() ].join('/');
}

//function to add zero to date/month < 10
function zeroPad(nr, base){
  var len = (String(base).length - String(nr).length) + 1;
  return len > 0? new Array(len).join('0') + nr : nr;
}

//examples
console.log(dateAddDays("10/08/2011"));     //=> 11/08/2011
console.log(dateAddDays("10/08/2011", -5)); //=> 05/08/2011

如果你真的想要简单 - 不使用日期对象:

var datePlus1 = '10/08/2011'.split('/');
datePlus1[0] = Number(datePlus1[0])+1;
console.log(datePlus1.join('/')); //=> 11/08/2011

这是一个将日期(-时间)字符串转换为日期的小函数:

const log = Logger(document.querySelector(`pre`));
log(
  `<code>str2Date(\`3/15/2013T12:22\`, \`mdy\`)</code>\n  &gt; ${
    str2Date(`3/15/2013T12:22`, `mdy`)}`,
  `<code>str2Date(\`15-2013-03 12:22\`, \`dym\`)\</code>\n  &gt; ${
    str2Date(`15-2013-03 12:22`, `dym`)}`,
  `<code>str2Date(\`15/3/2013\`, \`dmy\`)</code>\n  &gt; ${
    str2Date(`15/3/2013`, `dmy`)}`,
  `<code>str2Date(\`2013/03/15\`)</code>\n  &gt; ${
    str2Date(`2013/03/15`)}` );

function str2Date(dateStr, ymd = `ymd`) {
  ymd = [...ymd].reduce( (acc, v, i) => ({...acc, [v]: i}), {} );
  const dt = dateStr.split(/[ T]/);
  const [d, t] = [ dt[0].split(/[/-]/), dt[1] ];
  return new Date( `${d[ymd.y]}-${d[ymd.m]}-${d[ymd.d]} ${t || ``}` );
}

function Logger(logEl) {
  return (...args) => {
    args.forEach(arg =>
      logEl.appendChild(
        Object.assign(document.createElement(`div`), {
          innerHTML: `${arg}`,
          className: `logEntry`
        })
      ))
  };
}
body {
  font: normal 12px/16px verdana, arial;
}

.logEntry {
  margin: 5px 0;
}

.logEntry:before {
  content: '• ';
  vertical-align: middle;
}

code {
  background-color: #eee;
  color: green;
  padding: 1px 2px;
}
&lt;pre&gt;&lt;/pre&gt;

【讨论】:

  • 非常感谢 Kooilnc,这正是我要找的
  • 请注意,如果您跨越一个月或一年的过渡期,上述简单的解决方案将不起作用。你真的很想使用 Date 对象...
  • @Mike,当然——这就是为什么使用日期对象是有意义的。我建议不要使用datePlus1 解决方案,但这是有可能的。
  • 加法的优先级高于逻辑或,所以你需要一些括号:nwdate.setDate(nwdate.getDate() + (ndays||1));
  • 这是一种过于复杂的方法,甚至还没有完成一半,尤其是处理特定日期格式的硬编码部分。
【解决方案2】:

要增加 2 天:

var theDate = new Date("10/28/2011");
theDate.setDate(theDate.getDate()+2);

【讨论】:

  • 从外观上看,这只是给了我unix时间戳:-(
  • 要得到一个字符串,你可以做var theDateString = (theDate.getMonth()+1) + '/' + theDate.getDate() + '/' + theDate.getUTCFullYear();
【解决方案3】:

您必须强制将字符串解释为日期-月-年或月-日期-年,否则将取决于用户的设置。

您可以从字符串中组装日期以确保日期-月份格式:

Date.fromDM=function(string){
    var A= string.match(/([1-9]\d*)/g);
    if(A.length!== 3) throw 'bad date'; 
    return new Date(A[2]*1, A[1]-1, A[0]*1);
}
Date.fromMD=function(string){
    var A= string.match(/([1-9]\d*)/g);
    if(A.length!== 3) throw 'bad date'; 
    return new Date(A[2]*1, A[0]-1, A[1]*1);
}



/*  Date.fromDM('10,08,2011')
return value: (Date)
Wed Aug 10 2011 00:00:00 GMT-0400 (Eastern Daylight Time)
*/

/*Date.fromMD('10,08,2011')
return value: (Date)
Sat Oct 08 2011 00:00:00 GMT-0400 (Eastern Daylight Time)
*/

【讨论】:

    【解决方案4】:

    试试这个

    var date =  new Date("10/08/2011");
    
    date = new Date(date.setDate(date.getDate()+1));//1 represents 1 day to add so you specify as per your need
    
    var dateStr = date.getDay() + '/' + (date.getMonth() + 1) + '/' + date.getUTCFullYear();
    

    【讨论】:

    • 从外观上看,这只是给了我unix时间戳:-(
    • argh - 如此接近,但我需要能够以欧洲风格做到这一点...... dd/mm/yyyy 有什么想法吗?
    • 您可以尝试使用子字符串的方法(编辑到我的答案中)。它切换日和月。另一方面,来自 Kooilnc 的那个也应该可以正常工作,它会反转字符串,如果您使用欧洲日期,则将其转换为有效格式。
    • @ShankerSangoli - 这只是给了我 0/10/2011 - 我正要放弃
    • @Lee: 之前用一个简单的函数转换String就好了。我或 Kooilnc 的解决方案应该可以正常工作以将其转换为正确的格式 -> jsfiddle.net/4W8yM/2
    【解决方案5】:

    您需要将字符串转换为日期对象。 有了这个,你可以调用 .getDate() 和 setDate() - 函数来修改日期。

    但要实现这一点,日期必须采用以下格式之一:

    1. MM/dd/yyyy
    2. yyyy/MM/dd
    3. MM-dd-yyyy
    4. MMMM dd, yyyy
    5. MMM dd, yyyy

    因此,也许您必须在转换之前在字符串中切换日期和月份,因为我不确定 Month 或 Day 是您的第一个数字。

    对于欧洲日期,您可以将字符串更改为正确的格式,如下所示:

    var date = "10/08/2011";
    var eurDate = date.substr(3,2) + "/" + date.substr(0,2) + "/" + date.substr(6);
    

    可以帮助您的链接:

    http://programming.top54u.com/post/Javascript-Convert-String-to-Date.aspx

    http://www.adp-gmbh.ch/web/js/date/add_days.html

    编辑:

    JSFiddle 举个例子: http://jsfiddle.net/4W8yM/11/

    【讨论】:

      【解决方案6】:

      我试过了,得到了结果。

      var dat = new Date('2018-03-16');
      
      //use toISOString() to get the string value 2018-03-16T16:38:00.000Z
      //substring(0,10) gets 2018-03-16
      //reverse to gets 16-03-2018
      var ret = dat.toISOString().substring(0, 10).split('-').reverse()
      
      //rearranging to whatever format you want
      var t = ret[0];
      ret[0] = ret[1];
      ret[1] = t;
      
      //result
      console.log(ret.join('/'))

      【讨论】:

        猜你喜欢
        • 2014-04-28
        • 1970-01-01
        • 2012-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-01
        相关资源
        最近更新 更多