提问人:jessiepinkman 提问时间:7/9/2023 最后编辑:Peter Mortensenjessiepinkman 更新时间:7/11/2023 访问量:70
使用 JavaScript 从字符串中提取和解析日期时出现问题
Issue with extracting and parsing date from a string using JavaScript
问:
我目前正在开发一个 JavaScript 函数,该函数从字符串中提取日期,然后对其进行解析以设置日期过滤器的开始和结束日期。但是,我遇到了日期解析部分的问题。
$("#startDateF").data("initialValue", startDateString);
$("#endDateF").data("initialValue", endDateString);
这些行用于重置按钮函数,该函数将检索这些值并将日期筛选器的当前值设置回 initialValues。
代码如下:
var cDate = dText.match(/\d{2}-\d{2}-\d{4}/)[0];
console.log(cDate);
let initialStartDate = new Date(cDate);
let initialEndDate = new Date(initialStartDate.getFullYear(), initialStartDate.getMonth() + 1, initialStartDate.getDate());
startDateString = formatDate(initialStartDate);
endDateString = formatDate(initialEndDate);
$("#startDateF").data("initialValue", startDateString);
$("#endDateF").data("initialValue", endDateString);
function formatDate(date) {
let day = ("0" + date.getDate()).slice(-2);
let month = ("0" + (date.getMonth() + 1)).slice(-2);
let year = date.getFullYear();
return day + "-" + month + "-" + year;
}
我尝试使用 formatDate 函数来格式化日期,但似乎它无法正常工作。当我使用此方法时,它将 startDate 和 endDate 设置为 aN-aN-NaN。我希望 startDate 设置为 cDate,endDate 设置为相同的日期,但在下个月。例如,cDate = 16-04-2023 startDate = 16-04-2023 endDate = 16-05-2023
答:
0赞
jasjastone
7/9/2023
#1
除了解析变量时,您的代码上没有任何问题 JavaScript 中的 Date 构造函数不直接接受格式为“dd-mm-yyyy”的日期字符串。若要从自定义日期字符串创建 Date 对象,需要分析各个日、月和年组件,并按适当的顺序将它们作为参数传递给构造函数。initialStartDate
所以基本上你可以添加这个
var day = parseInt(cDate.split('-')[0], 10);
var month = parseInt(cDate.split('-')[1], 10);
var year = parseInt(cDate.split('-')[2], 10);
let initialStartDate = new Date(year, month, day);
并且会很好用
这是完整的代码
var cDate = dText.match(/\d{2}-\d{2}-\d{4}/)[0];
console.log(cDate);
var day = parseInt(cDate.split('-')[0], 10);
var month = parseInt(cDate.split('-')[1], 10);
var year = parseInt(cDate.split('-')[2], 10);
let initialStartDate = new Date(year, month, day);
let initialEndDate = new Date(initialStartDate.getFullYear(), initialStartDate.getMonth() + 1, initialStartDate.getDate());
startDateString = formatDate(initialStartDate);
endDateString = formatDate(initialEndDate);
$("#startDateF").data("initialValue", startDateString);
$("#endDateF").data("initialValue", endDateString);
function formatDate(date) {
let day = ("0" + date.getDate()).slice(-2);
let month = ("0" + (date.getMonth() + 1)).slice(-2);
let year = date.getFullYear();
return day + "-" + month + "-" + year;
}
我希望它能:D
评论
0赞
jessiepinkman
7/9/2023
这个解决方案确实有效,但它打印了initialStartDate和endDate的值,如下所示initialStartDate = Sun Apr 16 2023 00:00:00 GMT 5:30 (IST) {}, year=2023 , month =3, day = 16 这导致日期在格式化时未定义,所以我使用了这个 var [day, month, year] = cDate.split('-').map(Number);
0赞
jasjastone
7/10/2023
所以我相信在拆分变量后,您可以在日期构造函数中解析它们,这是我首先告诉您的,如果是这样,请接受我的回答 🥺
0赞
jessiepinkman
7/11/2023
我的声誉低于 15,所以我无法投票。我也需要这个问题的帮助 - 链接
2赞
mplungjan
7/9/2023
#2
假设你的 cDate 是 dd-mm-yyyy,那么我建议这个简化的脚本
const formatDate = d => d.toJSON().slice(0, 10).split('-').reverse().join('-')
const getDates = dText => {
let initialStartDate = dText.match(/\d{2}-\d{2}-\d{4}/)[0]; // no validation
const [dd, mm, yyyy] = initialStartDate.split("-");
let initialEndDate = new Date(yyyy, mm, dd, 15, 0, 0, 0); // not subtracting 1 from the 0 based month gives us next month - ignoring the fact that 31st of Feb will be 2 or 3rd of March
return {
startDate: initialStartDate,
endDate: formatDate(initialEndDate)
}
};
let dateStrings = getDates("16-04-2023");
$("#startDateF").text(dateStrings.startDate); // change to data() after testing
$("#endDateF").text(dateStrings.endDate);
// test to show the rollover:
dateStrings = getDates("31-01-2020");
console.log(dateStrings)
dateStrings = getDates("31-02-2020"); // this is an invalid date, we do not handle that in the above script
console.log(dateStrings)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<span id="startDateF"></span>
<span id="endDateF"></span>
评论
1赞
RobG
7/11/2023
“16-14-2023”肯定应该返回无效日期或抛出错误吗?还有 JavaScript 函数可以在日期中添加 X 个月。
0赞
mplungjan
7/11/2023
那是个错别字。日期是欧洲格式,所以骗子不太适合这个
评论