상대 시간을 구문 분석하는 방법은 무엇입니까?
-
09-06-2019 - |
문제
이 질문은 "라고 묻는 질문의 반대편입니다.상대 시간은 어떻게 계산하나요?".
상대적인 시간 동안 인간의 입력이 주어지면 이를 어떻게 구문 분석할 수 있나요?기본적으로 다음과 같이 오프셋됩니다. DateTime.Now()
, 그러나 선택적으로 다른 것으로부터 오프셋될 수 있음 DateTime
.
(C#의 답변을 선호하세요)
입력 예:
- "20분 안에"
- "5 시간 전에"
- "3시 2분"
- "다음 주"
편집하다: 입력에 대한 몇 가지 제한을 정의할 수 있다고 가정해 보겠습니다.이런 종류의 코드는 웹에 공개하면 유용할 것입니다.
해결책
이는 날짜 처리를 위한 DSL(도메인 특정 언어)을 구축하는 것입니다.누군가가 .NET에 대해 작업을 수행했는지는 모르겠지만 DSL 구성은 매우 간단합니다.
- 언어를 정확하게 정의하고, 어떤 입력 형식을 받아들일지, 모호성을 어떻게 처리할지 정의하세요.
- 언어의 문법을 구성하세요
- 언어를 실행 가능한 AST로 구문 분석하는 유한 상태 기계를 구축하세요.
당신은 혼자서 모든 것을 할 수 있습니다 (의 도움으로 드래곤북, 예를 들어) 또는 다음과 같이 도구를 사용하여 효과를 얻습니다. 링크.
좋은 UI 예제의 도움으로 애플리케이션이 받게 될 실제 입력의 절반 이상을 다룰 수 있는 가능성에 대해 열심히 생각하는 것만으로도 충분합니다.인간이 입력할 수 있는 모든 것을 수용하려는 경우 본질적으로 모호한 내용이 있기 때문에 모호한 것으로 판단된 입력을 기록한 다음 해석될 수 있을 때마다 문법에 추가하면 됩니다.
다른 팁
구글 검색하면 나온다 구문 분석 날짜 시간 라이브러리(관련 챈들러 프로젝트)은 바로 이 작업을 수행하도록 설계되었습니다.오픈 소스(Apache 라이센스)이며 Python으로 작성되었습니다.홈페이지에서 보면 꽤 정교한 것 같습니다.
ParsedAteTime은 예를 들어 다음과 같이 구문 분석 할 수 있습니다.
* Aug 25 5pm * 5pm August 25 * next saturday ... * tomorrow * next thursday at 4pm * at 4pm * eod * in 5 minutes * 5 minutes from now * 5 hours before now * 2 days from tomorrow
순수한 Python으로 구현되고 화려한 것을 사용하지 않기 때문에 호환될 가능성이 높습니다. IronPython, 이므로 .net에서 사용할 수 있습니다.구체적으로 C# 솔루션을 원한다면 그들이 사용하는 알고리즘을 기반으로 무언가를 작성할 수 있습니다.
또한 다양한 단위 테스트가 함께 제공됩니다.
이것은 C#에 대해 이야기하고 있기 때문에 그다지 도움이 되지는 않을 것입니다. 하지만 아직 아무도 언급하지 않았기 때문에 PHP의 훌륭하고 완전히 미친 기본 기능을 살펴보는 것이 좋습니다. strtotime 기능
루비 사람들은 이 문제를 다음과 같은 파서로 해결하려고 시도했습니다. 만성병 환자.
나는 최근에 저자가 이 문제를 어떻게 해결했는지에 대한 유익한 비디오 프레젠테이션을 보았습니다.
이것: http://www.codeproject.com/KB/edit/dateparser.aspx달성하려는 목표에 상당히 가깝습니다.가장 우아한 솔루션은 아니지만 확실히 일부 작업을 절약할 수 있습니다.