2011-09-20 15 views
27

मुझे DateTime पर्ल मॉड्यूल के बारे में पता है, और DateTime::Format:: मॉड्यूल के कई प्रकार विशिष्ट दिनांक/समय प्रारूपों को पार्स करने के लिए जानते हैं। हालांकि दिनांक/समय तारों के कुछ उदाहरण दिए गए हैं, मैं कैसे पता लगा सकता हूं (कोडिंग/डिज़ाइन समय पर, रनटाइम पर नहीं) किस विशिष्ट मॉड्यूल का उपयोग करना चाहिए?पर्ल में डेटटाइम ऑब्जेक्ट में स्ट्रिंग को कैसे पार्स करें?

उदाहरण के लिए, मैं की तरह तार पार्स करने के लिए करना चाहते हैं: October 28, 2011 9:00 PM PDT

जहां मैं इस देखो और पाते हैं जो सबसे उपयुक्त मॉड्यूल होगा सकता है वहाँ एक सूची सबसे आम दिनांक/समय प्रारूपों के कहीं है?

मुझे कुछ मॉड्यूल के बारे में भी पता है जो रनटाइम पर प्रत्येक दिए गए स्ट्रिंग के प्रारूप को "अनुमान लगाने" का प्रयास करते हैं और उनका सर्वश्रेष्ठ प्रदर्शन करते हैं। लेकिन, संवेदनशील अनुप्रयोगों के लिए, मैं किसी अनुप्रयोग को डिज़ाइन करते समय पहले प्रारूप (यथासंभव सख्ती से) निर्धारित करना चाहता हूं, और उसके बाद एक मॉड्यूल का उपयोग करें जो मुझे चेतावनी देगा यदि कोई स्ट्रिंग निर्दिष्ट प्रारूप से मेल नहीं खाती है।

मुझे इसके बारे में कैसे जाना चाहिए?

उत्तर

36

DateTime::Format::Strptime दिनांक/समय तार लेता है और उन्हें दिनांक समय वस्तुओं में पार्स करता है।

#!/usr/bin/perl 

use strict; 
use warnings; 

use DateTime::Format::Strptime; 

my $parser = DateTime::Format::Strptime->new(
    pattern => '%B %d, %Y %I:%M %p %Z', 
    on_error => 'croak', 
); 

my $dt = $parser->parse_datetime('October 28, 2011 9:00 PM PDT'); 

print "$dt\n"; 

पैटर्न में उपयोग किए गए वर्ण अनुक्रम POSIX मानक हैं। विवरण के लिए 'आदमी strftime' देखें।

+0

धन्यवाद! यही कारण है कि अंत में खत्म हो गया। फिर भी, मुझे यह देखने के लिए सामान्य या मानक दिनांक स्वरूप (आईएसओ, आरएफसी) की एक सूची देखना अच्छा लगेगा कि मेरे पास कुछ विशेष तारों में से कोई भी फिट होगा या नहीं। –

+0

http: //datetime.perl पर डेटटाइम मॉड्यूल (जिसमें कई डीटी :: प्रारूप मॉड्यूल शामिल हैं) की एक (पुरानी तारीख) सूची है।संगठन/विकी/डेटाटाइम/पेज/मॉड्यूल –

+0

प्रारूप को निर्दिष्ट करने के लिए कोई बड़ा प्रशंसक नहीं है – MikeKulls

14

Date::Parse मॉड्यूल पर देखें, यानी str2time() फ़ंक्शन। इसका उपयोग आमतौर पर प्रयुक्त प्रारूपों में से अधिकांश के लिए है।

उदाहरण:

use Date::Parse; 
use DateTime; 

my $str = "Tue, 20 Sep 2011 08:51:08 -0500"; 
my $epoch = str2time($str); 
my $datetime = DateTime->from_epoch(epoch => $epoch); 
+1

धन्यवाद लेकिन इस के साथ तिथियां पार्स कर सकते हैं ठीक है * नहीं * मैं क्या करना चाहता हूं। मैं नहीं चाहता कि फ़ंक्शन स्ट्रिंग के प्रारूप का अनुमान लगाए; मैं उस प्रारूप को निर्दिष्ट करने में सक्षम होना चाहता हूं जिसे कोड परिशुद्धता के साथ अपेक्षा करनी चाहिए। –

+0

अच्छा, यह वही है जो मैं करना चाहता हूं :-) मैं एक प्रारूप की सिफारिश करूंगा लेकिन अगर कोई इसे बदलता है तो यह सबसे अच्छा प्रयास होगा। – MikeKulls

+0

वास्तव में यह मॉड्यूल अच्छा नहीं लगता है। यह 15/4/2015 से 142 9 060633 पर हल करता है लेकिन 15/एपीआर/2015 से 142 9 020000 तक। यह कल्पना करना मुश्किल है कि यह यहां भी क्या कर रहा है क्योंकि यह केवल 11.28 बजे अंतर पार्सिंग तिथियां है। कोई समय घटक नहीं होना चाहिए। – MikeKulls

27

मैं Time::Piece का उपयोग केवल इसलिए करता हूं क्योंकि यह संस्करण 5.10 के बाद मानक पर्ल मॉड्यूल सेट का हिस्सा है।

आप parse date strings पर इसकी क्षमता को हरा नहीं सकते हैं।

my $time = Time::Piece->strptime(
     "October 28, 2011 9:00 PM PDT", 
     "%B %d, %Y %r %Z"); 
+0

अफसोस की बात है, यह संस्करण 5.8 में मानक पर्ल मॉड्यूल सेट का हिस्सा नहीं है (जो अभी भी उच्चतम संस्करण है जिसे आप चला सकते हैं आरएचईएल 5.x)। हालांकि यह 5.14 में है। –

+1

"जो अभी भी उच्चतम संस्करण है जिसे आप RHEL 5.x पर चला सकते हैं"। यह सिर्फ सच नहीं है। यह सच है कि आरएचईएल 5.x मानक के रूप में पर्ल 5.8.8 के साथ आता है। लेकिन आपको हालिया संस्करण बनाने से रोकने में कुछ भी नहीं है। –

+2

@ डेवक्रॉस एक निश्चित बिंदु है Chirs बनाता है। आरपीएम के बाहर पर्ल की एक नई रिलीज स्थापित करना हमेशा संभव नहीं होता है। आरएचईएल मशीन आमतौर पर कॉर्पोरेट उत्पादन वातावरण में होती हैं (अन्यथा, आप फेडोरा या सेंटोस चलाते हैं)। इन प्रणालियों में आमतौर पर _ डेवलपर टूल_ का पूरा सेट नहीं होगा जैसे कि सी संकलक उन पर स्थापित हो, आपके पास उपकरण इंस्टॉल करने के लिए उन पर पहुंच नहीं हो सकती है, और यदि आप कर सकते हैं, तो जो लोग उत्पादन वातावरण चलाते हैं वे देख सकते हैं उत्पादन वातावरण पर पर्ल के अनौपचारिक संस्करण को स्थापित करने वाले किसी व्यक्ति पर नीचे। –

4

आप देख रहे हैं आम तारीख के लिए/समय प्रारूपों DateTime::Locale

use DateTime::Locale 
my $locale = DateTime::Locale->load('DE_de'); 

The following methods return strings appropriate for the DateTime->format_cldr() method:

$locale->date_format_full() 
$locale->date_format_long() 
$locale->date_format_medium() 
$locale->date_format_short() 
$locale->date_format_default() 
$locale->time_format_full() 
$locale->time_format_long() 
$locale->time_format_medium() 
$locale->time_format_short() 
$locale->time_format_default() 
$locale->datetime_format_full() 
$locale->datetime_format_long() 
$locale->datetime_format_medium() 
$locale->datetime_format_short() 
$locale->datetime_format_default() 

पर एक नजर है आप DateTime::Format::CLDR मॉड्यूल

use DateTime::Format::CLDR; 
# 1. Basic example 
my $cldr = DateTime::Format::CLDR->new(
    pattern  => 'dd.MM.yyyy HH:mm:ss', 
    locale  => 'de_DE', 
    time_zone => 'Europe/Berlin', 
); 
my $dt = $cldr->parse_datetime('26.06.2013 11:05:28'); 
संबंधित मुद्दे