使用 JavaScript 从字符串中提取和解析日期时出现问题

Issue with extracting and parsing date from a string using JavaScript

提问人:jessiepinkman 提问时间:7/9/2023 最后编辑:Peter Mortensenjessiepinkman 更新时间:7/11/2023 访问量:70

问:

我目前正在开发一个 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

JavaScript jQuery 日期 解析

评论


答:

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
那是个错别字。日期是欧洲格式,所以骗子不太适合这个