2014-04-20 6 views
5

क्षमा करें अगर यह एक डुप्ली है - बहुत सारे प्रश्न हैं लेकिन स्पष्ट रूप से अगर मुझे एक सटीक उत्तर मिल सके तो मैं नहीं पूछूंगा :)इंटेल-जागरूक दिन प्रत्यय के साथ PHP दिनांक प्रारूप?

नोट मैं नेट से आ रहा हूं और एक PHP नौसिखिया हूं, इसलिए वहां नोब-स्केल त्रुटियां हो सकती हैं।

मैं जैसे उत्पादन करने में सक्षम होना चाहते हैं नया डेटटाइम ('2014-01-01 13:15:00') के रूप में: 'बुधवार 1 जनवरी 2014 पूर्वाह्न 1:15 अपराह्न' (संभव - गैर-स्थानीयकृत) या 'Mercredi 1er Janvier 2014 à 13h15' (संभव नहीं है ?)।

मूल रूप से, वहाँ PHP के 'एस' दिनांक स्वरूप विनिर्देशक करने के लिए कोई आईएसओ स्वरूपण बराबर हो रहा है, और न ही strftime के लिए एक है?

IntlDateFormatter :: पूर्ण निकट आता है - लेकिन 'बुधवार, 1 जनवरी' या 'Mercredi 1 janvier' अच्छा अंग्रेजी नहीं है (या फ्रेंच) - लेकिन ऐसा लगता है कि मैं सबसे नज़दीकी हूं? मैं बिना 'चालू' रह सकता है, '' और 'पर' अगर मैं था, लेकिन क्रमसूचक प्रत्यय अच्छा होगा। ('बुधवार एक जनवरी' - यह क्या है, एक कविता की शुरुआत?)

मैंने इस समस्या को संबोधित करते हुए PHP.net पर स्ट्रेटाइम अनुभाग टिप्पणियों पर one example देखा (जो यह सुझाव देता है कि यह एक मुद्दा है) - हालांकि यह केवल अंग्रेजी प्रत्यय जोड़ना प्रतीत होता था, जो अधिक उपयोग नहीं किया गया था? मुझे एक साधारण विधि चाहिए जो यूटीसी डेटाटाइम, एक लोकेल और टाइमज़ोन लेता है और एक स्थानीय स्ट्रिंग आउटपुट करता है - अधिमानतः 'उचित' मानव-पठनीय प्रारूप (ऊपर जैसा) में अंग्रेजी में संभव है। मैं इस दुनिया में हर भाषा के लिए एक प्रारूप स्ट्रिंग लिखे बिना को प्राप्त करना चाहते हैं। यह अच्छा होगा अगर यह मेरे विंडोज़ देव बॉक्स के साथ-साथ * निक्स उत्पादन बॉक्स पर भी काम करता है।

<?php 
$utcdate = new DateTime('2014-01-01 13:15:00', new DateTimeZone('UTC')); 
echo $utcdate->format('l \t\h\e jS \o\f F Y \a\t g:ia') . "<br>"; 
function dumpDates($date, $locale, $tz){ 
    $date->setTimeZone(new DateTimeZone($tz)); 
    $fmt = new IntlDateFormatter($locale, IntlDateFormatter::FULL, IntlDateFormatter::FULL, 
     $tz, IntlDateFormatter::GREGORIAN ); 
    echo $fmt->format($date) . "<br>"; 
    // doesn't work under windows? 
    setLocale(LC_TIME, $locale); 
    echo strftime('%A, %#d %B %Y %I:%M:%S %p', $date->getTimeStamp()) . "<br>"; 

} 
dumpDates($utcdate, 'en_GB', 'Europe/London'); 
dumpDates($utcdate, 'de_DE', 'Europe/Berlin'); 
dumpDates($utcdate, 'fr_FR', 'Europe/Paris'); 
?> 

उत्तर

0

इस सवाल का पूरा हिस्सा - पूर्ण व्याकरण स्पष्टता सहित - या तो बिना ऐसा करने के लिए बहुत मुश्किल होगा, जैसा कि आप कहते हैं, दुनिया में हर भाषा के लिए एक प्रारूप स्ट्रिंग लेखन, या एक पुस्तकालय है कि इस तरह होता है खोजने तार। MomentJs बहुत अच्छा समर्थन प्रदान करता प्रतीत होता है, लेकिन एक सरसरी खोज के बाद, मैं intl एक्सटेंशन के अलावा, PHP समकक्ष नहीं ढूंढ पा रहा हूं।

आप IntlDateFormatter और NumberFormatter के संयोजन का उपयोग, पहले NumberFormatter का उपयोग करके द्वारा क्रमसूचक आधारित संख्या सहित एक अंतर्राष्ट्रीय रूप प्रदान करने की तारीख के क्रमसूचक प्रत्यय/उपसर्ग के लिए पैटर्न प्राप्त करने के चरण के लिए मिल सकता है:

$numFmt = new NumberFormatter('fr_FR', NumberFormatter::ORDINAL); 
$ordinalDay = $numFmt->format($date->format('j')); 

फिर आप एक IntlDateFormatter आप लक्ष्य भाषा की पूर्ण दिनांक स्वरूप के लिए पैटर्न को पुनः प्राप्त करने की अनुमति देता है कि बना सकते हैं:

$dateFormat = new IntlDateFormatter('fr_FR', IntlDateFormatter::FULL, IntlDateFormatter::FULL, $tz, IntlDateFormatter::GREGORIAN); 
$datePattern = $dateFormat->getPattern(); 

अंत में, आप $ d में वर्ग को प्रतिस्थापित करने की आवश्यकता होगी बच गए क्रमसूचक दिन पैटर्न के साथ दिन का प्रतिनिधित्व atePattern:

$datePattern = preg_replace('/d+', "'"+$ordinalDay+"'", $datePattern); 
$dateFormat->setPattern($datePattern); 
$outputDate = $dateFormat->format($date); 

ध्यान दें कि IntlDateFormatter द्वारा इस्तेमाल किया पैटर्न सामान्य पीएचपी दिनांक प्रारूपण प्रारूप कोड से अलग है, here कोड मान्यता प्राप्त के लिए दस्तावेज़ है।

एक चेतावनी; अंतरराष्ट्रीयकृत प्रारूपों में जो काफी कठोर मानकीकृत हैं, एक क्रमिक संख्या जगह से बाहर दिखाई देगी।चीनी में उदाहरण के लिए, प्रारूप है:

y年M月d日EEEE 

और क्रमसूचक उपसर्ग कि लिखा चीनी के लिए मौजूद है एक दिन पहले मूल्य एक चीनी पाठक को अजीब लग सकता है डालने।

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