首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

new Date()函数和moment()不会将开头字符和以数字结尾的输入检测为无效日期

基础概念

new Date() 是 JavaScript 中用于创建日期对象的构造函数。它可以接受多种格式的参数,包括字符串、数字、日期对象等。然而,new Date() 对输入的解析并不严格,有时会导致一些非预期的结果。

moment.js 是一个流行的日期和时间处理库,提供了丰富的日期时间操作功能。它对日期字符串的解析更加灵活和强大,但也存在一些与 new Date() 类似的问题。

相关优势

  • new Date():
    • 内置于 JavaScript,无需额外引入库。
    • 简单易用,适合基本的日期操作。
  • moment.js:
    • 提供了丰富的日期时间操作方法。
    • 解析和格式化日期字符串的能力更强。
    • 支持时区处理。

类型

  • new Date():
    • 可以接受字符串、数字、日期对象等作为参数。
  • moment.js:
    • 主要接受字符串作为参数,也可以接受其他类型的数据。

应用场景

  • new Date():
    • 适用于简单的日期操作,如获取当前日期、日期加减等。
  • moment.js:
    • 适用于复杂的日期时间操作,如日期格式化、日期解析、时区转换等。

问题分析

new Date()moment() 在处理某些特殊格式的日期字符串时,可能会将其解析为有效的日期对象,即使这些字符串在逻辑上并不代表有效的日期。

例如:

代码语言:txt
复制
console.log(new Date('2023-02-30')); // 输出: Thu Mar 02 2023 00:00:00 GMT+0800 (中国标准时间)
console.log(moment('2023-02-30').toDate()); // 输出: Thu Mar 02 2023 00:00:00 GMT+0800 (中国标准时间)

原因

  • new Date():
    • JavaScript 的 Date 构造函数在解析日期字符串时,会尝试进行一些宽松的解析,导致一些无效日期被解析为有效日期。
  • moment.js:
    • moment.js 在解析日期字符串时,也会进行一些宽松的解析,尽管它提供了更强大的解析功能,但在某些情况下仍然会出现类似的问题。

解决方法

为了避免这种情况,可以在使用 new Date()moment() 之前,先对日期字符串进行有效性检查。

使用 new Date() 进行有效性检查

代码语言:txt
复制
function isValidDate(dateString) {
  const date = new Date(dateString);
  return !isNaN(date.getTime());
}

console.log(isValidDate('2023-02-30')); // 输出: false

使用 moment.js 进行有效性检查

代码语言:txt
复制
function isValidDate(dateString) {
  return moment(dateString, 'YYYY-MM-DD', true).isValid();
}

console.log(isValidDate('2023-02-30')); // 输出: false

参考链接

通过上述方法,可以有效避免 new Date()moment() 将无效日期字符串解析为有效日期对象的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何在 TypeScript 中将字符串转换为日期对象?

该构造函数将日期字符串解析为本地时区的时间,并返回一个 Date 对象。需要注意的是,Date 构造函数的行为取决于日期字符串的格式。...如果日期字符串的格式与本地时区的格式不匹配,则可能导致解析错误或不正确的结果。此外,由于 Date 对象的行为在不同的浏览器和操作系统中可能会有所不同,因此在使用 Date 构造函数时需要谨慎处理。...,我们使用数字类型定义了年份、月份和日期属性。...具体来说,我们可以使用 Date 构造函数将日期字符串解析为本地时区的日期对象,使用 moment.js 库解析各种日期格式并将其转换为日期对象,使用自定义 TypeScript 类型确保类型安全,以及使用...需要注意的是,在使用这些方法时需要小心处理日期格式和本地化设置,以确保解析结果正确。同时,某些方法可能在不同的浏览器和操作系统中表现不同,因此需要进行充分测试和验证。

3.5K40

第200天:js---常用string原型扩展

return this.concat(str); 4 } 2、删除指定索引位置的字符,索引无效将不删除任何字符 1 /** 删除指定索引位置的字符,索引无效将不删除任何字符 **/ 2 String.prototype.deleteCharAt...subStr结尾 1 /** 检查字符串是否以subStr结尾 **/ 2 String.prototype.endWith = function (subStr) { 3 if (subStr.length...1 /** 将指定的位置的字符设置为另外指定的字符或字符串.索引无效将直接返回不做任何处理 **/ 2 String.prototype.setCharAt = function (index, subStr...subStr开头 1 /** 检查字符串是否以subStr开头 **/ 2 String.prototype.startWith = function (subStr) { 3 if (subStr.length...54 default: return undefined; 55 } 56 }; 18、检测是否为空   1 //检测是否为空

3K30
  • 分享 8 个关于 new Date() 的冷知识,你需要了解下

    处理月份时,日期以 0 开头,0 表示一月,1 表示二月,等等。这个函数很糟糕,非常混乱且有错误。 3.关于其自动日期校正的陷阱 很难猜测下面的代码代表的真实日期是什么。...也许是 2023 年 2 月的日期?但二月并没有32天,很奇怪,那么到底是什么呢? const d = new Date(2023, 1, 32) 让我们编写一个解析日期对象的函数。...无法轻松格式化日期? 如何将数组转换为指定格式的字符串?很简单,我们可以使用数组的join方法。...类型的日期无法正确解析 很多时候我们会通过传递日期字符串来初始化日期,因为它比 new Date(2023, 4, 28) 使用起来方便得多。...const d2 = new Date('5-28-2023') console.log(formatDate(d2)) // 2023/5/28 如果您传入这样的日期,您将收到无效错误警告。

    31620

    由浅入深,走进中级工程师都未必知道的 JavaScript 时间处理冷知识

    2.3 两种国际时间标准:ISO8601 与 RFC2822 ISO8601,全称为《数据存储和交换形式·信息交换·日期和时间的表示方法》,规定了国际标准日期与时间表示法。 只使用数字为基本格式。...日期时间表示只能有数字或少数特殊字符组成(如“ - ”,“:”,“T”,“W”和“Z”),不允许出现地方写法,如“1月”或“星期四”等。 ISO 8601使用24小时制。...在javascipt中,时间的处理需要用到内置对象Date 构造函数 var now = new Date(); 即可获取以当前时间构造的Date对象。...实际上,如果直接将表示日期的字符串传递给Date构造函数,也会在后台调用Date.parse()方法。...3.2.2 包体积过大 因为 Momnet.js 将全部的功能和所有支持的语言都打到一个包里,包的大小也是到了 280.9 kB 这样一个夸张的数字,而且对于 Tree shaking 无效。

    2.2K10

    企业如何借助码匠,实现员工核酸提醒?

    以上这些场景都曾在码匠身边真实发生过,所以,为了方便自己和同事的工作、生活出行,码匠想要搭建一个核酸提醒应用,该应用会记录用户的核酸时间检查用户核酸检测记录及时提醒需核酸的用户告知哪些同事可与自己结伴前往核酸检测这些功能看起来简单...终端用户登录应用,即可查看用户可以查看上次核酸日期和核酸有效天数,之后可以选择本次核酸日期,并点击确认已做核酸按钮进行提交。用户访问该应用时,会自动检测当前需要做核酸的用户,并向他们发送通知信息。...:{{Date.now()}}标签文本:本次核酸日期最大日期:{{moment().format("yyyy-MM-DD")}}作用:「默认值」为默认显示当前日期,但终端用户也可以自行选择日期,但是本次核酸日期最大值不得超过今天...,且当 currentPcrDate 的值无效,即所选的已做核酸日期超过了当前日期时,将会禁用按钮,防止录入错误信息。...注意,该查询为手动查询,由 userList 触发,且该查询执行成功后还须触发 sendMsg 查询以群发消息。

    1.2K50

    js中进行数字,超大金额(千位符),日期时间格式化处理

    (0, num.length - 3); } // 如果数字的开头为0,不需要逗号 if (num){ result = num +...toString,转换成字符串后,打散为数组,再从末尾开始,逐个把数组中的元素插入到新数组(result)的开头,每插入一个元素,counter就计一次数(加1),当counter为3的倍数时,利用取余的方式...,就插入一个逗号,但是要注意开头(i为0时)不需要逗号。...使用系统内置的Date函数就可以实现的,但是复用性很差 方式三:同样也是使用new Date(),但是如果把它封装成一个函数,那么就可以随意调用了 /* * 封装成一个时间格式化函数,formatDateTime.../,官方手册,这在企业应用开发里,也是一个很常用的日期格式类库的 moment.js/2.24.0/moment.js"></script

    4.4K20

    前端小知识10点(2019.9.29)

    前言: 这里记录我在工作或学习中用到的小技巧 1、获取指定日期的上一周或上上周(moment.js) 比如获取2019-01-01的上一周的起始日期或者是上N周的起始日期 moment.js...//获取 date 所在的第几周 const weeknumber=moment(date).isoWeek() //1 const startDate=moment(date)...获取2018-12-31所在周的起始日期 错误示范: let date='2018-12-31' let when=0 //本周 const weeknumber=moment(date).isoWeek...); //2019-01-06 2018-12-31所在周的起始日期为2018-12-31~2019-01-06 2、antd的组件的title内容换行显示 正确示范: 输入「确定的 props」后,能够输出 「确定的 UI」 , 如果 props 在渲染的过程中被修改,会导致该组件的显示和行为不可预测 9、React 点击 A 页面跳转到

    98010

    【JS】201-JavaScript 日期权威指南

    JavaScript通过强大的对象为我们提供日期处理功能:日期。 本文确实不是谈论Moment.js,我认为它是处理日期的最佳库,你应该在处理日期时几乎总是使用它。...重要:UNIX时间戳的原因以秒为单位。JavaScript以毫秒为单位记录原因。...0,我们将得到一个Date对象,表示1970年1月1日(UTC)的时间: new Date(0) 如果我们传递一个字符串而不是一个数字,那么Date对象使用parse方法来确定您传递的日期。...如果您指定了错误的数字格式,JavaScript将报“无效日期”的错误。...根据区域设置格式化日期 现代浏览器中的支持良好国际化API(值得注意的例外:UC浏览器)允许您翻译日期。 它是由Intl Object 暴露出来的,这也有助于本地化数字,字符串。

    2.8K20

    Elasticsearch Dynamic Mapping(动态映射机制)

    、double、long、text(带有keyword子字段) Date detection 日期类型检测,如果启用了date_dete-ction(默认),那么将检查新增的字符串字段,以查看它们的内容是否匹配...同样如果数字类型的值在JSON中是用字符串表示的话,如果开启日期类型检测,同样在创建映射时会映射为数字类型,而不是字符串类型-。...代码@2:字段名称以long_开头的字段-。 代码@3:排除字段名称以text的字段。...代码@4:符合long开头的字段,并且不是以text结尾的字段,如果JSON检测为string类型的新字段,映射为long。 代码@5:long_num,映射类型为lon-g。...代码@6:long_text虽然也满足long开-头,但是以_text结尾,故该字段不会映射为long,而是保留其JSON检测到的类型string,会映射为text字段和keyword-多字段(参考字段动态映射机制

    3K30

    JavaScript-数据类型转换

    注意 (1)NaN 的数据类型是 number (2)未定义变量的数据类型为 undefined (3)数组(Array)的数据类型是 object (4)日期(Date)的数据类型为 object (...如果 string 以 0 开头,那么 ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。...要被解析的字符串。 radix 可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。 5.3 提示和注释 (1)只有字符串中的第一个数字会被返回。 (2)开头和结尾的空格是允许的。...该函数指定字符串中的首个字符是否是数字。如果是,则对字符串进行解析,直到到达数字的末端为止,然后以数字返回该数字,而不是作为字符串。...要被解析的字符串。 6.3 提示和注释 (1)字符串中只返回第一个数字。 (2)开头和结尾的空格是允许的。

    60830

    JavaScript笔记

    isNaN() 函数用于检查其参数是否是非数字值。如果参数值为 NaN 或字符串、对象、undefined等非数字值则返回 true, 否则返回 false。...Array.find() 方法返回通过测试函数的第一个数组元素的值 Array.findIndex() 方法返回通过测试函数的第一个数组元素的索引 日期 new Date() 用当前日期和时间创建新的日期对象...new Date(year, month, day, hours, minutes, seconds, milliseconds) 用指定日期和时间创建新的日期对象。...new Date(milliseconds) 创建一个零时加毫秒的新日期对象 new Date(date string) 从日期字符串创建一个新的日期对象 toUTCString()...方法将日期转换为 UTC 字符串(一种日期显示标准) toDateString() 方法将日期转换为更易读的格式 获取日期方法 getDate() 以数值返回天(1-31) getDay() 以数值获取周名

    2.1K10

    第十六天 常用API-Date&DateFormat&Calender&System&Math&基本类型包装类&正则【悟空教程】

    继续查阅Date类的描述,发现Date拥有多个构造函数,只是部分已经过时,但是其中有未过时的构造函数可以把毫秒值转成日期对象。 ?...* 1.长度大于等于5小于等于15 * 2.数字开头 不包含0 * */ public class Demo01 { public static void main(String[]...0-9]$ ,那么需要匹配的内容从[abc]这个位置开始, 相当于左双引号 边界匹配器:$ 含义:代表的是行的结尾 例如:匹配规则为^[abc][0-9]$ ,那么需要匹配的内容以[0-9]这个结束,...("亲,请输入日期:(格式为:yyyy-MM-dd)");String s = new Scanner(System.in).next();//2、定义日期格式化对象,用于将用户输入的字符串转换为日期对象.../4、定义日期格式化对象,用于将日期对象转换为指定的字符串形式的对象SimpleDateFormat sdf2 = new SimpleDateFormat("E");//5、解析日期对象为字符串形式String

    1.7K20

    Javascript入门学习

    第一课 1:javascript的主要特点 解释型:不需要编译,浏览器直接解释执行 基于对象:我们可以直接使用JS已经创建的对象 事件驱动:可以对以事件驱动的方式相应客户端的输入,无须经过服务器端程序... var now=new Date();//获取日期对象 var year=now.getYear...var now=new Date();//获取日期对象         1.5.2:多行注释 /**/             多行注释以/*开头,以*/结尾,在两者之间的内容为注释内容             ..." 3:布尔型     布尔型数据只有true或者false,在js中也可以使用整数0代表false,使用非0的整数代表true 4:转义字符     以反斜杠开头的不可显示的特殊字符通常称为控制字符...变量的命名规则     变量名由字母,数字,下划线组成,但是不能以数字开头     不能使用javascript中的关键字     严格区分大小写     例如  username  username

    2.2K70

    asp.net常用函数

    . [, choice-n]]) 以索引值来选择并传回所设定的参数。   Chr(charcode) 以ASCII 码来取得字符内容。  ...TimeOfDay() 取得目前不包含日期的时间。   Timer() 取得由0:00 到目前时间的秒数,型态为Double。  ...Today() 取得今天不包含时间的日期。   Trim(string) 去掉字符串开头和结尾的空白。   TypeName(varname) 取得变量或对象的型态。  ...Ucase(string) 将字符串转换为大写。   Val(string) 将代表数字的字符串转换为数值型态,若字符串中含有非数字的内容则会将其去除后,合并为一数字。  ...Weekday(date) 取的参数中的日期是一个星期的第几天,星期天为1、星期一为2、星期二为3 依此类推。

    1.2K30

    JavaScript 编程精解 中文第三版 九、正则表达式

    示例中表达式末尾的i表示正则表达式不区分大小写,虽然模式中使用小写字母,但可以匹配输入字符串中的大写字母B。 匹配和分组 test方法是匹配正则表达式最简单的方法。...如果使用new创建一个Date对象,你会得到当前的日期和时间。.../匹配任何以感叹号开头的字符串,而/x^/不匹配任何字符串(字符串起始位置之前不可能有字符x)。 另一方面,如果我们想要确保日期字符串起始结束位置在单词边界上,可以使用\b标记。...回溯 正则表达式/\b([01]+b|\d+|[\da-f]h)\b/可以匹配三种字符串:以b结尾的二进制数字,以h结尾的十六进制数字(即以 16 为进制,字母a到f表示数字 10 到 15),或者没有后缀字符的常规十进制数字...car和cat pop和prop ferret、ferry和ferrari 以ious结尾的单词 句号、冒号、分号之前的空白字符 多于六个字母的单词 不包含e(或者E)的单词 需要帮助时,请参考本章总结中的表格

    1.7K60
    领券