কেন ডেট.পার্স ভুল ফলাফল দেয়?


345

প্রথম কেস:

new Date(Date.parse("Jul 8, 2005"));

আউটপুট:

শুক্র জুলাই 08 2005 00:00:00 GMT-0700 (পিএসটি)

কেস দুই:

new Date(Date.parse("2005-07-08"));

আউটপুট:

Thu জুলাই 07 2005 17:00:00 GMT-0700 (পিএসটি)


দ্বিতীয় পার্স ভুল কেন?


30
দ্বিতীয় পার্স সেটের জন্য ভুল নয়, এটি কেবলমাত্র স্থানীয় সময়ে প্রথম পার্স করা হয় এবং দ্বিতীয়টি ইউটিসিতে থাকে। দ্রষ্টব্য যে "থু জুল 07 2005 17:00:00 GMT-0700 (PST)" "2005-07-08 00:00" এর মত।
jches


18
আইএসও 8601 এক্সকেসিডি।
ulidtko

1
NaNফায়ারফক্সে কেন একটি তারিখ ফিরে আসছে তা যদি কেউ এখানে জানতে পেরে , আমি আবিষ্কার করেছি যে বেশিরভাগ অন্যান্য ব্রাউজারগুলি (এবং নোড.জেএস) 1 এপ্রিল, 2014 হিসাবে "এপ্রিল 2014" এর মতো একটি দিন ছাড়াই একটি তারিখ পার্স করবে, তবে ফায়ারফক্স NAN প্রদান করে। আপনার অবশ্যই একটি সঠিক তারিখ পাস করতে হবে।
জাজি

উপরের জেসনের মন্তব্যে যোগ করার জন্য: আপনি যদি ফায়ারফক্সে একটি এনএএন পেয়ে থাকেন তবে অন্য একটি সমস্যা হতে পারে যে ফায়ারফক্স এবং সাফারি হাইফেনেটেড তারিখগুলি পছন্দ না করে। কেবল ক্রোম করে। পরিবর্তে একটি স্ল্যাশ ব্যবহার করুন।
ব্যাংককিয়ান

উত্তর:


451

5 তম সংস্করণটি প্রকাশ না হওয়া পর্যন্ত, Date.parseপদ্ধতিটি সম্পূর্ণরূপে বাস্তবায়ন নির্ভর ছিল ( পরবর্তীকৃতটি একটিটির পরিবর্তে একটি সংখ্যা ফেরৎ ব্যতীত new Date(string)সমতুল্য )। ৫ ম সংস্করণে স্পষ্ট করে একটি সরলীকৃত (এবং কিছুটা ভুল) আইএসও -8601 ( জাভাস্ক্রিপ্টে বৈধ তারিখের সময়ের স্ট্রিংগুলি কী? ) সমর্থন করার জন্য প্রয়োজনীয়তা যুক্ত করা হয়েছিল । তবে এগুলি ছাড়া, তাদের যে কোনও আউটপুট (যা ছিল তা না বলে) গ্রহণ করতে হবে তা ছাড়া আর কী গ্রহণ / গ্রহণ করার প্রয়োজন ছিল নাDate.parse(string)DateDate.parsenew Date(string)Date#toString

ECMAScript 2017 (সংস্করণ 8) হিসাবে, বাস্তবায়নগুলির জন্য তাদের আউটপুট পার্স করার জন্য প্রয়োজনীয় ছিল Date#toStringএবং Date#toUTCStringএই স্ট্রিংগুলির বিন্যাস নির্দিষ্ট করা হয়নি।

ECMAScript 2019 (সংস্করণ 9) হিসাবে Date#toStringএবং এর জন্য Date#toUTCString(যথাক্রমে) ফর্ম্যাটটি নির্দিষ্ট করা হয়েছে:

  1. ডিডি এমএমএম ডিডি ওয়াইওয়াই এইচ এইচ: মিমি: এসএস জেডজেড [(টাইমজোন নাম)]
    যেমন মঙ্গল 10 জুলাই 18:39:58 GMT + 0530 (IST)
  2. ডিডিডি, ডিডি এমএমএম YYYY এইচ এইচ: মিমি: এসএস জেড
    উদাঃ মঙ্গল 10 জুলাই 2018 13:09:58 GMT

Date.parseনতুন দুটি বাস্তবায়নে নির্ভরযোগ্যভাবে পার্স করা উচিত এমন আরও 2 টি ফর্ম্যাট সরবরাহ করা (উল্লেখ করা যে সমর্থনটি সর্বব্যাপী নয় এবং অ-সম্মতিযুক্ত বাস্তবায়ন কিছু সময়ের জন্য ব্যবহারে থাকবে)।

আমি যে তারিখ স্ট্রিং ম্যানুয়ালি পার্স করা হয় এবং সুপারিশ করবে তারিখ কন্সট্রাকটর এড়ানোর অস্পষ্টতা বছর, মাস এবং দিন আর্গুমেন্ট সহ ব্যবহৃত:

// parse a date in yyyy-mm-dd format
function parseDate(input) {

  let parts = input.split('-');

  // new Date(year, month [, day [, hours[, minutes[, seconds[, ms]]]]])
  return new Date(parts[0], parts[1]-1, parts[2]); // Note: months are 0-based
}

দুর্দান্ত, আমাকে Date.parseইউকে ডেট ফর্ম্যাটের সাথে আচরণ না করায় এটি ব্যবহার করতে হয়েছিল কারণ কোনও কারণে আমি কাজ করতে পারিনি
বেন

1
সময়ের অংশগুলি @ সিএমএস কোডে নথিভুক্ত করা হয়। আমি "2012-01-31 12:00:00" তারিখের ফর্ম্যাট সহ এই কোডটি ব্যবহার করেছি return new Date(parts[0], parts[1] - 1, parts[2], parts[3], parts[4], parts[5]);, ধন্যবাদ পুরোপুরি!
রিচার্ড রাউট

1
@ সিএমএস বাস্তবায়ন নির্ভরতা বলতে কী বোঝ ?
রই নমির

3
@ রায়নিমির, এর অর্থ হল যে ফলাফলগুলি আপনার ওয়েব কোডটি কী ওয়েব ব্রাউজারে (বা অন্যান্য জাভাস্ক্রিপ্ট প্রয়োগ) চালাচ্ছে তার উপর নির্ভর করে।
স্যামুয়েল এডউইন ওয়ার্ড

1
বিভিন্ন ব্রাউজারে অন্যরকম আচরণ করার সাথে সাথে আমার নতুন তারিখ (স্ট্রিং) নিয়েও সমস্যা হয়েছিল। এটি আইই এর পুরানো সংস্করণগুলিতে ভেঙে যাওয়ার একটি প্রশ্নও নয়, বিভিন্ন ব্রাউজারগুলি কেবল সামঞ্জস্যপূর্ণ নয়। কখনও ডেট.পার্স বা নতুন তারিখ (স্ট্রিং) ব্যবহার করবেন না।
হফম্যান

195

জেএস ইন্টারপ্রেটার লেখার সাম্প্রতিক অভিজ্ঞতার সময় আমি ইসিএমএ / জেএস তারিখের অভ্যন্তরীণ কাজগুলি নিয়ে প্রচুর কুস্তি নিয়েছিলাম। সুতরাং, আমি আমার 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"

আমি আশা করি এই উত্তরটি সহায়ক ছিল।


3
প্রথম প্রথম, এটি একটি চমত্কার লেখার আপ হিসাবে। আমি যাইহোক, একটি নির্ভরতা নির্দেশ করতে চেয়েছিলেন। টাইমজোন স্পেসিফায়ার সম্পর্কিত, আপনি বলেছিলেন: "নির্দিষ্টকরণকারীর অভাবে স্থানীয় সময় ইনপুট অনুমান করা উচিত" " ধন্যবাদ, ECMA-262 স্ট্যান্ডার্ড অনুমানের যে কোনও প্রয়োজন সরিয়ে দেয়। এতে বলা হয়েছে : "অনুপস্থিত সময় অঞ্চল অফসেটের মান হ'ল" জেড "" সুতরাং, নির্দিষ্ট সময়সীমা ব্যতীত একটি তারিখ / সময়ের স্ট্রিংটিকে স্থানীয় সময়ের চেয়ে একটি ইউটিসি হিসাবে ধরে নেওয়া হয়। অবশ্যই, জাভাস্ক্রিপ্টের অনেক কিছুই যেমন বাস্তবায়িত হয় তেমন একটি চুক্তি মনে হয়।
ড্যানিয়েল

2
... সর্বাধিক ব্যবহৃত '1/1/1970' এবং '1/1/1970 00:00:00 এএম' ফর্ম্যাটগুলি সহ। - প্রায়শই কোথায় ব্যবহৃত হয় ? এটা অবশ্যই আমার দেশে নেই।
ulidtko

2
@ জুলিদকো - দুঃখিত, আমি মার্কিন যুক্তরাষ্ট্রে আছি। বাহ ... আপনি ঠিক সেখানে আছেন কিয়েভে। আমি আশা করি আপনি এবং আপনার পরিবার সুরক্ষিত থাকবেন এবং খুব শীঘ্রই সেখানে জিনিসগুলি স্থিতিশীল হবে। নিজের যত্ন নিন এবং সবকিছু দিয়ে সৌভাগ্য কামনা করুন।
drankin2112

এখানে শুধু একটি নোট। দেখে মনে হচ্ছে এটি সাফারি ব্রাউজারগুলির জন্য কাজ করে না (অর্থাত্ আইওএস বা ওএসএক্স)। সে বা আমি অন্য কোনও সমস্যা চলছে।
কীনোম

1
@ ড্যানিয়েল tun ভাগ্যক্রমে ECMAScript লেখকরা তারিখ এবং সময় উপস্থাপনার জন্য সময় অঞ্চল অনুপস্থিত প্রসঙ্গে তাদের ত্রুটিটি স্থির করেছেন। টাইমজোন ছাড়াই এখন তারিখ এবং সময়ের স্ট্রিং হোস্ট টাইমজোন অফসেট ব্যবহার করে (অর্থাত "স্থানীয়")। বিভ্রান্তিকরভাবে, আইএসও 8601 তারিখের ফর্মগুলিকে কেবল ইউটিসি হিসাবে বিবেচনা করা হয় (যদিও এটি স্পেস থেকে বিশেষভাবে পরিষ্কার নয়), যদিও আইএসও 8601 তাদের স্থানীয় হিসাবে বিবেচনা করে, তাই তারা সবকিছু ঠিক করেনি।
রবজি

70

পাগলামির কিছু পদ্ধতি আছে। একটি সাধারণ নিয়ম হিসাবে, যদি কোনও ব্রাউজার কোনও তারিখকে আইএসও -8601 হিসাবে ব্যাখ্যা করতে পারে তবে তা হবে। "2005-07-08" এই শিবিরে পড়ে এবং তাই এটি ইউটিসি হিসাবে পার্স করা হয়। "জুলাই 8, 2005" পারছে না এবং তাই এটি স্থানীয় সময়ে পার্স করা হয়।

দেখুন জাভাস্ক্রিপ্ট এবং তারিখ, কি একটা জগাখিচুড়ি! আরো বেশী.


3
" একটি সাধারণ নিয়ম হিসাবে, যদি কোনও ব্রাউজার কোনও তারিখকে আইএসও -8601 হিসাবে ব্যাখ্যা করতে পারে তবে তা হবে " "সমর্থনযোগ্য নয়। "2020-03-20 13:30:30" অনেকগুলি ব্রাউজার দ্বারা আইএসও 8601 এবং স্থানীয় হিসাবে বিবেচিত হয়, তবে সাফারি দ্বারা অবৈধ তারিখ। অনেকগুলি আইএসও 8601 ফর্ম্যাট রয়েছে যা বেশিরভাগ ব্রাউজারগুলির দ্বারা সমর্থিত নয়, যেমন 2004-W53-7 এবং 2020-092 9
রবজি

7

আরেকটি সমাধান হ'ল তারিখের ফর্ম্যাট সহ একটি সহযোগী অ্যারে তৈরি করা এবং তারপরে ডেটা পুনরায় ফর্ম্যাট করা।

এই পদ্ধতিটি অসমর্থিত উপায়ে ফর্ম্যাট করা তারিখের জন্য দরকারী।

একটি উদাহরণ:

    mydate='01.02.12 10:20:43':
    myformat='dd/mm/yy HH:MM:ss';


    dtsplit=mydate.split(/[\/ .:]/);
    dfsplit=myformat.split(/[\/ .:]/);

    // creates assoc array for date
    df = new Array();
    for(dc=0;dc<6;dc++) {
            df[dfsplit[dc]]=dtsplit[dc];
            }

    // uses assc array for standard mysql format
    dstring[r] = '20'+df['yy']+'-'+df['mm']+'-'+df['dd'];
    dstring[r] += ' '+df['HH']+':'+df['MM']+':'+df['ss'];

5

তারিখগুলি পার্স করার জন্য moment.js ব্যবহার করুন :

var caseOne = moment("Jul 8, 2005", "MMM D, YYYY", true).toDate();
var caseTwo = moment("2005-07-08", "YYYY-MM-DD", true).toDate();

3 য় আর্গুমেন্ট কঠোর বিশ্লেষণ নির্ধারণ করে (2.3.0 হিসাবে উপলব্ধ)। এটি ছাড়া moment.js ভুল ফলাফলও দিতে পারে।


4

Http://blog.dyographics.com/2012/03/javascript-and-dates- কি-mess.html অনুসারে "yyyy / মিমি / ডিডি" ফর্ম্যাটটি স্বাভাবিক সমস্যাগুলি সমাধান করে। তিনি বলেছেন: "যখনই সম্ভব আপনার তারিখের স্ট্রিংয়ের জন্য" YYYY / MM / DD "তে লেগে থাকুন। এটি সর্বজনীনভাবে সমর্থনযোগ্য এবং দ্ব্যর্থহীন this এই ফর্ম্যাটটির সাথে সমস্ত সময় স্থানীয় হয়। আমি পরীক্ষাগুলি সেট করেছি: http://jsfiddle.net/jlanus/ND2Qg/432/ এই ফর্ম্যাটটি: + ymd ক্রম ব্যবহার করে দিন এবং মাসের অর্ডার অস্পষ্টতা এড়িয়ে যায় এবং একটি 4-অঙ্কের বছর + ইউটিসি বনাম স্থানীয় সমস্যা এড়ায় না ডায়াগ্রাফস লোক, স্ল্যাশ + ডানভ্যাক ব্যবহার করে আইএসও ফর্ম্যাটটির সাথে সম্মতি জানায় যে এই ব্রাউজারটি সমস্ত ব্রাউজারে ভাল।


আপনি লেখকের উত্তর দেখতে চাইতে পারেন ।
ব্র্যাড কোচ

আমি বলব jsFizz এর উদাহরণ সহ সমাধানটি যথেষ্ট ভাল কাজ করে যদি আপনি jQuery ব্যবহার করেন যেমন এটি ডেটপিকার পার্সার ব্যবহার করে। আমার ক্ষেত্রে সমস্যাটি জকিগ্রিডের সাথে রয়েছে, তবে এটির পার্সেডেট পদ্ধতি রয়েছে এটি খুঁজে পেয়েছে। তবে যাইহোক, উদাহরণটি আমাকে এর জন্য +1 করে একটি ধারণা দিয়ে সাহায্য করেছিল, ধন্যবাদ।
ভাসিল পপভ

2
ডায়াগ্রাফস সম্পর্কিত নিবন্ধটি ভুল এবং পৃষ্ঠার প্রথম উদাহরণটি পরিষ্কারভাবে ব্যাখ্যা করেছে যে হাইফেনের পরিবর্তে স্ল্যাশ ব্যবহার করা সত্যিই খারাপ পরামর্শ। "2012/03/13" ব্যবহার করে নিবন্ধটি লেখা হয়েছিল, ব্রাউজারটি এটি ইউটিসির পরিবর্তে স্থানীয় তারিখ হিসাবে বিশ্লেষণ করে। ECMAScript স্পেসিফিকেশনটি "YYYY-MM-DD" (ISO8601) ব্যবহারের জন্য সুস্পষ্ট সমর্থনকে সংজ্ঞায়িত করে, তাই সর্বদা হাইফেন ব্যবহার করুন। এটি লক্ষ করা উচিত যে আমি যখন এই মন্তব্যটি লিখছি তখন ক্রোমকে স্ল্যাশগুলিকে ইউটিসি হিসাবে গণ্য করা হয়েছে।
লাচলান হান্ট

4

যদিও সিএমএস ঠিক আছে যে পার্স পদ্ধতিতে স্ট্রিংগুলি পাস করা সাধারণত অনিরাপদ, নতুন ECMA-262 5 তম সংস্করণ (ওরফে ES5) স্পেসিফিকেশনটি 15.9.4.2 এ নির্দেশ করে যে Date.parse()আসলে আইএসও-ফর্ম্যাটড তারিখগুলি পরিচালনা করা উচিত। পুরানো স্পেসিফিকেশন এ জাতীয় কোনও দাবি করেনি। অবশ্যই, পুরানো ব্রাউজারগুলি এবং কিছু বর্তমান ব্রাউজারগুলি এখনও এই ইএস 5 কার্যকারিতা সরবরাহ করে না।

আপনার দ্বিতীয় উদাহরণটি ভুল নয়। এটি ইউটিসি-তে নির্দিষ্ট তারিখ হিসাবে বর্ণিত Date.prototype.toISOString(), তবে এটি আপনার স্থানীয় সময় অঞ্চলে প্রতিনিধিত্ব করা হয়।


1
এবং তারিখের স্ট্রিংগুলির পার্সিংটি ECMAScript 2015 এ আবার পরিবর্তন করা হয়েছে যাতে "2005-07-08" স্থানীয় হয়, ইউটিসি নয়। বিটিডাব্লু, ইএস 5 জুন ২০১১ পর্যন্ত মানক ছিল না (এবং বর্তমানে ইসমাস্ক্রিপ্ট 2015 রয়েছে)। ;-)
রবিজি

1
কেবল জিনিসগুলিকে বিভ্রান্ত করার জন্য, টিসি 39 অক্টোবরের সিদ্ধান্ত নিয়েছে (আমার আগের পোস্টের ঠিক এক মাস পরে) "2005-07-08" ইউটিসি হওয়া উচিত , তবে "" 2005-07-08T00: 00: 00 "স্থানীয় হওয়া উচিত। উভয়ই আইএসও 8601 অনুবর্তী ফরম্যাট উভয় একটি সময় অঞ্চল ছাড়া, কিন্তু ভিন্নভাবে চিকিত্সা করা হয় যান
RobG

2

এই হালকা ওজনের তারিখ পার্সিং লাইব্রেরিতে অনুরূপ সমস্ত সমস্যা সমাধান করা উচিত। আমি লাইব্রেরিটি পছন্দ করি কারণ এটি প্রসারিত করা বেশ সহজ। এটি i18n করাও সম্ভব (খুব সোজা এগিয়ে নয়, তবে তেমন শক্ত নয়)।

পার্সিং উদাহরণ:

var caseOne = Date.parseDate("Jul 8, 2005", "M d, Y");
var caseTwo = Date.parseDate("2005-07-08", "Y-m-d");

এবং স্ট্রিংয়ে ফিরে ফর্ম্যাট করা (আপনি উভয় ক্ষেত্রেই একই ফলাফল দেবেন তা লক্ষ্য করবেন):

console.log( caseOne.dateFormat("M d, Y") );
console.log( caseTwo.dateFormat("M d, Y") );
console.log( caseOne.dateFormat("Y-m-d") );
console.log( caseTwo.dateFormat("Y-m-d") );

2

@ Drankin2112 দ্বারা বিশদে নিকল হিসাবে ক্রস ব্রাউজার-নিরাপদ ফ্যাশনে একটি ডেটটাইম স্ট্রিং রূপান্তর করতে এখানে একটি সংক্ষিপ্ত, নমনীয় স্নিপেট is

var inputTimestamp = "2014-04-29 13:00:15"; //example

var partsTimestamp = inputTimestamp.split(/[ \/:-]/g);
if(partsTimestamp.length < 6) {
    partsTimestamp = partsTimestamp.concat(['00', '00', '00'].slice(0, 6 - partsTimestamp.length));
}
//if your string-format is something like '7/02/2014'...
//use: var tstring = partsTimestamp.slice(0, 3).reverse().join('-');
var tstring = partsTimestamp.slice(0, 3).join('-');
tstring += 'T' + partsTimestamp.slice(3).join(':') + 'Z'; //configure as needed
var timestamp = Date.parse(tstring);

আপনার ব্রাউজারের সাথে একই টাইমস্ট্যাম্পের ফলাফল সরবরাহ করা উচিত Date.parse:

(new Date(tstring)).getTime()

ইতিমধ্যে জেএস-ফর্ম্যাটড তারিখগুলিও ধরার জন্য আমি রেইজেক্সে টি যুক্ত করার পরামর্শ দেব: ইনপুটটাইমস্ট্যাম্প.স্প্লিট (/ [টি \ /: -] / জি)
অ্যান্ডি

আপনি যদি স্ট্রিংটিকে উপাদান অংশগুলিতে বিভক্ত করেন, তবে সবচেয়ে নির্ভরযোগ্য পরবর্তী পদক্ষেপটি সেই অংশগুলি তারিখ নির্মাণকারীর পক্ষে যুক্তি হিসাবে ব্যবহার করা। পার্সারকে দেওয়ার জন্য অন্য স্ট্রিং তৈরি করা আপনাকে কেবল পদক্ষেপ 1 এ ফিরে আসে "" 2014-04-29 13:00:15 "স্থানীয় হিসাবে পার্স করা উচিত, আপনার কোডটি এটি ইউটিসি হিসাবে পুনরায় ফর্ম্যাট করে। :-(
রবিজি

2

উভয়ই সঠিক, তবে তাদের দুটি পৃথক সময় অঞ্চল সহ তারিখ হিসাবে ব্যাখ্যা করা হচ্ছে। সুতরাং আপনি আপেল এবং কমলা তুলনা করেছেন:

// local dates
new Date("Jul 8, 2005").toISOString()            // "2005-07-08T07:00:00.000Z"
new Date("2005-07-08T00:00-07:00").toISOString() // "2005-07-08T07:00:00.000Z"
// UTC dates
new Date("Jul 8, 2005 UTC").toISOString()        // "2005-07-08T00:00:00.000Z"
new Date("2005-07-08").toISOString()             // "2005-07-08T00:00:00.000Z"

আমি Date.parse()কলটি সরিয়ে দিয়েছি কারণ এটি স্ট্রিং আর্গুমেন্টে স্বয়ংক্রিয়ভাবে ব্যবহৃত হয়। আমি ISO8601 ফর্ম্যাট ব্যবহার করে তারিখগুলিও তুলনা করেছি যাতে আপনি আপনার স্থানীয় তারিখগুলি এবং ইউটিসি তারিখের মধ্যে দৃশ্যমানভাবে তুলনা করতে পারেন। সময়গুলি hours ঘন্টা আলাদা হয়, যা সময় অঞ্চল পার্থক্য এবং কেন আপনার পরীক্ষাগুলি দুটি পৃথক তারিখ দেখায় showed

এই একই স্থানীয় / ইউটিসি তারিখগুলি তৈরি করার অন্য উপায় হ'ল:

new Date(2005, 7-1, 8)           // "2005-07-08T07:00:00.000Z"
new Date(Date.UTC(2005, 7-1, 8)) // "2005-07-08T00:00:00.000Z"

তবে আমি এখনও মোমেন্ট.জেএসকে দৃj়ভাবে সুপারিশ করছি যা এতটা সহজ তবে শক্তিশালী :

// parse string
moment("2005-07-08").format()       // "2005-07-08T00:00:00+02:00"
moment.utc("2005-07-08").format()   // "2005-07-08T00:00:00Z"
// year, month, day, etc.
moment([2005, 7-1, 8]).format()     // "2005-07-08T00:00:00+02:00"
moment.utc([2005, 7-1, 8]).format() // "2005-07-08T00:00:00Z"

0

CMS থেকে গৃহীত উত্তর সঠিক হলে আমি শুধু কিছু বৈশিষ্ট্য যোগ করা হয়েছে:

  • ট্রিম এবং পরিষ্কার ইনপুট স্পেস
  • স্ল্যাশ, ড্যাশ, কলোন এবং স্পেস পার্স করুন
  • ডিফল্ট দিন এবং সময় আছে

// parse a date time that can contains spaces, dashes, slashes, colons
function parseDate(input) {
    // trimes and remove multiple spaces and split by expected characters
    var parts = input.trim().replace(/ +(?= )/g,'').split(/[\s-\/:]/)
    // new Date(year, month [, day [, hours[, minutes[, seconds[, ms]]]]])
    return new Date(parts[0], parts[1]-1, parts[2] || 1, parts[3] || 0, parts[4] || 0, parts[5] || 0); // Note: months are 0-based
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.