使用 date-fns 解析多种格式
Posted
技术标签:
【中文标题】使用 date-fns 解析多种格式【英文标题】:Parse multiple formats with date-fns 【发布时间】:2021-08-10 19:19:05 【问题描述】:我有这个代码示例:
function compareDate(value: string)
return isBefore(
parse(value, 'dd-MM-yyyy', new Date()),
sub(new Date(), days: 1 )
);
const test = compareDate('31-12-2020');
在 parse() 中我需要使用dd-MM-yyyy
,但也需要使用dd/MM/yyyy
和dd MM yyyy
。我怎样才能做到这一点?
该值将具有用户键入的日期,typeof String,并且看起来像上面的示例。
【问题讨论】:
【参考方案1】:用正确的分隔符替换所有可能的分隔符:
function compareDate(value: string)
return isBefore(
parse(value.replace(/[\/ ]/g, '-'), 'dd-MM-yyyy', new Date()),
sub(new Date(), days: 1 )
)
const test = compareDate('31-12-2020')
【讨论】:
我尝试了第二个示例,但它不起作用。我不明白第一个例子。日期会在value
,typeof String,不知道是带'-','/'还是''
我已经更新了一个答案。我在正则表达式中忘记了全局标志 /g
。
是的,这是按预期工作的。谢谢!
我有一个关于这个正则表达式的新问题,它不验证日期格式“01/01-1987”。它应该验证重复的“-”m“/”或“”知道我应该如何修改这个正则表达式?
这就是它的作用,你不必将-
添加到正则表达式,因为它已经被正确的分隔符“替换”了。我检查了01/01-1987
的正则表达式,它正确返回01-01-1987
。您确定您的代码没有其他问题吗?因为这看起来是正确的【参考方案2】:
您可以使用isMatch
来确定您拥有哪个字符串:
function compareDate(value: string)
let start;
if (isMatch(value, 'dd-MM-yyyy'))
start = parse(value, 'dd-MM-yyyy', new Date());
else if (isMatch(value, 'dd/MM/yyyy'))
// etc...
return isBefore(
start,
sub(new Date(), days: 1 )
);
【讨论】:
以上是关于使用 date-fns 解析多种格式的主要内容,如果未能解决你的问题,请参考以下文章
使用 date-fns 格式化持续时间(从 seconds 开始)
使用 ISO-8601 格式的 date-fns 获取当前日期