我有来自日期选择器的日期,我正在访问 -
var transdate = $j("input[name='enterdate']").val();
导致transdate = "6/22/2015"
我需要测试输入的日期是否在定义为的两个日期之间
startdate = '2015-02-01'
和enddate = '2015-07-30'
如何在以下代码中转换yyyy-mm-dd格式的transdate -
if ((new Date('transdate')>= startdate ) && (new Date('transdate') <= enddate )) {
alert("correct date entered");
}
答案 0 :(得分:8)
Moment.js是一个方便的日期库,可以轻松实现。
moment('6/22/2015', 'M/D/YYYY')
.isBetween('2015-02-01', '2015-07-30'); // => true
请注意,只有第一个(美国格式)日期字符串需要提供显式格式字符串。
时刻可以单独用于解析,例如。即使没有使用isBetween
:
var transdate = moment('6/22/2015', 'M/D/YYYY').toDate();
var startdate = moment('2015-02-01').toDate();
var enddate = moment('2015-07-30').toDate();
transdate >= startdate && transdate <= enddate // => true
答案 1 :(得分:7)
字符串不是唯一的格式defined to be handled by the Date
object。这意味着你必须解析它(使用正则表达式或String#split
或其他),或使用像MomentJS这样的库来解析它。解析完日期后,您可以将其与<
或>
等进行比较。
不要依赖Date
来解析未定义解析的字符串。您将遇到无法工作的实现或区域设置。
"6/22/2015"
是微不足道的:
var rex = /^(\d+)\/(\d+)\/(\d+)$/;
var match = rex.exec(transdate);
var dt = match ? new Date(+match[3], +match[1] - 1, +match[2]) : null;
使用接受日期部分的Date
构造函数作为单独的数字参数(年,月,日)。 +
将字符串转换为数字。 [x]
是正则表达式中的捕获组。您必须从月中减去一个因为几个月以JavaScript中的0
开头。
答案 2 :(得分:4)
许多次问过类似的问题,但我似乎无法找到重复的问题。鉴于Date构造函数不可靠地解析字符串,最简单的解决方案是自己解析字符串:
function parseMDY(s) {
var b = s.split(/\D/);
return new Date(b[2], b[0]-1, b[1]);
}
答案 3 :(得分:3)
以下是您输出的JSFIDDLE。
Moment.js将为您提供良好的编码灵活性。
别忘了在你的HTML中添加jquery和moment.js
var transdate="6/22/2014";
var convertStringToValidDate = new Date(transdate);
$(document).ready(function(){
$("#selectedDate").text(transdate);
$("#validDate").text(convertStringToValidDate);
converttoformat = moment(convertStringToValidDate).format("YYYY-MM-DD");
$("#converttoyyyymmdd").text(converttoformat);
if(moment(converttoformat).isBetween('2015-02-01', '2015-07-30')){
$("#result").text("Date lies in between");
}
else{
$("#result").text("Date is out of scope");
}
});