2009-07-09 38 views
7

Tôi muốn biết nếu có bất kỳ thư viện nào (tốt nhất là DateTime -esque) có thể mất thời gian ngày bình thường và tạo ngày thích hợp có thể đọc được của con người. Về cơ bản, đối diện chính xác của câu hỏi phổ biến hơn: How can I parse relative dates with Perl?.Làm cách nào để tạo ngày tương đối/xấp xỉ trong Perl?

Rõ ràng, từ ngữ/giải thích chính xác tùy thuộc vào việc triển khai thực tế, nhưng tôi đang tìm cách cung cấp một cách nhất quán để chỉ định ngày trong tương lai. Biết được một sự phân chia như "due in 2 weeks" là (đối với tôi) hữu ích hơn trong việc nắm bắt được bao nhiêu thời gian còn lại của tôi hơn một cái gì đó "due on 2009-07-30".

Ví dụ:

2009-07-06  => "in 1 year" 
2009-07-30  => "in 2 weeks" 
2009-07-09  => "tomorrow" 
2009-07-09 12:32 => "tomorrow at 12:32" 
2009-07-12 05:43 => "monday morning" 
2009-07-03 05:74 => "6 days ago" 

Trả lời

7

Cập nhật: Dường như chức năng này được thực hiện trong một Template Toolkit Plugin. Tôi để lại phần còn lại của câu trả lời của tôi ở đây để tham khảo, nhưng Template::Plugin::DtFormatter có thể là nơi tốt nhất để xem.

Nhìn vào mã nguồn của mô-đun đó, tôi đã được dẫn đến DateTime::Format::Natural có vẻ liên quan đến những gì bạn muốn.

trả lời trước:

Nhìn vào Date::Calc để cung cấp cho bạn sử dụng đồng bằng châu thổ Delta_DHMS. Bạn sẽ có thể sử dụng những vùng đồng bằng để chọn cách bạn định cụm từ ngày tháng.

Đây là điểm bắt đầu rất thô sơ. Đó là lỗi nhưng minh họa ý tưởng cơ bản. Thêm logic để nếm thử.

#!/usr/bin/perl 

use strict; 
use warnings; 

use Date::Calc qw(:all); 
use Lingua::EN::Inflect qw(NO); 

my @dates = (
    [ 2009, 7, 6 ], 
    [ 2009, 7, 30 ], 
    [ 2009, 7, 9 ], 
    [ 2009, 7, 9, 12, 32 ], 
    [ 2009, 7, 12, 5, 43 ], 
    [ 2009, 7, 3, 5, 14 ], 
    [ 2010, 8, 9 ], 
    [ 2012, 8, 9 ], 
    [ 2013, 8, 9 ], 
); 

for my $date (@dates) { 
    print "@$date: ", relative_when($date), "\n"; 
} 

sub relative_when { 
    my ($year, $month, $day, $hour, $min, $sec) = @{ $_[0] }; 
    my ($Dyear, $Dmon, $Dday, $Dhr, $Dmin, $Dsec) = Delta_YMDHMS(
     Today_and_Now(), 
     $year, $month, $day, $hour || 0, $min || 0, $sec || 0 
    ); 
    return NO('year', $Dyear)  if $Dyear > 0; 
    return NO('month', $Dmon)  if $Dmon > 0; 
    return NO('week', int($Dday/7) if $Dday > 6; 
    return NO('day', $Dday)  if $Dday > 1; 
    return 'tomorrow' if $Dday == 1; 
    return 'today' if $Dday == 0; 
    return ""; 
} 

__END__ 

Output:

C:\Temp> dfg 
2009 7 6: 
2009 7 30: 2 weeks 
2009 7 9: today 
2009 7 9 12 32: today 
2009 7 12 5 43: 2 days 
2009 7 3 5 14: 
2010 8 9: 1 year 
2012 8 9: 3 years 
2013 8 9: 4 years 
+0

Huh? Tại sao downvote? –

+0

Tôi biết, phải không? Mọi người sẽ downvote bất cứ điều gì trên trang web này. Không cần phải có ý nghĩa! – mcandre

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