javascript - 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>
解决方案
我创建了这个紧凑的功能:
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
推荐阅读
- wechat - 如何为微信小程序制作联系表
- asp.net-core - 具有多个身份验证方案的 SecurityTokenSignatureKeyNotFoundException
- azure - ServiceBusReceivedMessage 的单元测试
- html - 为什么我的导航栏按钮不起作用(我只是一个初学者,对不起......)
- microsoft-graph-api - Microsoft 图形标题值“HonorNonIndexedQueriesWarningMayFailRandomly”
- mongodb - 如何在 mongodb 中更新此订单状态?这里一个订单 ID 和产品在一个数组中,并且在产品对象内部它包含状态
- node.js - 如何将前端组件中的数据格式化为节点 js 中的特定格式?
- python - 使用 seaborn 绘制具有实际值与预测值的散点图
- java - Spring Data MongoDB:类型不能为空
- c++ - 无法在 Linux C++ 中读取串行数据:串行数据在通过 C++ 读取时被拆分