2008-11-17 32 views
10

Tôi rất muốn biết liệu có mô-đun phân tích cú pháp "ngày được định dạng con người" trong Perl hay không. Tôi có nghĩa là những thứ như "ngày mai", "Thứ Ba", "tuần tới", "1 giờ trước".Làm cách nào để phân tích cú pháp các ngày tương đối với Perl?

Nghiên cứu của tôi với CPAN đề xuất rằng không có mô-đun như vậy, vậy bạn sẽ tạo ra một mô-đun như thế nào? NLP là cách trên đầu cho việc này.

Trả lời

23

Date::Manip thực hiện chính xác điều này.

Dưới đây là một chương trình ví dụ:

#!/usr/bin/perl 

use strict; 
use Date::Manip; 

while (<DATA>) 
{ 
    chomp; 
    print UnixDate($_, "%Y-%m-%d %H:%M:%S"), " ($_)\n"; 
} 

__DATA__ 
today 
yesterday 
tomorrow 
last Tuesday 
next Tuesday 
1 hour ago 
next week 

Những kết quả trong các kết quả sau:

2008-11-17 15:21:04 (today) 
2008-11-16 15:21:04 (yesterday) 
2008-11-18 15:21:04 (tomorrow) 
2008-11-11 00:00:00 (last Tuesday) 
2008-11-18 00:00:00 (next Tuesday) 
2008-11-17 14:21:04 (1 hour ago) 
2008-11-24 00:00:00 (next week) 

UnixDate là một trong những chức năng được cung cấp bởi Date::Manip, đối số đầu tiên là một ngày/giờ trong bất kỳ định dạng nào mà mô-đun hỗ trợ, đối số thứ hai mô tả cách định dạng ngày/giờ. Có các chức năng khác chỉ phân tích cú pháp những ngày "con người" này mà không định dạng chúng, được sử dụng trong các phép tính delta, v.v.

+1

Ah, tốt cũ Ngày :: Manip ... Làm thế nào bạn có thể không yêu một module mà cố gắng khó khăn như vậy để nói chuyện với bạn ra của việc sử dụng nó? –

+0

Chính xác những gì tôi đang tìm kiếm, nhưng (như thường lệ) tôi không biết cách đặt câu hỏi. Cảm ơn. – andymurd

+0

Tôi nghĩ DateTime là những gì cộng đồng hiện nay thúc đẩy nhiều nhất là giải pháp Ngày & Giờ toàn diện. Xem datetime.perl.org và bài viết này http://www.perl.com/pub/a/2003/03/13/datetime.html – draegtun

-2

Tôi cho rằng bạn có ngữ cảnh. NLP có thể trợ giúp ở đây như thế nào? như là một dự đoán hoang dã bạn chỉ có thể tìm thấy ngày gần nhất đó là một ngày chính xác (không liên quan đến ngày hôm nay) và sử dụng ngày hôm nay/tommorow/ngày hôm qua để liên quan đến điều đó.

9

bạn cũng có thể thấy thú vị khi xem gia đình DateTime::Format, cụ thể là DateTime::Format::Natural. khi bạn đã phân tích cú pháp ngày/giờ của mình thành đối tượng DateTime, bạn có thể thao tác và đánh giá nó theo một loạt các cách khác nhau.

đây là một chương trình mẫu:

use strict; 
use warnings; 

use DateTime::Format::Natural; 

my($parser) = DateTime::Format::Natural->new; 

while (<>) { 

    chomp; 
    my($dt) = $parser->parse_datetime($_); 

    if ($parser->success) { 

     print join(' ', $dt->ymd, $dt->hms) . "\n"; 
    } 
    else { 

     print $parser->error . "\n"; 
    } 
} 

đầu ra:

tomorrow 
2008-11-18 21:48:49 
next Tuesday 
2008-11-25 21:48:53 
1 week from now 
2008-11-24 21:48:57 
1 hour ago 
2008-11-17 20:48:59 

TMTOWTDI :)

-Steve

+0

Cảm ơn bạn đã đề xuất Ngày giờ. Yay, One True Systems! – Anirvan

2

Cá nhân, tôi đã luôn luôn sử dụng Time::ParseDate cho việc này. Nó hiểu khá nhiều mọi định dạng mà tôi đã thử.

định dạng ngày Absolute

Dow, dd Mon yy 
    Dow, dd Mon yyyy 
    Dow, dd Mon 
    dd Mon yy 
    dd Mon yyyy 
    Month day{st,nd,rd,th}, year 
    Month day{st,nd,rd,th} 
    Mon dd yyyy 
    yyyy/mm/dd 
    yyyy-mm-dd  (usually the best date specification syntax) 
    yyyy/mm 
    mm/dd/yy 
    mm/dd/yyyy 
    mm/yy 
    yy/mm  (only if year > 12, or > 31 if UK) 
    yy/mm/dd (only if year > 12 and day < 32, or year > 31 if UK) 
    dd/mm/yy (only if UK, or an invalid mm/dd/yy or yy/mm/dd) 
    dd/mm/yyyy (only if UK, or an invalid mm/dd/yyyy) 
    dd/mm  (only if UK, or an invalid mm/dd) 

định dạng ngày tương đối:

count "days" 
    count "weeks" 
    count "months" 
    count "years" 
    Dow "after next" 
    Dow "before last" 
    Dow      (requires PREFER_PAST or PREFER_FUTURE) 
    "next" Dow 
    "tomorrow" 
    "today" 
    "yesterday" 
    "last" dow 
    "last week" 
    "now" 
    "now" "+" count units 
    "now" "-" count units 
    "+" count units   
    "-" count units 
    count units "ago" 

Absolute định dạng thời gian:

hh:mm:ss[.ddd] 
    hh:mm 
    hh:mm[AP]M 
    hh[AP]M 
    hhmmss[[AP]M] 
    "noon" 
    "midnight" 

định dạng thời gian tương đối:

count "minutes"   (count can be franctional "1.5" or "1 1/2") 
    count "seconds" 
    count "hours" 
    "+" count units 
    "+" count 
    "-" count units 
    "-" count 
    count units "ago" 

định dạng múi giờ:

[+-]dddd 
    GMT[+-]d+ 
    [+-]dddd (TZN) 
    TZN 

định dạng đặc biệt:

[ d]d/Mon/yyyy:hh:mm:ss [[+-]dddd] 
    yy/mm/dd.hh:mm 
Các vấn đề liên quan