首页 > 解决方案 > Javascript 添加今天的天数、周数或月数

问题描述

我有一段代码可以清理浏览器的本地存储。
我想要的是根据设置的参数删除一些键。
一个例子: 这应该做的是在每个月的第一天删除本地存储。另一个例子是当您填写 5、2、周时。然后它应该每 2 周的第 5 天删除一次本地存储。 现在的主要问题是将不同的时期添加到今天的日期,以便计算需要完成的时间。我一直对此感到头疼并尝试了一些事情(如您所见)但没有结果...... 有人愿意帮助我吗? 谢谢!







这是代码:

function cleanLocalStorage() {
  var today = makeDate(todayDate()),
    deleteoption = localStorage.getItem("historydeleteoption"),
    lasthistoryclean = makeDate(localStorage.getItem("lasthistoryclean"));

  if (deleteoption == "days") {
    for (key in localStorage) {
      if (makeDate(key) < today.subtractDays(getHistoryRetain())) // days to keep data excluding today
        delete localStorage[key];
    }
  } else if (deleteoption == "period") {
    var historyretain = localStorage.getItem("historyretain"),
      historyresetday = localStorage.getItem("historyresetday"),
      historyresetperiod = localStorage.getItem("historyresetperiod"),
      historyresetperiodunit = localStorage.getItem("historyresetperiodunit"),
      cleaningday = "";

    if (historyresetperiodunit == "days") { ?
      // ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
    } else if (historyresetperiodunit == "weeks") { ?
      //  ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
      var cleaningday = lasthistoryclean + (historyresetperiod * 7);
    } else if (historyresetperiodunit == "months") { ?
      // ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
      var cleaningday = new Date(lasthistoryclean.setMonth(lasthistoryclean.getMonth() + historyresetperiod));
    }
  }
  localStorage.setItem("lasthistoryclean", todayDate());
}

function todayDate() {
  var date = new Date();

  var dd = ('0' + date.getDate()).slice(-2),
    mm = ('0' + (date.getMonth() + 1)).slice(-2), //jan is 0
    yyyy = date.getFullYear();

  return dd + "-" + mm + "-" + yyyy;
}

function makeDate(date) {
  var parts = date.split("-");
  return new Date(parts[2], parts[1] - 1, parts[0]);
}
<p>
  <input type="radio" name="historydeleteoption" id="historydeleteoptiondays" value="days" onchange="greyOutHistoryDeleteOption()" checked="checked">
  <label for="historydeleteoptiondays" id="historydeleteoptiondayslabel">Max days to keep history: 
    <input type="number" name="historyretain" id="historyretain" value="30" min="0" max="999" style="width: 70px; margin: 2px 0;"><br>
  </label>
  <input type="radio" name="historydeleteoption" id="historydeleteoptionperiod" value="period" onchange="greyOutHistoryDeleteOption()">
  <label for="historydeleteoptionperiod" id="historydeleteoptionperiodlabel">Reset history on day 
    <input type="number" name="historyresetday" id="historyresetday" value="1" min="1" max="31" style="width: 70px; margin: 2px 0;"> of every 
    <input type="number" name="historyresetperiod" id="historyresetperiod" value="4" min="1" style="width: 70px; margin: 2px 0;">
    <select name="historyresetperiodunit" id="historyresetperiodunit" onchange="maxValuesDeleteOption()" style="margin: 2px 0;">
      <option value="days">days</option>
      <option value="weeks">weeks</option>
      <option value="months">months</option>
    </select>
  </label>
</p>

标签: javascriptdatedatetimedate-arithmetic

解决方案


我创建了这个紧凑的功能:

function DateAdd(dfrom,anz,sel){
    var df = (dfrom || dfrom === 0) ? (typeof dfrom == "string" ? dfrom.replace(/(\d{1,2})\.(\d{1,2})\./,'$2/$1/') : dfrom) : "";
    df = df instanceof Date ? new Date(df-0) : (df === "" ? new Date() : new Date(df));
    var pj = {y:[1,"FullYear"],m:[1,"Month"],w:[7,"Date"],d:[1,"Date"],h:[3600000],n:[60000],s:[1000],ms:[1]};
    var s=pj[sel] || [1];
    var s1 = s[1] || "Time";
    df["set"+s1](df["get"+s1]() + parseInt(anz||0,10) * s[0]);
    return df;
}

anz 参数也允许使用负数。

这些值对于 sel 参数是可能的:

  • 'y' - 年
  • 'm' - 月
  • 'w' - 周
  • 'd' - 天
  • 'h' - 小时
  • 'n' - 分钟
  • 's' - 秒
  • 'ms' - 毫秒

使用示例

//Add 3 Days to current Date
var date = DateAdd(new Date, 3, 'd');

//2 weeks after 2019-03-01
var date = DateAdd('2019-03-01', 2, 'w');
//Fri Mar 15 2019

//6 month after 1.3.2019
var date = DateAdd('1.3.2019', 6, 'm');
//Sun Sep 01 2019

推荐阅读