জেএস ইন্টারপ্রেটার লেখার সাম্প্রতিক অভিজ্ঞতার সময় আমি ইসিএমএ / জেএস তারিখের অভ্যন্তরীণ কাজগুলি নিয়ে প্রচুর কুস্তি নিয়েছিলাম। সুতরাং, আমি আমার 2 সেন্ট এখানে নিক্ষেপ করব। আশা করি এই জিনিসগুলি ভাগ করে নেওয়া অন্যদের ব্রাউজারগুলির মধ্যে তারিখগুলি কীভাবে পরিচালনা করবে তার মধ্যে পার্থক্য সম্পর্কে যে কোনও প্রশ্ন রয়েছে।
ইনপুট সাইড
সমস্ত বাস্তবায়নগুলি তাদের তারিখের মানগুলিকে অভ্যন্তরীণভাবে 64-বিট সংখ্যা হিসাবে সংরক্ষণ করে যা 1970-01-01 ইউটিসি (জিএমটি ইউটিসি হিসাবে একই জিনিস) থেকে মিলসেকেন্ড (এমএস) সংখ্যাটি উপস্থাপন করে। এই তারিখটি ECMAScript মহাকাব্য যা অন্যান্য ভাষা যেমন জাভা এবং পসিক্স সিস্টেম যেমন ইউএনআইএক্স দ্বারাও ব্যবহৃত হয়। যুগের পরে ঘটে যাওয়া তারিখগুলি ইতিবাচক সংখ্যা এবং পূর্বের তারিখগুলি negativeণাত্মক।
সমস্ত বর্তমান ব্রাউজারগুলিতে নিম্নলিখিত কোডটি একই তারিখ হিসাবে ব্যাখ্যা করা হয় তবে স্থানীয় সময় অঞ্চল অফসেট সহ:
Date.parse('1/1/1970'); // 1 January, 1970
আমার টাইমজোনগুলিতে (EST, যা -05: 00), ফলাফলটি 18000000 হয় কারণ এটি 5 ঘন্টার মধ্যে কত এমএস হয় (এটি দিবালোকের সঞ্চয়ী মাসগুলিতে মাত্র 4 ঘন্টা)। মান বিভিন্ন টাইম জোনে আলাদা হবে। এই আচরণটি ECMA-262 এ নির্দিষ্ট করা হয়েছে যাতে সমস্ত ব্রাউজারগুলি এটি একইভাবে করে।
ইনপুট স্ট্রিং ফর্ম্যাটে কিছু বৈকল্পিকতা রয়েছে যেগুলি প্রধান ব্রাউজারগুলি তারিখ হিসাবে বিশ্লেষণ করবে তবে তারা মূলত সময় অঞ্চলগুলি এবং দিবালোক সংরক্ষণের ক্ষেত্রে একইভাবে ব্যাখ্যা করে যদিও পার্সিং মূলত বাস্তবায়ন নির্ভর।
তবে আইএসও 8601 ফর্ম্যাটটি আলাদা। এটি ECMAScript 2015 (এডি 6) তে বর্ণিত দুটি মাত্র ফর্ম্যাটগুলির মধ্যে একটি বিশেষত যা অবশ্যই সমস্ত বাস্তবায়ন দ্বারা একইভাবে পার্স করা উচিত (অন্যটি তারিখ.প্রোটোটাইপ.টোস্ট্রিংয়ের জন্য নির্দিষ্ট ফর্ম্যাট )।
তবে, এমনকি আইএসও 8601 ফর্ম্যাট স্ট্রিংয়ের জন্যও কিছু বাস্তবায়ন এটিকে ভুল করে। ক্রোম এবং ফায়ারফক্সের একটি তুলনামূলক আউটপুট এখানে যখন উত্তরটি মূলত আমার মেশিনে আইএসও 8601 ফর্ম্যাট স্ট্রিং ব্যবহার করে আমার মেশিনে লেখা হয়েছিল তখন সমস্ত বাস্তবায়নে একই মানকে পার্স করা উচিত :
Date.parse('1970-01-01T00:00:00Z'); // Chrome: 0 FF: 0
Date.parse('1970-01-01T00:00:00-0500'); // Chrome: 18000000 FF: 18000000
Date.parse('1970-01-01T00:00:00'); // Chrome: 0 FF: 18000000
- প্রথম ক্ষেত্রে, "জেড" স্পেসিফার ইঙ্গিত দেয় যে ইনপুটটি ইউটিসি সময়ে হয় তাই মহাকাশ থেকে অফসেট হয় না এবং ফলাফল 0 হয়
- দ্বিতীয় ক্ষেত্রে, "-0500" নির্দিষ্টকারী নির্দেশ করে যে ইনপুটটি GMT-05: 00 এ রয়েছে এবং উভয় ব্রাউজারই ইনপুটটিকে -05: 00 টাইমজোন হিসাবে ব্যাখ্যা করে interpret এর অর্থ হ'ল ইউটিসি মানটি মহাকাব্য থেকে অফসেট, যার অর্থ তারিখের অভ্যন্তরীণ সময় মান 18000000ms যোগ করা।
- তৃতীয় কেস, যেখানে কোনও নির্দিষ্টকরণকারী নেই, হোস্ট সিস্টেমের জন্য স্থানীয় হিসাবে বিবেচনা করা উচিত । এফএফ সঠিকভাবে স্থানীয় সময় হিসাবে ইনপুটকে আচরণ করে যখন ক্রোম এটিকে ইউটিসি হিসাবে গণ্য করে, তাই বিভিন্ন সময় মান তৈরি করে। আমার জন্য এটি সঞ্চিত মানটিতে 5 ঘন্টার পার্থক্য তৈরি করে, যা সমস্যাযুক্ত। বিভিন্ন অফসেট সহ অন্যান্য সিস্টেমগুলি বিভিন্ন ফলাফল পাবে।
এই পার্থক্যটি 2020 হিসাবে স্থির করা হয়েছে, তবে আইএসও 8601 ফর্ম্যাট স্ট্রিংগুলি পার্স করার সময় ব্রাউজারগুলির মধ্যে অন্যান্য তাত্পর্য রয়েছে।
তবে এটি আরও খারাপ হয়। ECMA-262 এর এক গৌরব হ'ল ISO 8601 তারিখ-কেবলমাত্র ফর্ম্যাট (YYYY-MM-DD) কে ইউটিসি হিসাবে পার্স করা দরকার, যেখানে আইএসও 8601 এর স্থানীয় হিসাবে পার্স করার প্রয়োজন। টাইম জোনের নির্দিষ্টকরণ ছাড়াই দীর্ঘ এবং সংক্ষিপ্ত আইএসও তারিখের ফর্ম্যাটগুলির সাথে এফএফ থেকে আউটপুট দেওয়া হচ্ছে।
Date.parse('1970-01-01T00:00:00'); // 18000000
Date.parse('1970-01-01'); // 0
সুতরাং প্রথমটি স্থানীয় হিসাবে পার্স করা হয়েছে কারণ এটির আইএসও 8601 তারিখ এবং সময় নেই কোন সময়, এবং দ্বিতীয়টি ইউটিসি হিসাবে পার্স করা হয়েছে কারণ এটি কেবল আইএসও 8601 তারিখ।
সুতরাং, আসল প্রশ্নের সরাসরি উত্তর দেওয়ার জন্য, "YYYY-MM-DD"
ইসিএমএ-262 দ্বারা ইউটিসি হিসাবে ব্যাখ্যা করা প্রয়োজন, অন্যটি স্থানীয় হিসাবে ব্যাখ্যা করা হয়েছে। এই জন্য:
এটি সমতুল্য ফলাফল দেয় না:
console.log(new Date(Date.parse("Jul 8, 2005")).toString()); // Local
console.log(new Date(Date.parse("2005-07-08")).toString()); // UTC
এটি করে:
console.log(new Date(Date.parse("Jul 8, 2005")).toString());
console.log(new Date(Date.parse("2005-07-08T00:00:00")).toString());
নীচের লাইনটি তারিখের স্ট্রিংগুলি পার্স করার জন্য। কেবলমাত্র আইএসও 8601 স্ট্রিং যা আপনি ব্রাউজারগুলিতে নিরাপদে পার্স করতে পারেন তা অফসেটের সাথে দীর্ঘ ফর্ম (হয় ± এইচএইচ: মিমি বা "জেড")। যদি আপনি এটি করেন তবে আপনি নিরাপদে স্থানীয় এবং ইউটিসি সময়ের মধ্যে পিছনে যেতে পারবেন।
এটি ব্রাউজারগুলিতে (আই 9 এর পরে) জুড়ে কাজ করে:
console.log(new Date(Date.parse("2005-07-08T00:00:00Z")).toString());
বেশিরভাগ বর্তমান ব্রাউজারগুলি অন্যান্য ইনপুট ফর্ম্যাটগুলি সমানভাবে ব্যবহার করে, ঘন ঘন ব্যবহৃত '1/1/1970' (এম / ডি / ওয়াইওয়াইওয়াই) এবং '1/1/1970 00:00:00 এএম' (এম / ডি / ওয়াইওয়াই এইচএইচ) : মিমি: এসএস এপি) ফর্ম্যাটগুলি। নিম্নলিখিত সমস্ত ফর্ম্যাটগুলি (শেষ ব্যতীত) সমস্ত ব্রাউজারে স্থানীয় সময় ইনপুট হিসাবে বিবেচনা করা হয়। আমার টাইমজোনের সমস্ত ব্রাউজারে এই কোডটির আউটপুট একই। হোস্ট টাইমজোন নির্বিশেষে শেষটি -05: 00 হিসাবে বিবেচিত হবে কারণ অফসেটটি টাইমস্ট্যাম্পে সেট করা আছে:
console.log(Date.parse("1/1/1970"));
console.log(Date.parse("1/1/1970 12:00:00 AM"));
console.log(Date.parse("Thu Jan 01 1970"));
console.log(Date.parse("Thu Jan 01 1970 00:00:00"));
console.log(Date.parse("Thu Jan 01 1970 00:00:00 GMT-0500"));
তবে, যেহেতু ইসিএমএ -26২-তে নির্দিষ্ট করা ফর্ম্যাটগুলির পার্সিং সামঞ্জস্যপূর্ণ নয়, তাই কখনও কখনও বিল্ট p পার্সার-এ নির্ভর না করার জন্য এবং সর্বদা ম্যানুয়ালি স্ট্রিংগুলি বিশ্লেষণ করার পরামর্শ দেওয়া হয়, একটি লাইব্রেরি ব্যবহার করে এবং পার্সারে ফর্ম্যাটটি সরবরাহ করুন।
যেমন মুহুর্তে আপনি লিখতে পারেন:
let m = moment('1/1/1970', 'M/D/YYYY');
আউটপুট সাইড
আউটপুট দিকে, সমস্ত ব্রাউজারগুলি একইভাবে সময় অঞ্চলগুলি অনুবাদ করে তবে তারা স্ট্রিং ফর্ম্যাটগুলি আলাদাভাবে পরিচালনা করে। এখানে toString
ফাংশন এবং তারা আউটপুট কি। আমার মেশিনে 5:00 এএম toUTCString
এবং toISOString
ফাংশন আউটপুটটি লক্ষ্য করুন । এছাড়াও, সময় অঞ্চলটির নাম একটি সংক্ষেপণ হতে পারে এবং বিভিন্ন বাস্তবায়নে আলাদা হতে পারে।
মুদ্রণের আগে ইউটিসি থেকে স্থানীয় সময় রূপান্তর করে
- toString
- toDateString
- toTimeString
- toLocaleString
- toLocaleDateString
- toLocaleTimeString
সঞ্চিত ইউটিসি সময় সরাসরি প্রিন্ট করে
- toUTCString
- toISOString
ক্রোমে
toString Thu Jan 01 1970 00:00:00 GMT-05:00 (Eastern Standard Time)
toDateString Thu Jan 01 1970
toTimeString 00:00:00 GMT-05:00 (Eastern Standard Time)
toLocaleString 1/1/1970 12:00:00 AM
toLocaleDateString 1/1/1970
toLocaleTimeString 00:00:00 AM
toUTCString Thu, 01 Jan 1970 05:00:00 GMT
toISOString 1970-01-01T05:00:00.000Z
ফায়ারফক্সে
toString Thu Jan 01 1970 00:00:00 GMT-05:00 (Eastern Standard Time)
toDateString Thu Jan 01 1970
toTimeString 00:00:00 GMT-0500 (Eastern Standard Time)
toLocaleString Thursday, January 01, 1970 12:00:00 AM
toLocaleDateString Thursday, January 01, 1970
toLocaleTimeString 12:00:00 AM
toUTCString Thu, 01 Jan 1970 05:00:00 GMT
toISOString 1970-01-01T05:00:00.000Z
আমি সাধারণত স্ট্রিং ইনপুট জন্য আইএসও ফর্ম্যাট ব্যবহার করি না। তারিখগুলি স্ট্রিং হিসাবে বাছাই করা দরকার যখন কেবলমাত্র সেই বিন্যাসটিই আমার পক্ষে উপকারী। আইএসও ফর্ম্যাটটি যেমন রয়েছে তেমন সাজানো যায় অন্যদিকে না। আপনার যদি ক্রস-ব্রাউজারের সামঞ্জস্যতা রাখতে হয়, হয় সময় অঞ্চল নির্দিষ্ট করুন বা একটি সামঞ্জস্যপূর্ণ স্ট্রিং ফর্ম্যাট ব্যবহার করুন।
কোড new Date('12/4/2013').toString()
নিম্নলিখিত অভ্যন্তরীণ ছদ্ম-রূপান্তর মাধ্যমে যায়:
"12/4/2013" -> toUCT -> [storage] -> toLocal -> print "12/4/2013"
আমি আশা করি এই উত্তরটি সহায়ক ছিল।