प्रश्न और अपेक्षाएँ
जबकि इस प्रश्न का शाब्दिक रूप संदर्भ (वर्ष 1899) में व्यावहारिक है, यह सैद्धांतिक अर्थों में थोड़ा अस्पष्ट है। कितना पुराना है? अतीत में हम कितनी दूर जाना चाहते हैं? भविष्य के बारे में क्या विचार है?
चूंकि वर्डप्रेस ब्लॉगिंग इंजन के रूप में शुरू हुआ था, उस संदर्भ में यह समय की अवधि के बाद संभालने के लिए विकसित हुआ:
- WP मौजूद थी (स्पष्ट रूप से इसका उपयोग करने में सक्षम होने के लिए)
- संभावित ऐतिहासिक पदों की सीमा (स्पष्ट रूप से जहां तक इंटरनेट मौजूद है)
- विशेष प्रयास के बिना भविष्य में जितना संभव हो सके (काम जब तक यह टूट न जाए)
जैसे-जैसे वर्डप्रेस का उपयोग गैर-ब्लॉगिंग अनुप्रयोगों में विकसित हुआ, इस तरह की परियोजनाओं (आमतौर पर इतिहास और कला जैसा कि मैंने रिपोर्ट से देखा है) ने इस अवधि के बाहर तारीखों के साथ मिश्रित मुद्दों को हिट करना शुरू कर दिया।
अपने शोध के उद्देश्य से मैंने निम्नलिखित प्रश्नों को तैयार किया था:
- दो शुरुआती और नवीनतम पूर्ण कैलेंडर वर्ष क्या हैं, जिनका उपयोग वर्डप्रेस पोस्ट के साथ देशी और मज़बूती से किया जा सकता है?
- देशी रेंज से परे उपलब्ध स्पैन का विस्तार करने के लिए कम लटके फल (यदि हो तो) क्या हैं?
प्लेटफ़ॉर्म सीमाएँ
चूंकि वर्डप्रेस PHP एप्लिकेशन है और डेटा भंडारण के लिए MySQL का उपयोग करता है यह उनकी सीमाओं के अधीन है।
माई एसक्यूएल
वर्डप्रेस MySQL में टाइप के post_date
कॉलम में तारीखों को संग्रहीत करता है DATETIME
।
प्रलेखन के अनुसार यह प्रकार 1000 से 9999 वर्षों का समर्थन करता है :
DATETIME
प्रकार मान है कि दोनों की तारीख और समय भागों को शामिल करने के लिए प्रयोग किया जाता है। MySQL प्रारूप DATETIME
में मानों को पुनः प्राप्त करता है और प्रदर्शित करता है 'YYYY-MM-DD HH:MM:SS'
। समर्थित सीमा है '1000-01-01 00:00:00'
करने के लिए '9999-12-31 23:59:59'
।
हालाँकि यह भी कहता है कि पहले के मान काम कर सकते हैं, बाद के मूल्यों का कोई उल्लेख नहीं:
के लिए DATE and DATETIME
सीमा वर्णन, साधन हालांकि पहले मूल्यों काम हो सकता है, वहाँ कोई गारंटी नहीं है कि "समर्थित"।
जबकि आनुभविक रूप से मैंने मानों को सीमा से बाहर काम करते हुए देखा है, यह एक महत्वपूर्ण और हमारी विश्वसनीयता की स्थिति से बाहर है।
पीएचपी
PHP प्रोग्रामिंग में यूनिक्स टाइमस्टैम्प का प्रतिनिधित्व तिथि का व्यापक रूप से उपयोग किया जाता है। हमारे उद्देश्यों के लिए प्रलेखन के अनुसार (PHP 5.2+ और सामान्य 32 बिट वातावरण) यह वर्ष (पूर्ण रूप से) 1902 से 2037 तक समर्थन करता है :
टाइमस्टैम्प की वैध सीमा आमतौर पर से Fri, 13 Dec 1901 20:45:54 UTC
है Tue, 19 Jan 2038 03:14:07 UTC
। (ये वे तिथियां हैं जो 32-बिट हस्ताक्षरित पूर्णांक के लिए न्यूनतम और अधिकतम मानों के अनुरूप हैं।) इसके अतिरिक्त, सभी प्लेटफ़ॉर्म नकारात्मक टाइमस्टैम्प का समर्थन नहीं करते हैं, इसलिए आपकी तिथि सीमा यूनिक्स युग से पहले नहीं तक सीमित हो सकती है। इसका मतलब यह है कि उदाहरण के लिए दिनांक से पहले Jan 1, 1970
विंडोज, कुछ लिनक्स वितरण और कुछ अन्य ऑपरेटिंग सिस्टम पर काम नहीं करेगा। PHP 5.1.0 और नए संस्करणों ने हालांकि इस सीमा को पार कर लिया है।
इसके अलावा नया Date/Time
आधारित हैंडलिंग 64 बिट का है और लगभग -292 बिलियन से लेकर 292 बिलियन वर्ष तक का है , जो इस समय शायद मानवता की ज़रूरतों को पार कर गया है।
वर्डप्रेस सीमाएँ
वर्डप्रेस अपने कोड बेस में कुछ अतिरिक्त सीमा का परिचय और विरासत में देता है।
डाटा प्रवाह
बुनियादी उपयोगकर्ता वर्कफ़्लो के दृष्टिकोण से दिनांक से संबंधित दो संसाधित हैं:
- पोस्ट एडिट फॉर्म में तारीख इनपुट को सही ढंग से संसाधित किया जाना चाहिए और डेटाबेस में सहेजा जाना चाहिए
- डेटाबेस में सहेजी गई तारीख को सही ढंग से पढ़ा जाना चाहिए और इंटरफ़ेस में दिखाया जाना चाहिए
ध्यान दें कि ये तकनीकी रूप से पूरी तरह से अलग और स्वतंत्र प्रक्रियाएं हैं। जैसा कि आगे बताया गया है कि उनकी सीमाएँ ओवरलैप नहीं होती हैं और सही तिथि को बचाने से वर्डप्रेस वातावरण में इसे सही ढंग से पढ़ने की समान क्षमता नहीं है।
स्पष्ट सीमा
- व्यवस्थापक में वर्डप्रेस पोस्ट संपादक वर्षों की सीमा की अनुमति देता है, जिसे पोस्ट की तारीख, 100 से 9999 के रूप में प्रस्तुत किया जा सकता है
_wp_translate_postdata()
प्रक्रिया वर्ष (फार्म से अलग संख्या के रूप में प्रस्तुत) और:
- इसे गैर-नकारात्मक > 0 के लिए पवित्रा करता है
- इसका उपयोग करके मान्य करता है
wp_checkdate()
, जो PHP को देशी कहता है checkdate()
, जो 1 से 32767 की सीमा लगाता है
सीमित सीमाएँ
strtotime()
PHP फ़ंक्शन कई बार उपयोग किया जाता है और ऊपर वर्णित यूनिक्स टाइमस्टैम्प के अधीन mysql2date()
होता है, जो डेटाबेस से 1908 से 2037 की श्रेणी में विरासत में मिली तारीखों के सभी रीड को प्रभावित करता है।
- वर्डप्रेस नियमित रूप से दिनांक पार्सिंग के लिए नियमित अभिव्यक्ति पर वापस आ जाता है
get_gmt_from_date()
, जो वर्ष होने की उम्मीद करता है ([0-9]{1,4})
, इसे 1 से 9999 तक सीमित करता है , अन्य कार्यों में समान प्रसंस्करण की मजबूत संभावना है जो कि अधिक गहन कोड ऑडिट की आवश्यकता होगी।
वर्कअराउंड की संभावना
wp_checkdate()
है wp_checkdate
फिल्टर, जो इस सत्यापन जाँच ओवरराइड करने देता है
- एंड-यूज़र के उद्देश्य से किया जाने वाला आउटपुट फ़िल्टर के माध्यम से
date_i18n()
होता है date_i18n
, सैद्धांतिक रूप से पूरी तरह से अवरोधन और फिर से तारीख करने के लिए आउटपुट को इंटरफ़ेस में बदलने की अनुमति देता है, लेकिन अगर फ़ंक्शन पहले से ही सीमा से बाहर है (तो false
टाइमस्टैम्प इनपुट)
निष्कर्ष
डेटा के व्यावहारिक उद्देश्यों और पोर्टेबिलिटी के लिए वर्डप्रेस पोस्ट डेट रेंज 32 बिट यूनिक्स टाइमस्टैम्प के बराबर लगती है और इसमें वर्ष 1902 से 2037 तक समावेशी होते हैं ।
इस श्रेणी के वातावरण के किसी भी पोस्ट डेट ऑपरेशन के लिए ऑडिट किया जाना चाहिए (यूनिक्स टाइमस्टैम्प की 64 बिट रेंज, डी-फैक्टो फंक्शनिंग MySQL या वैल्यूज़ के लिए वैकल्पिक डेटाबेस स्टोरेज)। दूर की श्रेणियों के लिए ( 1000 से नीचे, 9999 से ऊपर ) कस्टम कोड की काफी मात्रा की आवश्यकता होने की संभावना है।
मनमाने तारीखों के किसी भी कार्यान्वयन के लिए यह समझ में आता है:
- डेटाबेस सीमाओं के अधीन नहीं प्रारूप में उन्हें MySQL में स्टोर करें
- पूरी तरह से कस्टम-
Date/Time
कोडेड कोड और / या वर्डप्रेस फ़ंक्शन का उपयोग करके PHP में प्रक्रिया का ऑडिट किया गया है जो यूनिक्स टाइमस्टैम्प सीमा से प्रभावित नहीं है
कोड परीक्षण बिस्तर
उपरोक्त अनुसंधान के लिए निम्नलिखित कोड और वर्षों के हाथ के सेट का उपयोग किया गया है:
require ABSPATH . '/wp-admin/includes/post.php';
$timestamp_size_info = array(
'PHP_INT_SIZE' => PHP_INT_SIZE,
'PHP_INT_MAX' => number_format( PHP_INT_MAX ),
'min timestamp' => date( DATE_ISO8601, - PHP_INT_MAX ),
'zero timestamp' => date( DATE_ISO8601, 0 ),
'max timestamp' => date( DATE_ISO8601, PHP_INT_MAX ),
);
r( $timestamp_size_info );
// hand picked set of years to test for assorted limits
$years = array(
'negative' => - 1,
'zero' => 0,
'one' => 1,
'wp min' => 100,
'mysql first' => 1000,
'before unix' => 1899,
'unix first' => 1902,
'current' => 2013,
'unix last' => 2037,
'after unix' => 2039,
'mysql last, wp max' => 9999,
'after checkdate' => 33000,
);
// simulates form submission data
$post = array(
'post_type' => 'post', // shut notice
'edit_date' => 1,
'aa' => 1,
'mm' => '01',
'jj' => '01',
'hh' => '00',
'mn' => '00',
'ss' => '00',
);
// add_filter( 'wp_checkdate', '__return_true' );
foreach ( $years as $name => $year ) {
$post['aa'] = $year;
$translated = _wp_translate_postdata( false, $post );
if ( is_wp_error( $translated ) ) { // wp_checkdate() failed
r( array( 'year' => $year . " ({$name})", 'translated valid' => false ) );
}
else {
$post_date = $translated['post_date'];
$post_date_gmt = $translated['post_date_gmt'];
$translated_valid = (string) $year == substr( $post_date, 0, strpos( $post_date, '-' ) );
$mysql2date = mysql2date( DATE_ISO8601, $post_date );
$mysql2date_valid = (string) $year == substr( $mysql2date, 0, strpos( $mysql2date, '-' ) );
r( array(
'year' => $year . " ({$name})",
'post_date' => $post_date,
'translated valid' => $translated_valid,
'post_date_gmt' => $post_date_gmt,
'mysql2date' => $mysql2date,
'from sql valid' => $mysql2date_valid,
) );
}
}