【问题标题】:Parsing human-language dates into a Date object将人类语言日期解析为 Date 对象
【发布时间】:2021-02-18 22:03:12
【问题描述】:

将人类输入到 Date() 对象的日期(即我正在从事的使用 ML 文本提取器的项目)转换为最简单的方法是什么。

这似乎是一个很简单的问题,但我找不到万无一失的解决方案。这是因为输入“2021 年 2 月 20 日”到“20 年 1 月 1 日”等日期的人以及使用“2021 年 1 月 3 日”等不同格式的人之间的格式差异很大。

有没有人知道的预构建包?

编辑:经过一些挖掘和试验,我发现的唯一解决方案是使用 moment.js(感谢 cWerning 的建议,以及其他提出其他想法的人)并输入多个模板,如下所示:

moment(**date**,["YYYY/MM/DD","DD/MM/YYYY",etc... with other formats]

编辑:另一个对我有用的解决方案是一个名为 Chrono 的 GitHub 项目,它进行自然语言处理,这正是我最初寻找的。​​p>

【问题讨论】:

  • 在处理约会时帮自己一个忙,与npmjs.com/package/moment合作
  • 另外,如果人类正在输入它..您可以控制他们输入它的格式(而不是有一个空白输入表单,有几个带有月、日和年选项的选择标签)然后你用标准化的东西制作数据
  • 如果您尝试从任意文本中提取日期,我认为这基本上是不可能的,除非您的机器学习足够聪明(除其他外)确定输入文本的人是否是美国人(mm /dd/yy) 或欧洲 (dd/mm/yy)。
  • @cWerning 谢谢你的建议。我发现 moment.js 提供了添加多个自定义“模板”来识别日期格式的能力。 (遍历它们,直到找到有效日期)-TheBombSquad(不能提及多个)也感谢您的建议。这听起来对其他情况很有用,但在我的情况下,我无法控制它是如何进入的。-DanielBeck 是的。虽然我在 cWerning 的帮助下找到的解决方案有效,但它有点不可行,所以也许未来更高级的 ML 模型可能会有所帮助。无论如何,谢谢。

标签: javascript node.js date


【解决方案1】:

您可以控制如何人输入数据,以确保程序能够理解这些数据。下面的例子:D

let values=id=>document.getElementById(id).value //to get each wanted value with relative ease >:D
let elems=id=>document.getElementById(id) //to get each wanted elem with relative ease >:D
let twoDigit=num=>{if(num>9){return(num)}return(0+''+num)} //this will help in Date.parse formatting >:D
elems("btn").addEventListener('click',onClick) //scroll to see the onClick function >:D


//for placing days
for(let i=1;i<=31;i++){elems("day").innerHTML+=`<option value="${twoDigit(i)}">${i}</option>`}

//for placing months
var monthsArr=["January","February","March","April","May","June","July","August","September","October","November","December"]
for(let i=0;i<monthsArr.length;i++){
  elems("month").innerHTML+=`<option value="${twoDigit(i+1)}">${monthsArr[i]}</option>`
}

//for placing years
let maxYear=2050, minYear=1950 //can set these to whatever
for(let i=minYear;i<=maxYear;i++){elems("year").innerHTML+=`<option value="${i}">${i}</option>`}

//function that runs when you click "Submit Date"
function onClick(ev){
  let date=new Date(Date.parse(`${values("year")}-${values("month")}-${values("day")}T00:00:00.000`))
  if(date){return alert(`New Date Recorded:\n${date}`)} //inside here you can also store correct dates or whatever(inside this if statement)
  alert("INVALID DATE.. hint, February 31st is NOT A REAL DATE")
}
<h2>Please Choose a Date :D</h2>
<h3>Do note that INVALID dates would be rejected :0</h3>
<select id="day"></select>
<select id="month"></select>
<select id="year"></select>
<button id="btn">Submit Date</button>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    相关资源
    最近更新 更多