2008-09-10 50 views
12

Câu hỏi này là mặt khác của câu hỏi, "How do I calculate relative time?".Cách phân tích cú pháp thời gian tương đối?

Cho một số đầu vào của con người trong một khoảng thời gian tương đối, bạn có thể phân tích cú pháp đó như thế nào? Theo mặc định, bạn sẽ bù trừ từ DateTime.Now(), nhưng có thể tùy ý bù đắp từ một số khác DateTime.

(thích câu trả lời trong C#)

Ví dụ đầu vào:

  • "trong 20 phút"
  • "5 giờ trước"
  • "3H 2m"
  • "vào tuần tới"

Chỉnh sửa: Giả sử chúng ta có thể định nghĩa một số giới hạn về đầu vào. Loại mã này sẽ là một điều hữu ích để có trên web.

+0

Đối với .net có câu trả lời trong [Cách thông minh để phân tích ngày C#] (http://stackoverflow.com/a/25588407) –

Trả lời

3

Đó là xây dựng một DSL (Ngôn ngữ riêng cho tên miền) để xử lý ngày. Tôi không biết nếu ai đó đã làm một cho NET nhưng việc xây dựng một DSL là khá đơn giản:

  1. Xác định ngôn ngữ chính xác, mà đầu vào hình bạn sẽ chấp nhận và những gì bạn sẽ làm gì với sự mơ hồ
  2. xây dựng ngữ pháp cho ngôn ngữ
  3. Xây dựng máy trạng thái hữu hạn phân tích ngôn ngữ của bạn thành một AST hành động

bạn có thể làm tất cả những điều đó một mình (với sự giúp đỡ của the Dragon Book, ví dụ) hoặc với sự giúp đỡ của công cụ để có hiệu lực, như hiển thị n trong số link này.

Chỉ bằng cách suy nghĩ kỹ về khả năng bạn có cơ hội tốt, với sự trợ giúp của các ví dụ giao diện người dùng tốt, bao gồm hơn một nửa số đầu vào thực tế mà ứng dụng của bạn sẽ nhận được. Nếu bạn muốn chấp nhận mọi thứ mà con người có thể nhập, bạn có thể ghi lại đầu vào được xác định là mơ hồ và sau đó thêm chúng vào ngữ pháp, bất cứ khi nào chúng có thể được diễn giải, vì có những thứ vốn không rõ ràng.

+0

Kiểm tra nChronic (https://github.com/robertwilczynski/nChronic) cho .NET. . – Larsenal

7

Tìm kiếm của Google bật thư viện parsedatetime (được liên kết với Chandler project), được thiết kế để thực hiện chính xác việc này. Đó là mã nguồn mở (Giấy phép Apache) và được viết bằng Python. Nó có vẻ là khá phức tạp - từ trang chủ:

parsedatetime có khả năng phân tích, cho dụ, sau đây:

* 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 

Kể từ khi nó được thực hiện trong tinh khiết Python và không sử dụng bất cứ điều gì ưa thích, có một cơ hội tốt nó tương thích với IronPython, vì vậy bạn có thể sử dụng nó với .net. Nếu bạn muốn một giải pháp C# cụ thể, bạn có thể viết một cái gì đó dựa trên các thuật toán mà họ sử dụng ...

Nó cũng đi kèm với một loạt các bài kiểm tra đơn vị.

+0

Tôi đã thành công trong việc sử dụng nó từ C# và nó hoạt động khá tốt. Nếu có ai quan tâm, tôi có thể tải nó lên đâu đó. – VitalyB

0

Những người ruby ​​đã cố gắng giải quyết vấn đề này với một trình phân tích cú pháp được gọi là Chronic.

Tôi đã xem một trình chiếu video nhiều thông tin gần đây về cách tác giả đã đi về cách giải quyết vấn đề này.

+0

Liên kết tới video sẽ tuyệt vời. – Larsenal

0

Điều này có thể không phải tất cả mà hữu ích kể từ khi bạn đang nói C# nhưng vì không có ai của đề cập đến nó nhưng bạn có thể cố gắng để có một cái nhìn tại tuyệt vời và hoàn toàn mất trí có nguồn gốc strtotime php function của

Các vấn đề liên quan