PHP

2011-01-11 4 views
5

में स्थानीयकृत दिनांक तारों को पार्स करना मेरे पास कुछ कोड है (यह एक वर्डप्रेस प्लगइन का हिस्सा है) जो एक टेक्स्ट स्ट्रिंग लेता है, और तिथि() को दिए गए प्रारूप विनिर्देशक, और घंटे, मिनट, जिसमें एक सरणी में इसे पार्स करने का प्रयास करता है, दूसरा, दिन, महीना, वर्ष।PHP

वर्तमान में, मैं निम्नलिखित कोड का उपयोग (ध्यान दें कि strtotime 01/02/03 जैसी चीजों के साथ बुरी तरह अविश्वसनीय है)

// $format contains the string originally given to date(), and $content is the rendered string 
if (function_exists('date_parse_from_format')) { 
    $content_parsed = date_parse_from_format($format, $content); 
} else { 
    $content = preg_replace("([0-9]st|nd|rd|th)","\\1",$content); 
    $content_parsed = strptime($content, dateFormatToStrftime($format)); 
    $content_parsed['hour']=$content_parsed['tm_hour']; 
    $content_parsed['minute']=$content_parsed['tm_min']; 
    $content_parsed['day']=$content_parsed['tm_mday']; 
    $content_parsed['month']=$content_parsed['tm_mon'] + 1; 
    $content_parsed['year']=$content_parsed['tm_year'] + 1900; 
} 

यह वास्तव में काफी अच्छी तरह से काम करता है, और हर संयोजन मैं फेंक दिया गया है संभाल करने के लिए लगता है इस पर।

हालांकि, हाल ही में किसी ने मुझे 24 Ноябрь, 2010 दिया। यह 24 नवंबर, 2010 के लिए रूसी है [दिनांक प्रारूप j F, Y] था, और इसे वर्ष = 2010, महीने = शून्य, दिन = 24.

क्या कोई भी कार्य है जिसका मैं उपयोग कर सकता हूं जो अनुवाद करना है नवंबर और Ноябрь दोनों में 11 में?

संपादित करें:

print_r(setlocale(LC_ALL, 0)); रिटर्न C चल रहा है। strptime() पर वापस स्विच समस्या को ठीक करने लगता है, लेकिन डॉक्स चेतावनी दी है:

आंतरिक रूप से, इस फ़ंक्शन को कॉल सिस्टम के सी पुस्तकालय द्वारा प्रदान की strptime() फ़ंक्शन। यह कार्य विभिन्न ऑपरेटिंग सिस्टमों में उल्लेखनीय रूप से अलग व्यवहार प्रदर्शित कर सकता है। Date_parse_from_format() का उपयोग, जो इन मुद्दों से ग्रस्त नहीं है, PHP 5.3.0 और बाद में अनुशंसित है।

date_parse_from_format() सही एपीआई है, और यदि हां, तो मैं भाषा को पहचानने के लिए इसे कैसे प्राप्त करूं? रूस as hinted in the manual लिए स्थान निर्धारित करने के लिए

उत्तर

3

प्रयास करें:

महीना और काम करने के दिन नाम और अन्य भाषा निर्भर तार वर्तमान स्थान setlocale()(LC_TIME के साथ सेट) सम्मान करते हैं।

+0

समस्या यह है कि यह एक प्लगइन है जो अन्य लोग उपयोग कर सकते हैं ... "उचित" समाधान ढूंढना अच्छा लगेगा। लेकिन मुझे लगता है कि जब तक मैं काम नहीं कर रहा हूं तब तक मैं सिर्फ 'strptime()' तक रहूंगा ... – Mikeage

+0

@ माइकेज ए यूनिटटेस्ट उचित है :) यदि आप 'date_create_from_format' स्थानीय तारों को पार्स कर सकते हैं तो आप कोशिश कर सकते हैं। मुझे नहीं लगता कि यह करता है, लेकिन फिर भी कोशिश करें। – Gordon

+0

मैंने बिना किसी सफलता के 18 मैग 2013 (= 2013-05-18) की तरह इतालवी तिथि को पार्स करने के लिए strptime() और date_create_from_format दोनों की कोशिश की। – damko

1

आप दिनांक पार्सिंग करने से पहले लोकेल पैरामीटर लेने और locale_set_default ($ locale) को कॉल करने का प्रयास कर सकते हैं।

$originalLocale = locale_get_default(); 
$locale ? $locale : $originalLocale; 
locale_set_default(locale); 

// date parsing code 

locale_set_default($originalLocale); 

मैंने इसका परीक्षण नहीं किया है, लेकिन यह एक कोशिश है। एफवाईआई, मेरा मानना ​​है कि रूसी के लिए लोकेल स्ट्रिंग "आरयू-लैटन"

+0

मेरी समस्या यह है कि मुझे नहीं पता कि लोकेल क्या होना चाहिए, और मुझे लगता है कि यह पहले से ही सेट है – Mikeage

0

मुझे लगता है कि प्रश्न पहले से ही उत्तर दिया गया है लेकिन मेरे द्वारा प्रदान किए गए समाधानों में से कोई भी काम नहीं करता है।

if(!preg_match('/^en_US/', $locale)){ 

    $months_short = array('jan' => t('jan'), 'feb' => t('feb'), 'mar' => t('mar'), 'apr' => t('apr'), 
      'may' => t('may'), 'jun' => t('giu'), 'jul' => t('lug'), 'aug' => t('ago'), 
      'sep' => t('set'), 'oct' => t('ott'), 'nov' => t('nov'), 'dec' => t('dec')); 

    foreach ($months_short as $month_short => $month_short_translated) { 
     $date = preg_replace('/'.$month_short_translated.'/', $month_short, strtolower($date)); 
    } 

} 

$pieces = date_parse_from_format($format,$date); 

if($pieces && $pieces['error_count'] == 0 && checkdate($pieces['month'], $pieces['day'], $pieces['year'])){ 

    return date('Y-m-d', mktime(0,0,0,$pieces['month'],$pieces['day'],$pieces['year'])); 

} 

टी() जहां रिटर्न महीने के लिए अनुवाद संक्षिप्त नाम:

यह मेरा समाधान है।

शायद सबसे अच्छा समाधान नहीं है (क्योंकि कोई वैध अनुवाद नहीं होने पर यह विफल रहता है) लेकिन यह मेरे मामले के लिए काम करता है।

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

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