2009-07-09 28 views
7

मैं जानना चाहता हूं कि क्या कोई पुस्तकालय हैं (अधिमानतः DateTime -esque) जो सामान्य दिनांक समय ले सकता है और उपयुक्त रिश्तेदार मानव पठनीय तारीख बना सकता है। अनिवार्य रूप से अधिक सामान्य प्रश्न के सटीक विपरीत: How can I parse relative dates with Perl?मैं पर्ल में सापेक्ष/अनुमानित तिथियां कैसे बना सकता हूं?

जाहिर है, सटीक शब्द/व्याख्या वास्तविक कार्यान्वयन पर निर्भर है, लेकिन मैं भविष्य में तारीख निर्दिष्ट करने के लिए एक सतत तरीका प्रदान करना चाहता हूं। "due in 2 weeks" जैसे अपर्याप्तता को जानना (मेरे लिए) "due on 2009-07-30" से कुछ समय शेष है, यह समझने में अधिक सहायक है।

उदाहरण:

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" 

उत्तर

7

अद्यतन: ऐसा लगता है कि इस कार्यक्षमता एक Template Toolkit Plugin में कार्यान्वित किया जाता। मैं यहां संदर्भ के लिए अपना बाकी उत्तर छोड़ रहा हूं, लेकिन Template::Plugin::DtFormatter देखने के लिए सबसे अच्छी जगह हो सकती है।

उस मॉड्यूल के स्रोत कोड को देखते हुए, मुझे DateTime::Format::Natural पर ले जाया गया जो आप चाहते हैं उससे संबंधित लगता है।

पिछला उत्तर:Date::Calc में

देखो आप डेल्टा Delta_DHMS का उपयोग कर देते हैं। आप उन डेल्टा का उपयोग करने में सक्षम होना चाहिए ताकि यह चुनने के लिए कि आप तिथि को कैसे वाक्यांश पर जा रहे हैं।

यहां एक बहुत ही प्रारंभिक प्रारंभिक बिंदु है। यह छोटी है लेकिन मूल विचार को दर्शाता है। स्वाद के लिए तर्क जोड़ें।

#!/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__ 

आउटपुट: ट्विटर फैन विकी पर Relative Time Scripts पर

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

हू? डाउनवोट क्यों? –

+0

मुझे पता है, है ना? लोग इस साइट पर कुछ भी कम कर देंगे। मतलब होने की जरूरत नहीं है! – mcandre

3

Date::Manip इस तरह की चीजों के लिए बहुत शक्तिशाली है, लेकिन Date::Calc से धीमा है।

संबंधित मुद्दे