使用 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/yyyydd 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 开始)

如何使用 date-fns 格式化日期?

TypeError:格式不是 date-fns 中的函数

使用 ISO-8601 格式的 date-fns 获取当前日期

如何使用 JavaScript date-fns 库在特定时区格式化日期/时间

date-fns - 有没有办法获取短日期格式字符串