문제
다음과 유사한 .NET 날짜/시간 파서에 대해 아는 사람이 있습니까? Ruby에 대한 만성 ("내일" 또는 "다음 주 목요일 오후 3시"와 같은 항목을 처리합니까?)
메모:저는 Ruby를 작성하지만(이것이 제가 Chronic에 대해 아는 방식입니다) 이 프로젝트는 .NET을 사용해야 합니다.
해결책
우리는 내부 프로젝트에서 귀하가 찾고 있는 것을 정확하게 개발했습니다.충분한 필요성이 있을 경우 이를 공개할 생각입니다.자세한 내용은 이 블로그를 참조하세요. http://precisionsoftwaredesign.com/blog.php.
관심이 있으시면 언제든지 저에게 연락해주세요:contact@precisionsoftware.us
이 라이브러리는 이제 SourceForge 프로젝트입니다.페이지 위치:
http://www.SourceForge.net/p/naturaldate
어셈블리는 다운로드 섹션에 있으며 소스는 Mercurial에서 사용할 수 있습니다.
다른 팁
Chronic의 .NET 포트가 존재합니다.보다 https://github.com/robertwilczynski/nChronic.나는 여기에 몇 가지 개선 사항과 버그 수정을 포함하여 포크를 만들었습니다. https://github.com/dorony/nChronic (풀 요청을 보냈지만 작성자는 아직 응답하지 않았습니다).
@Blair Conrad-좋은 아이디어입니다!IronRuby에서 Chronic을 실행하려고 했지만 종속성 문제가 있었습니다. 아직 준비가 되었는지 모르겠습니다.
다음에서 프로젝트를 찾았습니다. 코드플렉스 (DateTimeEnglishParser) 같은 일을 시도하고 있습니다.아직 몇 년이나 시간이 흘렀지만 좋은 시작입니다.나는 프로젝트에 약간의 참여를 했고, 쓰여진 숫자를 더 잘 처리하기 위한 패치에 기여했습니다.
이는 흥미로운 문제이고 정규식을 더 잘 이해하는 데 확실히 도움이 되었기 때문에 계속해서 작업할 것 같습니다.
있었다 비슷한 스레드 이전에 원하는 작업을 수행하는 것으로 보이는 CodeProject의 라이브러리에 대한 링크를 제공했습니다. http://www.codeproject.com/KB/edit/dateparser.aspx 하지만 불행하게도 라이브러리는 MFC로 작성된 것 같으므로 라이브러리에서 DLL을 만든 다음 .NET 프로그램에서 호출해야 합니다.
Palmsey, 최근에 동일한 요구 사항이 있어서 간단한 파서를 작성했습니다.가장 좋은 코드는 아니지만 다음과 같은 작업을 처리합니다.
"오늘 오후 2시" "화요일 화요일 오후 2시 - 2010 년 7 월 15 일 오전 2시
다른 사람이 유용하다고 생각할 수도 있으므로 codeplex에 보관하십시오.확인 해봐: http://timestamper.codeplex.com/
나는 여러 프레임워크와 Python의 구문 분석 날짜시간 가장 잘 일했습니다.IronPython을 사용하여 .NET에서 사용할 수 있습니다.
전체 샘플 프로젝트에 관심이 있는 사람이 있으면 답변에 대해 의견을 남겨주시면 샘플 프로젝트를 만들어 보겠습니다.
편집하다
요청에 따라 라이브러리와 함께 사용할 수 있는 간단한 프로젝트는 다음과 같습니다.
http://www.assembla.com/code/relativedateparser/subversion/nodes
예를 들어 다음 사용 사례를 시도해 보세요.
- 2008년 8월 25일
- 2008년 8월 25일
- 8월 25일 오후 5시
- 8월 25일 오후 5시
- 다음 토요일
- 내일
- 다음주 목요일 오후 4시
- 오후 4시에
- 에오드
- 내일은
- 화요일
- 어이
- 엄
- 5분 안에
- 지금부터 5분
- 지금으로부터 5시간 전
- 정오 2시간 전
- 내일부터 2일
나는 그 중 하나를 알지 못하지만 멋진 문제처럼 들렸으므로 여기에 내 문제가 있습니다(VB.NET).
Private Function ConvertDateTimeToStringRelativeToNow(ByVal d As DateTime) As String
Dim diff As TimeSpan = DateTime.Now().Subtract(d)
If diff.Duration.TotalMinutes < 1 Then Return "Now"
Dim str As String
If diff.Duration.TotalDays > 365 Then
str = CInt(diff.Duration.TotalDays / 365).ToString() & " years"
ElseIf diff.Duration.TotalDays > 30 Then
str = CInt(diff.TotalDays / 30).ToString() & " months"
ElseIf diff.Duration.TotalHours > 24 Then
str = CInt(diff.Duration.TotalHours / 24) & " days"
ElseIf diff.Duration.TotalMinutes > 60 Then
str = CInt(diff.Duration.TotalMinutes / 60) & " minutes"
Else
str = CInt(diff.Duration.TotalMinutes).ToString() & " minutes"
End If
If str.StartsWith("1") Then str = str.SubString(0, str.Length - 1)
If diff.TotalDays > 0 Then
str &= " ago"
Else
str &= " from now"
End If
Return str
End Function
이미 존재하는 것만큼 정교하지는 않지만 제 생각엔 괜찮게 작동할 것 같습니다.좋은 확장 방법이 될 수 있습니다.
@버튼:나는 그가 다른 의미로 말한 것이라고 생각합니다. 적어도 링크된 페이지의 예에서는 다음과 같습니다.
Chronic.parse('tomorrow')
#=> Mon Aug 28 12:00:00 PDT 2006
Chronic.parse('monday', :context => :past)
#=> Mon Aug 21 12:00:00 PDT 2006
Chronic.parse('this tuesday 5:00')
#=> Tue Aug 29 17:00:00 PDT 2006
저도 깨달을 때까지 한 번 찔러볼까 생각했어요!(좋은 구현이지만)