2013-06-10 4 views
8

मैं एक 2 अंकों साल प्रारूप में डेटाबेस से आ रही डेटा के लिए 2 अंक वाला वर्ष परिवर्तित 13 मैं 2013 में बदलने के लिए देख रहा हूँ मैं नीचे निम्नलिखित कोड की कोशिश की ...पीएचपी 4 अंकों का साल

$result = '13'; 

$year = date("Y", strtotime($result)); 

लेकिन यह 1 9 6 9

लौटाया मैं इसे कैसे ठीक कर सकता हूं?

+1

आप शेष संख्या के साथ डेटाबेस में वर्ष को संग्रहीत कर सकते हैं :) – Smuuf

+3

'$ year = '20' + $ result'। – Matthew

+0

क्या होगा यदि तारीख 1995 होगी? भविष्य की तारीखों को प्रदर्शित करने के लिए, मुझे लगता है कि यह काम नहीं करेगा। – Rorschach

उत्तर

1

समस्या स्ट्रेटोटाइम के साथ है। स्ट्रेटोटाइम ("अब") के साथ एक ही चीज़ आज़माएं।

1

, बस आगे जोड़ते स्ट्रिंग "20" मैन्युअल (सामने के लिए जोड़):

$result = '13'; 
$year = "20".$result; 
echo $year; //returns 2013 
4
$result = '13'; 

$year = '20'.$result; 

if($year > date('Y')) { 
    $year = $year - 100; 
} 

//80 will be changed to 1980 
//12 -> 2012 
15
$dt = DateTime::createFromFormat('y', '13'); 
echo $dt->format('Y'); // output: 2013 

692069 का परिणाम देगा। 70 परिणामस्वरूप 1970 होगा। यदि आप इस तरह के नियम के ठीक हैं तो छोड़ दें, अन्यथा, अपने स्वयं के नियम के अनुसार अपना खुद का शताब्दी डेटा तैयार करें।

+0

दुर्भाग्य से यदि आप अपनी टिप्पणी हटा दिया है। लेकिन, हाँ, तुम सही थे! thx;) और निश्चित रूप से यह * काम * क्योंकि हम वास्तव में 2013 है;) अच्छा बग। हेहे – hek2mgl

+0

कोई बग नहीं है। यह [createfromformat] में php.net पर प्रलेखित है (http://php.net/manual/en/datetime.createfromformat.php) 'y: एक वर्ष का दो अंकों का प्रतिनिधित्व (जिसे 1 9 70- 2069, सम्मिलित) ' – Dwza

1

इस बेवकूफ हो सकता है, लेकिन त्वरित सुधार होगा:

$result = '13'; 
$result = '1/1/20' . $result; 
$year = date("Y", strtotime($result)); // Returns 2013 

या आप कुछ इस तरह का उपयोग कर सकते हैं:

date_create_from_format('y', $result); 
1

DateTime वर्ग, विशेष रूप से DateTime::createFromFormat(), इस के लिए उपयोग करें:

$result = '13'; 
// parsing the year as year in YY format 
$dt = DateTime::createFromFormat('y', $result); 
// echo it in YYYY format 
echo $dt->format('Y'); 
10

जानकारी में से एक महत्वपूर्ण हिस्सा आप को शामिल नहीं किया है: आप कैसे लगता है कि एक 2 अंकों साल 4-अंक में बदला जा चाहिए साल?

उदाहरण के लिए, मुझे लगता है कि आप मानते हैं कि 01/01/13 2013 में है। 01/01/23 के बारे में क्या? क्या वह 2023 है? या 1 9 23? या यहां तक ​​कि 1623?

अधिकतर कार्यान्वयन 100-वर्ष की अवधि का चयन करेंगे और उस अवधि के भीतर 2-अंकों का संदर्भ लेंगे।

सरल उदाहरण: वर्ष 2000-2099 में है।

// $shortyear is guaranteed to be in range 00-99 
$year = 2000 + $shortyear; 

क्या होगा यदि हम एक अलग सीमा चाहते हैं?

$baseyear = 1963; // range is 1963-2062 
        // this is, of course, years of Doctor Who! 
$shortyear = 81; 
$year = 100 + $baseyear + ($shortyear - $baseyear) % 100; 

इसे आज़माएं। यह आपके बेस वर्ष से ऑफसेट की गणना करने के लिए मॉड्यूलो फ़ंक्शन (% के साथ बिट) का उपयोग करता है।

+0

संपादित ऑपरेंड के आदेश को सही करने के। मुझे माफ़ करदो; मैंने इसे अपने फोन पर लिखा था! –

0

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

प्रपत्र रिटर्न 01/01/01 के रूप में $ तिथि (मैं जानता हूँ कि मैं उस शब्द का उपयोग नहीं करना चाहिए लेकिन मैंने किया था)। मैं वर्तमान वर्ष ($ yn) निर्धारित करता हूं और इसकी तुलना करता हूं। कोई फर्क नहीं पड़ता कि किस वर्ष दर्ज किया गया है यदि यह शताब्दी है तो यह 20XX बन जाएगी। लेकिन अगर यह कम से कम 100 (इस सदी) है 89 की तरह इसे बाहर आ जाएगा और यह 1989 साल में परिवर्तन के रूप भविष्य में काम करना जारी रखेंगे। 100 साल के लिए हमेशा अच्छा है। उम्मीद है कि यह आपकी मदद करता है। दो तार

में

// तोड़ $ तारीख

$datebegin = substr($date, 0,6); 

$dateend = substr($date, 6,2); 

// चालू वर्ष के अंतिम दो अंक

$yn=date("y"); 

// सदी का निर्धारण

if ($dateend > $yn && $dateend < 100) 
{ 
    $year2=19; 
} 

elseif ($dateend <= $yn) 

{ 
    $year2=20; 
} 

// दोनों लाने मिल वापस एक

012 में तार
0

2 अंकों में वर्ष के साथ एक्सेल (सीएसवी) जन्म तिथि क्षेत्रों का आयात, प्राचीन n.american शैली दिनांक स्वरूप के साथ इसी तरह के मुद्दों था। मुझे डीबी में उचित yyyy-mm-dd लिखने की आवश्यकता थी। वहाँ वास्तव में क्या अवधि कहा जा रहा है ऐसा करने के लिए कोई रास्ता नहीं है

//$col contains the old date stamp with 2 digit year such as 2/10/66 or 5/18/00 

$yr = \DateTime::createFromFormat('m/d/y', $col)->format('Y'); 
if ($yr > date('Y')) $yr = $yr - 100; 
$md = \DateTime::createFromFormat('m/d/y', $col)->format('m-d'); 
$col = $yr . "-" . $md; 

//$col now contains a new date stamp, 1966-2-10, or 2000-5-18 resp. 
0

यदि आपको विश्वास है साल, 20 कुछ तो पहले उत्तर काम करता है हमेशा होता है अन्यथा,: जबकि सही नहीं है, यह मैं क्या किया है। आपको पता नहीं है कि वर्ष पिछले, वर्तमान या भविष्य की शताब्दी है या नहीं।

दी, वहाँ प्रश्न में पर्याप्त जानकारी निर्धारित करने के लिए करता है, तो इन तिथियों हमेशा <= now हैं नहीं है, लेकिन फिर भी, आप अगर 011901 या 2001 था पता नहीं होता। यह सिर्फ संभव नहीं है।

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