Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中的日期比较和验证_Javascript_Date - Fatal编程技术网

Javascript中的日期比较和验证

Javascript中的日期比较和验证,javascript,date,Javascript,Date,我需要验证所提到的日期是否应大于或等于当前日期。但这里的问题是,如果用户提供的是旧日期“03/11/0018”,那么默认情况下,该年将被视为2018年(根据以下代码)。 我所做的一种方法是获取输入数据并使用substring和handle(下面的代码中没有提到)获取年份。 还有别的办法吗 函数dateCompare(){ 变量d1=新日期('03/11/0018'); var d2=新日期(“2018年11月3日”);//考虑今天的日期是2018年11月3日 如果(d1使用新的日期(字符串)

我需要验证所提到的日期是否应大于或等于当前日期。但这里的问题是,如果用户提供的是旧日期“03/11/0018”,那么默认情况下,该年将被视为2018年(根据以下代码)。 我所做的一种方法是获取输入数据并使用substring和handle(下面的代码中没有提到)获取年份。 还有别的办法吗


函数dateCompare(){
变量d1=新日期('03/11/0018');
var d2=新日期(“2018年11月3日”);//考虑今天的日期是2018年11月3日
如果(d1
使用
新日期(字符串)
Date.parse(字符串)
,因为实现依赖于浏览器——正如您所发现的,通常有些不直观

您可以自己解析字符串,这样做很好,尤其是在格式定义良好的情况下

const re = /(\d\d)\/(\d\d)\/(\d\d\d\d)/;

const [whole, day, month, year] = re.exec('03/02/2018');
然后,如果您愿意,您可以使用这些数字构造一个
日期

const d = new Date(year, month - 1, day);
请注意,
Date
构造函数预期索引月份为零(即一月为
0

还请注意,
Date
将年份
0-99
映射到
1900-1999
。如果您不想这样做,则需要使用
Date.prototype.setFullYear
Date.prototype.getFullYear
强制执行。这是必要的,还是不必要的,并不十分一致:

const d = new Date(88, 1, 2);
console.log(d); // 1988-02-02T00:00:00.000Z

d.setFullYear(88);

console.log(d); // 0088-02-02T00:00:00.000Z
console.log(d.getYear()); // -1812
console.log(d.getFullYear()); // 88

这里有足够的陷阱,你应该考虑使用一个更干净的日期API的库。

< P>使用<代码>新的日期(字符串)<代码>或<代码>日期。解析(字符串)< /代码>,因为实现是依赖于浏览器的,正如你所发现的,通常有点不直观。

您可以自己解析字符串,这样做很好,尤其是在格式定义良好的情况下

const re = /(\d\d)\/(\d\d)\/(\d\d\d\d)/;

const [whole, day, month, year] = re.exec('03/02/2018');
然后,如果您愿意,您可以使用这些数字构造一个
日期

const d = new Date(year, month - 1, day);
请注意,
Date
构造函数预期索引月份为零(即一月为
0

还请注意,
Date
将年份
0-99
映射到
1900-1999
。如果您不想这样做,则需要使用
Date.prototype.setFullYear
Date.prototype.getFullYear
强制执行。这是必要的,还是不必要的,并不十分一致:

const d = new Date(88, 1, 2);
console.log(d); // 1988-02-02T00:00:00.000Z

d.setFullYear(88);

console.log(d); // 0088-02-02T00:00:00.000Z
console.log(d.getYear()); // -1812
console.log(d.getFullYear()); // 88

这里有足够的陷阱,您应该考虑使用一个更干净的日期API的库。

您需要将格式字符串<代码> yyyy mm DD/<代码>传递到<代码>日期>代码>构造器:

函数dateCompare(){
变量d1=新日期('0018-03-11');
var d2=新日期('2018-03-11');//假设今天的日期是2018年3月11日
如果(d1dateCompare()您需要将格式为
yyyy-mm-dd
的日期字符串传递给
date
构造函数:

函数dateCompare(){
变量d1=新日期('0018-03-11');
var d2=新日期('2018-03-11');//假设今天的日期是2018年3月11日
如果(d1dateCompare()
您可以使用矩。js
Date
对象基于时间值,即自1970年1月1日UTC起的毫秒数。您可以使用矩。js
Date
对象基于时间值,即自1970年1月1日UTC起的毫秒数。答案中不包含库建议,但是
moment
是一种流行的格式。你考虑过使用ISO 8601格式吗?@connexo当将日期编码为字符串时,我总是更喜欢使用ISO8601,但是OP有一种不同的输入格式。它不会真正改变答案——针对
newdate(string)
的MDN建议对ISO8601没有例外。parse方法的一个问题是,它对输入格式的要求很宽松,因此它有可能出错。这就是W3C为Javascript中的日期格式定义ISO8601的原因。如果您故意传递无效参数,忽略标准API,您将任由客户供应商摆布。@connexo W3C不参与ECMA-262标准。尽管使用ISO8601格式,ECMA-262在解析方面与之不一致。更多关于“不要使用内置解析器”的疑问库建议不属于答案,但
moment
是一种流行的建议。您考虑过使用ISO 8601格式吗?@connexo在将日期编码为字符串时,我总是更喜欢使用ISO8601,但OP有不同的输入格式。它不会真正改变答案——针对
newdate(string)
的MDN建议对ISO8601没有例外。parse方法的一个问题是,它对输入格式的要求很宽松,因此它有可能出错。这就是W3C为Javascript中的日期格式定义ISO8601的原因。如果您故意传递无效参数,忽略标准API,您将任由客户供应商摆布。@connexo W3C不参与ECMA-262标准。尽管使用ISO8601格式,ECMA-262在解析方面与之不一致。更多关于“不要使用内置解析器”的疑问使用内置解析器很少是个好主意。ISO 8601日期被解析为UTC,因此在简单比较的情况下“工作”,而在其他情况下则不工作。使用内置解析器很少是一个好主意。ISO 8601日期被解析为UTC,因此在简单比较的情况下“工作”