প্রশ্ন এবং প্রত্যাশা
যদিও এই প্রশ্নের আক্ষরিক রূপটি প্রসঙ্গে (1899 সাল) ব্যবহারিক, তাত্ত্বিক দিক থেকে এটি কিছুটা অস্পষ্ট। বয়স কত? অতীতের কতদূর আমরা যেতে চাই ? ভবিষ্যতের কি হবে?
ওয়ার্ডপ্রেস সাল থেকে, ইঞ্জিন ব্লগিং যে হিসেবে শুরু করেছে প্রাসঙ্গিক ইন্দ্রিয় নিম্নোক্ত সময় বিঘত হ্যান্ডেল করতে প্রসূত:
- ডাব্লুপি বিদ্যমান ছিল (স্পষ্টত এটি ব্যবহার করতে সক্ষম হবে)
- সম্ভাব্য historicalতিহাসিক পোস্টগুলির ব্যাপ্তি (ইন্টারনেটের অস্তিত্বের মতোই স্পষ্টভাবে পিছনে)
- ভবিষ্যতে যতদূর সম্ভব বিশেষ প্রচেষ্টা ব্যতীত (এটি বিরতি না হওয়া পর্যন্ত কাজ করুন)
ওয়ার্ডপ্রেস ব্যবহার নন-ব্লগিং অ্যাপ্লিকেশনগুলিতে বিকশিত হওয়ার সাথে সাথে এই জাতীয় প্রকল্পগুলির (সাধারণত ইতিহাস এবং শিল্প হিসাবে আমি প্রতিবেদন থেকে দেখেছি) এই স্প্যানের বাইরে তারিখগুলি সহ বিভিন্ন ধরণের সমস্যাগুলি আঘাত করা শুরু করে।
আমার গবেষণার উদ্দেশ্যে আমি নিম্নলিখিত প্রশ্নগুলি তৈরি করেছিলাম:
- দুটি প্রাচীন ও সর্বশেষ পূর্ণ ক্যালেন্ডার বছর কী, যা ওয়ার্ডপ্রেস পোস্টের তারিখগুলি দেশীয় এবং নির্ভরযোগ্যতার সাথে ব্যবহার করা যেতে পারে?
- দেশীয় সীমা ছাড়িয়ে উপলব্ধ স্প্যান বাড়ানোর জন্য কম ঝুলন্ত ফলগুলি (যদি থাকে) কী কী?
প্ল্যাটফর্মের সীমাবদ্ধতা
যেহেতু ওয়ার্ডপ্রেস পিএইচপি অ্যাপ্লিকেশন এবং ডেটা সংরক্ষণের জন্য মাইএসকিউএল ব্যবহার করে এটি তাদের সীমাবদ্ধতার সাপেক্ষে।
মাইএসকিউএল
ওয়ার্ডপ্রেস মাইএসকিউএল টাইপের post_date
কলামে পোস্টের তারিখগুলি সঞ্চয় করে DATETIME
।
ডকুমেন্টেশন অনুসারে এই ধরণের 1000 থেকে 9999 বছর সমর্থন করে :
DATETIME
টাইপ মান উভয় তারিখ এবং সময় অংশ থাকে জন্য ব্যবহৃত হয়। মাইএসকিউএল পুনরুদ্ধার করে এবং ফর্ম্যাটে DATETIME
মান প্রদর্শন 'YYYY-MM-DD HH:MM:SS'
করে। সমর্থিত পরিসর '1000-01-01 00:00:00'
থেকে '9999-12-31 23:59:59'
।
তবে এটি আরও বলে যে পূর্বের মানগুলি কার্যকর হতে পারে , পরবর্তী মানগুলির কোনও উল্লেখ নেই:
জন্য DATE and DATETIME
পরিসীমা বিবরণ, মানে যদিও তার আগে মান কাজ করতে পারে, কোন গ্যারান্টি নেই যে, "সমর্থিত"।
বৌদ্ধিকভাবে আমি মানদণ্ডের পরিসীমা ছাড়াই পর্যবেক্ষণ করেছি, এটি কৌতুকপূর্ণ এবং আমাদের নির্ভরযোগ্যতার শর্তের বাইরে।
পিএইচপি
পিএইচপি প্রোগ্রামিংয়ে ইউনিক্সের টাইমস্ট্যাম্পের তারিখের উপস্থাপনা ব্যাপকভাবে ব্যবহৃত হয়। আমাদের উদ্দেশ্যে ডকুমেন্টেশন অনুসারে (পিএইচপি 5.2+ এবং জেনেরিক 32 বিট পরিবেশ) এটি বছরগুলিকে সমর্থন করে (সম্পূর্ণ) 1902 থেকে 2037 :
একটি টাইমস্ট্যাম্পের বৈধ পরিসীমা সাধারণত থেকে Fri, 13 Dec 1901 20:45:54 UTC
থাকে Tue, 19 Jan 2038 03:14:07 UTC
। (এটি সেই তারিখগুলি যা 32-বিট স্বাক্ষরিত পূর্ণসংখ্যার জন্য সর্বনিম্ন এবং সর্বাধিক মানগুলির সাথে সামঞ্জস্য করে Additionally) অতিরিক্তভাবে, সমস্ত প্ল্যাটফর্মগুলি নেতিবাচক টাইমস্ট্যাম্পগুলিকে সমর্থন করে না, সুতরাং আপনার তারিখের সীমাটি ইউনিক্স পর্বের চেয়ে আগের কোনও সীমাবদ্ধ নয়। এর অর্থ হ'ল উদাহরণস্বরূপ তারিখগুলি Jan 1, 1970
উইন্ডোজ, কিছু লিনাক্স বিতরণ এবং কয়েকটি অন্যান্য অপারেটিং সিস্টেমে কাজ করবে না। পিএইচপি 5.1.0 এবং আরও নতুন সংস্করণগুলি এই সীমাবদ্ধতাটি অতিক্রম করেছে।
নতুন Date/Time
ভিত্তিক হ্যান্ডলিং ব্যতীত bit৪ বিট এবং এটির পরিমাণ প্রায় -২২২ বিলিয়ন থেকে ২৯২ বিলিয়ন বছর , যা সম্ভবত এই সময়ে মানবতার প্রয়োজনের চেয়ে বেশি।
ওয়ার্ডপ্রেস সীমাবদ্ধতা
ওয়ার্ডপ্রেস এর কোড বেসে কিছু অতিরিক্ত সীমাবদ্ধতার পরিচয় দেয় এবং উত্তরাধিকার সূত্রে প্রাপ্ত হয়।
তথ্য প্রবাহ
প্রাথমিক ব্যবহারকারী কার্যপ্রবাহের দৃষ্টিকোণ থেকে তারিখ সম্পর্কিত দুটি প্রক্রিয়াজাতকরণ রয়েছে:
- পোস্ট সম্পাদনা ফর্মের তারিখ ইনপুটটি সঠিকভাবে প্রক্রিয়া করা উচিত এবং ডাটাবেসে সংরক্ষণ করতে হবে
- ডাটাবেসে সংরক্ষণের তারিখটি সঠিকভাবে পড়তে হবে এবং ইন্টারফেসে প্রদর্শিত হবে
নোট করুন যে এগুলি প্রযুক্তিগতভাবে সম্পূর্ণ পৃথক এবং স্বতন্ত্র প্রক্রিয়া। যেমন আরও ব্যাখ্যা করা হয়েছে তাদের রেঞ্জগুলি ওভারল্যাপ হয় না এবং সঠিক তারিখটি সংরক্ষণ করে ওয়ার্ডপ্রেস পরিবেশে এটি সঠিকভাবে পড়ার সামর্থ্য নয়।
স্পষ্ট সীমা
- অ্যাডমিনে ওয়ার্ডপ্রেস পোস্ট সম্পাদক বছরের বিভিন্ন সময়কে মঞ্জুরি দেয়, যেটি পোস্টের তারিখ হিসাবে 100 থেকে 9999 পর্যন্ত জমা দেওয়া যায়
_wp_translate_postdata()
প্রক্রিয়া বছর (ফর্ম থেকে স্বতন্ত্র সংখ্যা হিসাবে জমা দেওয়া) এবং:
- এটি অ-নেতিবাচক > 0 এ সংক্রামিত করে
- এটি ব্যবহার করে যাচাই করে
wp_checkdate()
, যা পিএইচপি নেটিভ কল করে , যা 1 থেকে 32767checkdate()
সীমাবদ্ধ করে
অন্তর্নিহিত সীমা
strtotime()
পিএইচপি ফাংশন একাধিকবার ব্যবহৃত হয় এবং উপরে উল্লিখিত ইউনিক্স টাইমস্ট্যাম্পের সাপেক্ষে, সর্বনিম্ন স্তরে এটি mysql2date()
ডাটাবেস থেকে সমস্ত তারিখের পাঠকে প্রভাবিত করে, ১৯০২ থেকে ২০3737 অবধি উত্তরাধিকার সূত্রে প্রাপ্ত
- ওয়ার্ডপ্রেস নিয়মিত প্রকাশের তারিখ পার্সিংয়ের জন্য ফিরে আসে
get_gmt_from_date()
, যা বছর হওয়ার প্রত্যাশা করে ([0-9]{1,4})
, এটি 1 থেকে 9999 সীমাবদ্ধ করে , অন্যান্য কার্যগুলিতে অনুরূপ প্রক্রিয়াকরণের প্রবল সম্ভাবনা যার জন্য আরও পুঙ্খানুপুঙ্খ কোড অডিট প্রয়োজন হবে
কার্যক্ষেত্রের সম্ভাবনা
wp_checkdate()
হয়েছে wp_checkdate
ফিল্টার, যা এই বৈধতা চেক ওভাররাইড করার অনুমতি দেয়
- শেষ-ব্যবহারকারীর লক্ষ্য অনুসারে আউটপুট যায়
date_i18n()
যার মাধ্যমে date_i18n
ফিল্টার থাকে, তাত্ত্বিকভাবে ইন্টারফেসে তারিখগুলির সম্পূর্ণরূপে বাধা এবং পুনরায় প্রক্রিয়া করার অনুমতি দেয় তবে চ্যালেঞ্জিং যদি ফাংশন ইতিমধ্যে সীমার বাইরে চলে যায় ( false
) টাইমস্ট্যাম্প ইনপুট
উপসংহার
ব্যবহারিক উদ্দেশ্যে এবং ডেটা বহনযোগ্যতার ডেটা ওয়ার্ডপ্রেস পোস্ট তারিখের পরিসীমা 32 বিট ইউনিক্স টাইমস্ট্যাম্পের সমান বলে মনে হয় এবং এতে 1902 থেকে 2037 বছর অন্তর্ভুক্ত রয়েছে ।
এই পরিসীমা পরিবেশের বাইরে পোস্টের কোনও অপারেশনের জন্য নিরীক্ষণ করতে হবে (ইউনিক্স টাইমস্ট্যাম্পগুলির 64 বিট পরিসর, মাইএসকিউএল ডি-ফ্যাক্টো কার্যকারিতা বা মানগুলির জন্য বিকল্প ডাটাবেস স্টোরেজ)। আরও সীমার জন্য ( 1000 এর নীচে, 9999 এর উপরে ) কাস্টম কোডের যথেষ্ট পরিমাণের প্রয়োজন হতে পারে।
যথেচ্ছ তারিখগুলির যে কোনও প্রয়োগের জন্য তা বোঝা যায়:
- এগুলি মাইএসকিউএলে সংরক্ষণ করুন ডাটাবেসের সীমাবদ্ধতার সাপেক্ষে format
- পিএইচপি-তে সম্পূর্ণ কাস্টম-
Date/Time
ভিত্তিক কোড এবং / অথবা ওয়ার্ডপ্রেস ফাংশন ব্যবহার করে ইউনিক্স টাইমস্ট্যাম্প সীমা দ্বারা প্রভাবিত না হওয়ার নিরীক্ষণ করা হয়
কোড টেস্ট বিছানা
নীচের কোডগুলি এবং বছরের পর বছর ধরে নির্বাচিত সেটগুলি উপরের গবেষণা এবং উপসংহারের পরীক্ষার জন্য ব্যবহৃত হয়েছে:
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,
) );
}
}