【发布时间】:2020-07-20 17:25:48
【问题描述】:
我有一个格式为 mm/dd/yy 的日期,并想在其上增加 30 天。我只是好奇最好的方法来做到这一点?我是 javascript 新手,所以示例会有所帮助。
已编辑
对不起,我使用的是美国日期格式mm/dd/yy。
【问题讨论】:
标签: javascript date
我有一个格式为 mm/dd/yy 的日期,并想在其上增加 30 天。我只是好奇最好的方法来做到这一点?我是 javascript 新手,所以示例会有所帮助。
已编辑
对不起,我使用的是美国日期格式mm/dd/yy。
【问题讨论】:
标签: javascript date
将 30 天添加到日期字符串的一种方法是将其解析为日期,添加 30 天,然后将其格式化回字符串。
应使用定制函数或库手动解析日期字符串。无论哪种方式,您都需要知道格式才能知道它是否被正确解析,例如
// Given a string in m/d/y format, return a Date
function parseMDY(s) {
var b = s.split(/\D/);
return new Date(b[2], b[0]-1, b[1]);
}
// Given a Date, return a string in m/d/y format
function formatMDY(d) {
function z(n){return (n<10?'0':'')+n}
if (isNaN(+d)) return d.toString();
return z(d.getMonth()+1) + '/' + z(d.getDate()) + '/' + d.getFullYear();
}
// Given a string in m/d/y format, return a string in the same format with n days added
function addDays(s, days) {
var d = parseMDY(s);
d.setDate(d.getDate() + Number(days));
return formatMDY(d);
}
[['6/30/2018', 30],
['1/30/2018', 30], // Goes from 30 Jan to 1 Mar
['12/31/2019', 30]].forEach(a => {
console.log(`${a[0]} => ${addDays(...a)}`);
});
如果将“30 天”标准解释为添加一个月,那就有点棘手了。将 1 个月添加到 1 月 31 日将得到 2 月 31 日,根据该年的 2 月是 28 天还是 29 天,它会解析为 3 月 2 日或 3 日。解决该问题的一种算法是查看该月是否过时并将日期设置为上个月的最后一天,因此 2018-01-31 加上一个月会得到 2018-02-28。
同样的算法适用于减去月份,例如
/**
* @param {Date} date - date to add months to
* @param {number} months - months to add
* @returns {Date}
*/
function addMonths(date, months) {
// Deal with invalid Date
if (isNaN(+date)) return;
months = parseInt(months);
// Deal with months not being a number
if (isNaN(months)) return;
// Store date's current month
var m = date.getMonth();
date.setMonth(date.getMonth() + months);
// Check new month, if rolled over an extra month,
// go back to last day of previous month
if (date.getMonth() != (m + 12 + months)%12) {
date.setDate(0);
}
// date is modified in place, but return for convenience
return date;
}
// Helper to format the date as D-MMM-YYYY
// using browser default language
function formatDMMMY(date) {
var month = date.toLocaleString(undefined,{month:'short'});
return date.getDate() + '-' + month + '-' + date.getFullYear();
}
// Some tests
[[new Date(2018,0,31), 1],
[new Date(2017,11,31), 2],
[new Date(2018,2,31), -1],
[new Date(2018,6,31), -1],
[new Date(2018,6,31), -17]].forEach(a => {
let f = formatDMMMY;
console.log(`${f(a[0])} plus ${a[1]} months: ${f(addMonths(...a))}`);
});
当然,库可以帮助解决上述问题,算法是一样的。
只需在今天的日期加上 30 天:
var now = new Date();
now.setDate(now.getDate() + 30);
但是,这真的是你想做的吗?或者你想得到今天再加一个月?
您可以使用以下方法将 d/m/y 日期转换为日期对象:
var dString = '9/5/2011';
var dParts = dString.split('/');
var in30Days = new Date(dParts[2] + '/' +
dParts[1] + '/' +
(+dParts[0] + 30)
);
对于美国日期格式,交换部分 0 和 1:
var in30Days = new Date(dParts[2] + '/' +
dParts[0] + '/' +
(+dParts[1] + 30)
);
但最好在将日期提供给函数之前将其转换为 ISO8601 格式,你真的不应该在同一个函数中混合日期解析和算术。一个全面的日期解析函数很复杂(不过分,但它们冗长乏味,需要大量测试),一旦有了日期对象,算术就很简单了。
【讨论】:
Date 构造函数
完成它的一种简单方法是在Date 构造函数中发送时间戳值。以时间戳计算 30 天:
30 * 24 * 60 * 60 * 1000
那么,你需要当前的时间戳:
Date.now()
最后,将两个值相加并将结果作为参数发送到构造函数中:
var nowPlus30Days = new Date(Date.now() + (30 * 24 * 60 * 60 * 1000));
【讨论】:
date.setDate(date.getDate() + 30) 要好得多,打字也更少。 :-)
试试
new Date(+yourDate - 30 *86400000)
var yourDate = new Date()
var newDate = new Date(+yourDate - 30 *86400000)
console.log(newDate)
【讨论】:
反应答案
某些 Javascript 命令在 React 中不可用,例如 getDate()。此外,我发现将日期更改为 Unix 时间戳会更好,这样我就可以使用简单的数学大于搜索在数据库搜索中更轻松地比较日期。
const nowPlus30Days = new Date(Date.now() + (30 * 24 * 60 * 60 * 1000)).getTime() / 1000;
(1597829050.184)
我可以把这个和今天比较一下:
const today = new Date().getTime() / 1000
(1595237050.184)
【讨论】: