2009-01-04 13 views
26

मैंने वर्तमान दिनांक और समय प्राप्त करने के लिए पर्ल में localtime फ़ंक्शन का उपयोग किया है लेकिन मौजूदा तिथियों में पार्स करने की आवश्यकता है। मेरे पास निम्नलिखित प्रारूप में जीएमटी तिथि है: "200 90103 12:00" मैं इसे उस तारीख ऑब्जेक्ट में पार्स करना चाहता हूं जिसके साथ मैं काम कर सकता हूं और फिर जीएमटी समय/दिनांक को अपने वर्तमान समय क्षेत्र में परिवर्तित कर सकता हूं जो वर्तमान में पूर्वी मानक समय है । तो मैं इसे "200 90103 12:00" से "20090103 7:00" में कनवर्ट करना चाहता हूं, इस बारे में कोई जानकारी कितनी सराहना की जाएगी।मैं पर्ल में तिथियों का विश्लेषण कैसे कर सकता हूं और समय क्षेत्र कैसे बदल सकता हूं?

+0

यह भी देखें: http: // stackoverflow।कॉम/प्रश्न/95492/कैसे करें-i-convert-a-date – dreeves

+0

इन्हें जांचें: [http://www.bestofperl.com/how-tos/timezone-conversion-date-time ](http:// www.bestofperl.com/how-tos/timezone-conversion-date-time) [http://www.bestofperl.com/how-tos/parsing-datetime-strings](http://www.bestofperl.com/कैसे-tos/पार्सिंग-डेटाटाइम-स्ट्रिंग्स) – Pradeep

उत्तर

44

क्योंकि डेटल हैंडलिंग इंटरफेस में निर्मित पर्ल एक प्रकार का गुंजाइश है और आप लगभग आधे दर्जन चरों को पार करते हैं, बेहतर तरीका DateTime या Time::Piece का उपयोग करना बेहतर तरीका है। डेटटाइम सभी गायन, ऑल-डांसिंग पर्ल डेट ऑब्जेक्ट है, और आप शायद अंततः इसका उपयोग करना चाहेंगे, लेकिन टाइम :: टुकड़ा इस काम के लिए सरल और पूरी तरह से पर्याप्त है, 5.10 के साथ शिपिंग का लाभ है और तकनीक है मूल रूप से दोनों के लिए एक ही है।

टाइम :: टुकड़ा और strptime का उपयोग करके सरल, लचीला तरीका यहां दिया गया है।

#!/usr/bin/perl 

use 5.10.0; 

use strict; 
use warnings; 

use Time::Piece; 

# Read the date from the command line. 
my $date = shift; 

# Parse the date using strptime(), which uses strftime() formats. 
my $time = Time::Piece->strptime($date, "%Y%m%d %H:%M"); 

# Here it is, parsed but still in GMT. 
say $time->datetime; 

# Create a localtime object for the same timestamp. 
$time = localtime($time->epoch); 

# And here it is localized. 
say $time->datetime; 

और यहां के विपरीत, इसके विपरीत है।

प्रारूप ठीक होने के बाद, एक नियमित अभिव्यक्ति ठीक करेगी, लेकिन अगर प्रारूप में परिवर्तन होता है तो आपको रेगेक्स को ट्विक करना होगा।

my($year, $mon, $day, $hour, $min) = 
    $date =~ /^(\d{4}) (\d{2}) (\d{2})\ (\d{2}):(\d{2})$/x; 
तो यह यूनिक्स काल समय (जनवरी 1st के बाद से सेकंड, 1970)

use Time::Local; 
# Note that all the internal Perl date handling functions take month 
# from 0 and the year starting at 1900. Blame C (or blame Larry for 
# parroting C). 
my $time = timegm(0, $min, $hour, $day, $mon - 1, $year - 1900); 

और फिर वापस अपने स्थानीय समय में करने के लिए कनवर्ट

(undef, $min, $hour, $day, $mon, $year) = localtime($time); 

my $local_date = sprintf "%d%02d%02d %02d:%02d\n", 
    $year + 1900, $mon + 1, $day, $hour, $min; 
+4

यहां तक ​​कि जब आप स्वयं को रोल करते हैं, तो कोई भी कम से कम पर्ल 5.6.0 आगे से यूनिक्स और विंडोज सिस्टम दोनों पर POSIX qw (strftime) 'का उपयोग कर सकता है। इससे अंतिम "रोल-अप-खुद" दोनों छोटे और अधिक रखरखाव बनने की अनुमति देता है: 'मेरा $ local_date = strftime "% वाई% एम% डी% एच:% एम \ n", लोकलटाइम ($ time); '। – pjf

+3

$ समय-> लोकलटाइम-> tzoffset AFAICT वर्तमान समय के लिए ऑफ़सेट लौटाता है, दिए गए समय पर नहीं। – ysth

+0

@ysth हां, और यह ठीक है जब तक कि हम ऐतिहासिक समय क्षेत्र परिवर्तनों के बारे में चिंता न करना चाहते हैं, जो मुझे यकीन नहीं है। डीएसटी महत्वपूर्ण हो सकता है। – Schwern

4

अपने पिकअप लें:

रहे हैं एक असंख्य दूसरों, इसमें कोई संदेह नहीं है, लेकिन वे शायद शीर्ष दावेदार हैं।

+0

दिनांक :: 200 9 में कैल्क की काफी गतिविधि थी। – rlandster

+0

लेकिन मुझे नहीं लगता कि गतिविधि 4 जनवरी 200 9 तक हुई थी जब मैंने उस टिप्पणी को लिखा था। हालांकि, यह जानना अच्छा है कि इसे बनाए रखा जा रहा है। पर्ल प्रगति के रूप में अच्छी स्थिर मॉड्यूल को ज़रूरी काम की ज़रूरत नहीं है। –

21

यहाँ एक उदाहरण है, DateTime और उसके strptime प्रारूप मॉड्यूल का उपयोग कर।

use DateTime; 
use DateTime::Format::Strptime; 

my $val = "20090103 12:00"; 

my $format = new DateTime::Format::Strptime(
       pattern => '%Y%m%d %H:%M', 
       time_zone => 'GMT', 
       ); 

my $date = $format->parse_datetime($val); 

print $date->strftime("%Y%m%d %H:%M %Z")."\n"; 

$date->set_time_zone("America/New_York"); # or "local" 

print $date->strftime("%Y%m%d %H:%M %Z")."\n"; 

$ perl dates.pl 
20090103 12:00 UTC 
20090103 07:00 EST 


आप स्थानीयसमय पार्स करने के लिए चाहता था, तो यहां आप इसे कैसे आप कर चाहते हैं :)

use DateTime; 

my @time = (localtime); 

my $date = DateTime->new(year => $time[5]+1900, month => $time[4]+1, 
       day => $time[3], hour => $time[2], minute => $time[1], 
       second => $time[0], time_zone => "America/New_York"); 

print $date->strftime("%F %r %Z")."\n"; 

$date->set_time_zone("Europe/Prague"); 

print $date->strftime("%F %r %Z")."\n"; 
+0

और इसके साथ क्या गलत है? –

+0

आप पार्सिंग भाग खो रहे हैं। – Schwern

+0

ओह, सच है। मैंने गलती से माना कि वह लोकलटाइम आउटपुट का उपयोग करना चाहता था। –

5

मुझे क्या करना चाहते हैं क्या है कि ...

#!/usr/bin/perl 
use Date::Parse; 
use POSIX; 

$orig = "20090103 12:00"; 

print strftime("%Y%m%d %R", localtime(str2time($orig, 'GMT'))); 

है Time::ParseDate और parsedate() का उपयोग Date::Parse और str2time() के बजाय भी कर सकते हैं। ध्यान दें कि वास्तव में मानक एटीएम। ऐसा लगता है कि डेटटाइम (लेकिन हो सकता है कि आप टाइमस्टैम्प को कन्वर्ट करने के लिए ओओ सिंटैक्स का उपयोग नहीं करना चाहें)।

+0

यह एक एफटीडब्ल्यू है। –

-2
use strict; 
use warnings; 
my ($sec,$min,$hour,$day,$month,$year)=localtime(); 
$year+=1900; 
$month+=1; 
$today_time = sprintf("%02d-%02d-%04d %02d:%02d:%02d",$day,$month,$year,$hour,$min,$sec); 
print $today_time; 
+0

यह कोड केवल वर्तमान स्थानीय समय को प्रिंट करता है। यह सवाल का जवाब नहीं देता है। – nwellnhof

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

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