문제

이 질문은 "라고 묻는 질문의 반대편입니다.상대 시간은 어떻게 계산하나요?".

상대적인 시간 동안 인간의 입력이 주어지면 이를 어떻게 구문 분석할 수 있나요?기본적으로 다음과 같이 오프셋됩니다. DateTime.Now(), 그러나 선택적으로 다른 것으로부터 오프셋될 수 있음 DateTime.

(C#의 답변을 선호하세요)

입력 예:

  • "20분 안에"
  • "5 시간 전에"
  • "3시 2분"
  • "다음 주"

편집하다: 입력에 대한 몇 가지 제한을 정의할 수 있다고 가정해 보겠습니다.이런 종류의 코드는 웹에 공개하면 유용할 것입니다.

도움이 되었습니까?

해결책

이는 날짜 처리를 위한 DSL(도메인 특정 언어)을 구축하는 것입니다.누군가가 .NET에 대해 작업을 수행했는지는 모르겠지만 DSL 구성은 매우 간단합니다.

  1. 언어를 정확하게 정의하고, 어떤 입력 형식을 받아들일지, 모호성을 어떻게 처리할지 정의하세요.
  2. 언어의 문법을 구성하세요
  3. 언어를 실행 가능한 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달성하려는 목표에 상당히 가깝습니다.가장 우아한 솔루션은 아니지만 확실히 일부 작업을 절약할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top