কেন "2016-02-16" "2016-02-16 00:00" এর সমান নয়?


97

আমি উভয় তারিখের স্ট্রিং এ পাস করার চেষ্টা করছি new Date(t)

আমি আশা করি উভয় স্ট্রিং একই সময়ে প্রতিনিধিত্ব করে, সর্বোপরি, আমি যদি সময়টি বাদ দিই, তবে সেদিনের মধ্যরাত হওয়া উচিত নয়?

কিন্তু যখন,

new Date("2016-02-16 00:00")

প্রত্যাশা অনুযায়ী স্থানীয় সময় 2016-02-16, মধ্যরাত, ফেরত দেয়

new Date("2016-02-16")

২০১-0-০২-১ U, মধ্যরাত ইউটিসি, যা ভুল, বা অন্য স্ট্রিংকে যেভাবে পার্স করে তা আমি প্রত্যাশা করে নি তা নয়।

স্থানীয় সময় হিসাবে বা ইউটিসির মতো সময়টি ফিরিয়ে দেওয়া হোক না কেন, উভয়েরই একই আচরণ থাকলে আমি এটিকে বুঝতে পারি, তবে তারা কেন এইরকম বিভিন্ন জিনিস ফেরত দেয় তা অত্যন্ত বেমানান বলে মনে হয়।

কর্মপরিকল্পনা হিসাবে, যখনই আমি কোনও তারিখের মুখোমুখি হই যার সাথে সম্পর্কিত টাইমস্ট্যাম্প না থাকে আমি ধারাবাহিক আচরণ পেতে "00:00" যুক্ত করতে পারি তবে মনে হয় এটি বরং নাজুক।

আমি একটি ইনপুট উপাদান থেকে টাইপ করে 'ডেটটাইম-লোকাল' টাইপ করি তাই এটি বিশেষত অসঙ্গত বলে মনে হয় যে কোনও পৃষ্ঠার উপাদান দ্বারা ফিরে আসা মানটি নিয়ে কাজ করতে হবে to

আমি কি কিছু ভুল করছি, বা আমার কিছু আলাদা করা উচিত?


4
2016-02-16 00:00- এটি মোটেও বৈধ সময়ের মতো দেখায় না। ecma-international.org/ecma-262/6.0/… , কিন্তু আপনি Tসেখানে রাখার পরেও এটি অবশ্যই অন্যরকম আচরণ করে
zerkms

ইনপুট উপাদানটির মানের ভিত্তিতে আপনি বর্তমানে ঠিক কীভাবে তারিখ অবজেক্টটি অর্জন করছেন?
BoltClock

4
মান অনুযায়ী - "যদি এইচএইচ, মিমি বা এসএস ক্ষেত্র অনুপস্থিত থাকে তবে" 00 "অনুপস্থিত এসএসএস ক্ষেত্রের মান হিসাবে" 000 "ব্যবহৃত হয়। যদি সময় অঞ্চল অফসেট অনুপস্থিত থাকে তবে তারিখের সময়টি স্থানীয় সময় হিসাবে ব্যাখ্যা করা হয়। " --- এটি একই আচরণ করা উচিত।
zerkms

@ বল্টক্লক হুম, দেখে মনে হচ্ছে এটি উপাদানটির মান ক্ষেত্রটি নিয়েছে এবং (জের্কামস লক্ষ্য করা গেছে) কিছু কারণে টি সরিয়ে ফেলছে (আমার মনে হয় যে মানটি ব্যবহারকারীকে এমন একটি প্রসঙ্গে দেখা যাচ্ছে যেখানে "টি" বিভ্রান্ত হবে)
মাইকেল

4
@ মিশেল: দুর্দান্ত ব্রাউজারের কুইর্কগুলি আমার প্রিয়। (বা এটি কোনও
ডিওএম স্পেসিফিকেশন কোক

উত্তর:


101

এটি ES5.1 স্পেসিফিকেশনটি করতে বলে:

অনুপস্থিত সময় অঞ্চল অফসেটের মান হ'ল "জেড"।

এটি আরও বলে:

ফাংশনটি প্রথমে ডেট টাইম স্ট্রিং ফরম্যাটে (15.9.1.15) ডেকে আনা নিয়ম অনুসারে স্ট্রিংয়ের ফর্ম্যাটটি বিশ্লেষণের চেষ্টা করে। যদি স্ট্রিংটি সেই বিন্যাসের সাথে সামঞ্জস্য না করে তবে ফাংশনটি কোনও প্রয়োগ-নির্দিষ্ট হিউরিস্টিকস বা বাস্তবায়ন-নির্দিষ্ট তারিখের ফর্ম্যাটে ফিরে যেতে পারে।

যেহেতু ফর্ম্যাটটির জন্য Tতারিখ এবং সময়ের মধ্যে বিভাজক প্রয়োজন , বৈধ সময়গুলি ইউটিসিতে যায়:

> new Date("2016-02-16T00:00:00")
Tue Feb 16 2016 01:00:00 GMT+0100 (CET)
> new Date("2016-02-16")
Tue Feb 16 2016 01:00:00 GMT+0100 (CET)

... নোড.জেজে থাকাকালীন, একটি অবৈধ সময় (টি বিভাজক ব্যতীত) নির্দিষ্ট স্থানীয় সময় প্রয়োগের দিকে যায় বলে মনে হয়:

> new Date("2016-02-16 00:00:00")
Tue Feb 16 2016 00:00:00 GMT+0100 (CET)

উল্লেখ্য ES6 যে পরিবর্তিত একই এই, ডকুমেন্টেশন অংশ এটা পরিবর্তন করুন:

যদি টাইম জোনের অফসেটটি অনুপস্থিত থাকে তবে তারিখের সময়টিকে স্থানীয় সময় হিসাবে ব্যাখ্যা করা হয়।

ভাঙার আনন্দ ।

সম্পাদনা করুন

টিসি 39 অনুসারে , স্পেসিফিকেশনটির অর্থ সময় অঞ্চল ছাড়া তারিখ এবং সময়ের স্ট্রিং হিসাবে ব্যাখ্যা করা (যেমন "2016-02-16T00: 00: 00") স্থানীয় হিসাবে (আইএসও 8601 অনুযায়ী) গণ্য করা হয়, তবে কেবল তারিখের স্ট্রিং (উদাঃ "2016-02-16") ইউটিসি হিসাবে (যা আইএসও 8601 এর সাথে সঙ্গতিপূর্ণ নয়)।


20
ব্রেকিং এর আনন্দ, সত্যিই। ES7 স্ট্যান্ডার্ডের একটি নতুন খসড়ায়, ইউটিসি থেকে স্থানীয় সময় পরিবর্তনের অংশটি আবার ফিরিয়ে দেওয়া হয়েছিল নতুন স্ট্যান্ডার্ড বলছে তারিখগুলি ইউটিসি হিসাবে ব্যাখ্যা করা উচিত যদি কোনও সময় অঞ্চল নির্ধারিত না হয়, যখন তারিখের সময়গুলি স্থানীয় সময় হিসাবে ব্যাখ্যা করা উচিত যদি সময় অঞ্চল না থাকে উল্লিখিত আছে.
hichris123

4
কেবলমাত্র তারিখ বা তারিখের সময় ফর্ম নির্বিশেষে এগুলি উভয়ই স্থানীয় সময় হওয়া উচিত। আইএসও 8601 কীভাবে এটি কাজ করে। এটি হাস্যকর যে কেবলমাত্র তারিখের ফর্মটি মধ্যরাত ইউটিসি হিসাবে ব্যাখ্যা করা হয়, যেমন একটি কালজয়ী ইউটিসি তারিখটি ধারণাগতভাবেও বোঝায় না। ইসিএমএ টিসি 39-তে এ নিয়ে তীব্র বিতর্ক হয়েছিল। আমি স্থানীয় সময়ের জন্য লড়াই করেছি, এবং হেরেছি। github.com/tc39/ecma262/issues/87
ম্যাট জনসন-পিন্ট

10

মতে নির্দিষ্টকরণের :

ফাংশনটি প্রথমে ডেট টাইম স্ট্রিং ফরম্যাটে (15.9.1.15) ডেকে আনা নিয়ম অনুসারে স্ট্রিংয়ের ফর্ম্যাটটি বিশ্লেষণের চেষ্টা করে। যদি স্ট্রিংটি সেই বিন্যাসের সাথে সামঞ্জস্য না করে তবে ফাংশনটি কোনও প্রয়োগ-নির্দিষ্ট হিউরিস্টিকস বা বাস্তবায়ন-নির্দিষ্ট তারিখের ফর্ম্যাটে ফিরে যেতে পারে।

এবং তারিখের সময়ের স্ট্রিং ফর্ম্যাটগুলি2016-02-16 একটি বৈধ তারিখ হিসাবে গ্রহণ করে

এই ফর্ম্যাটটিতে কেবলমাত্র তারিখের ফর্মগুলি অন্তর্ভুক্ত রয়েছে:

YYYY
YYYY-MM
YYYY-MM-DD

[...] যদি এইচএইচ, মিমি, বা এসএস ক্ষেত্রগুলি অনুপস্থিত থাকে তবে "00" অনুপস্থিত এসএসএস ক্ষেত্রের মান এবং "000" হিসাবে ব্যবহৃত হয়। অনুপস্থিত সময় অঞ্চল অফসেটের মান হ'ল "জেড"।

এইভাবে 2016-02-16অনুবাদ2016-02-16T00:00:00.000Z

অন্যান্য তারিখটি 2016-02-16 00:00বিন্যাসের সাথে সামঞ্জস্য করে না এবং তাই এর বিশ্লেষণ নির্দিষ্টকরণের নির্দিষ্টকরণ। স্পষ্টতই, এই জাতীয় তারিখগুলি স্থানীয় সময় অঞ্চল হিসাবে ধরা হয় এবং আপনার উদাহরণের তারিখটি সময় অঞ্চলের উপর নির্ভর করে বিভিন্ন মান প্রদান করবে:

/* tz = +05:00 */ new Date("2016-02-16 00:00").toISOString() // 2016-02-15T19:00:00.000Z
/* tz = -08:00 */ new Date("2016-02-16 00:00").toISOString() // 2016-02-16T08:00:00.000Z

সারসংক্ষেপ:

  • তারিখের সময় বিন্যাস অনুসারে আচরণটি ভালভাবে সংজ্ঞায়িত হয় - সময় অঞ্চল অফসেটের অভাবে তারিখের স্ট্রিংটিকে ইউটিসি (ইএস 5) বা স্থানীয় (ইএস 6) হিসাবে বিবেচনা করা হয়।
  • অ-সঙ্গতিপূর্ণ তারিখের সময়ের বিন্যাসগুলির জন্য আচরণটি নির্দিষ্টভাবে প্রয়োগ করা হয় - সময় অঞ্চলের অফসেটের অভাবে স্বাভাবিক আচরণের সাথে তারিখটিকে স্থানীয় হিসাবে বিবেচনা করা হয়।
  • বস্তুত হিসাবে, বাস্তবায়ন ফিরে যাওয়ার চয়ন করতে পারেন NaNপরিবর্তে চেষ্টা অ অনুসারী তারিখ বিশ্লেষণ করতে। ইন্টারনেট এক্সপ্লোরার 11;) তে কেবল আপনার কোডটি পরীক্ষা করুন

7

আপনি সম্ভবত ES5, ES6 বাস্তবায়ন এবং আপনার প্রত্যাশিত ফলাফলের মধ্যে পার্থক্যের মধ্যে চলেছেন। প্রতি তারিখ। পার্স MDN এ 2015-10-12 12:00:00 "থেকে নান ইউটিসি বা স্থানীয় সময় অঞ্চল হিসাবে বিশ্লেষণ হতে পারে" "বিশেষত বিভিন্ন নাম ECMAScript বাস্তবায়নের যেখানে মত স্ট্রিং জুড়ে" গুরুত্বপূর্ণ।

ফায়ারফক্স 44 এবং আইই 11-তে অতিরিক্ত পরীক্ষার মাধ্যমে তারা উভয়েই তারিখের অবজেক্ট ফেরত প্রকাশ করে new Date("2016-02-16 00:00") প্রত্যাবর্তন করে, যা কোনও তারিখের উপাদান মান পাওয়ার চেষ্টা করার সময় এনএএন ফেরত দেয় এবং যার স্ট্রিংয়ের মান "অবৈধ তারিখ" ("নাএন" নয়)। সুতরাং "নিয়মিত আচরণ পেতে 00:00" যুক্ত করা সহজেই বিভিন্ন ব্রাউজারে ভেঙে যেতে পারে।

অন্যান্য উত্তরে উল্লিখিত হিসাবে new Date("2016-02-16")ডিফল্টরূপে শূন্যের অফসেট ব্যবহার করে স্থানীয়ের পরিবর্তে মধ্যরাত ইউটিসি উত্পাদন করে।


একই বাস্তবায়নে ওপি বিভিন্ন ফল পেয়েছে বলে মনে হচ্ছে।
সালমান এ

6

DateParser::Parse()ক্রোমের জন্য ভি 8 উত্স কোডের প্রতি ।

ES5 আইএসও 8601 তারিখ:

[('-'|'+')yy]yyyy[-MM[-DD]][THH:mm[:ss[.sss]][Z|(+|-)hh:mm]]

':' এর পরে একটি স্বাক্ষরবিহীন সংখ্যা হ'ল একটি সময় মান, এবং টাইমকম্পোজারে যুক্ত হয়।

অনুপস্থিত থাকলে জেডের কাছে টাইমজোন ডিফল্ট

> new Date("2016-02-16 00:00")
  Tue Feb 16 2016 00:00:00 GMT+0800 (China Standard Time)

উভয় ফর্ম্যাট (যেমন 1970-01-01) এর সাথে মেলে এমন একটি স্ট্রিং ES5 তারিখ-সময়ের স্ট্রিং হিসাবে বিশ্লেষণ করা হবে - যার অর্থ এটি ডিফল্ট হবে UTC time-zone ES5 স্পেসিফিকেশন অনুসরণ করা হলে এটি অনিবার্য।

> new Date("2016-02-16")
Tue Feb 16 2016 08:00:00 GMT+0800 (China Standard Time)

3

২০১-0-০২-১ U, মধ্যরাত ইউটিসি, যা ভুল, বা অন্য স্ট্রিংকে যেভাবে পার্স করে তা আমি প্রত্যাশা করে নি তা নয়।

এটি টাইমজোনটিকে অফসেটে যুক্ত করে 00:00

new Date("2016-02-16") ফলাফল Tue Feb 16 2016 05:30:00 GMT+0530 (India Standard Time)

আমার টাইমজোনটি অফসেট মান (মিনিটের মধ্যে) সহ আইএসটি হচ্ছে +330, সুতরাং এটি 330 মিনিট 00:00 এ যুক্ত করেছে।

অনুযায়ী ECMA-262, বিভাগ 20.3.3.2 Date.parse (STRING)

যদি টসস্ট্রিংয়ের ফলাফল হঠাৎ শেষ হয় তবে সম্পূর্ণ রেকর্ডটি তত্ক্ষণাত ফিরিয়ে দেওয়া হয়। অন্যথায়, পার্স ফলাফল স্ট্রিংকে তারিখ এবং সময় হিসাবে ব্যাখ্যা করে; এটি তারিখ এবং সময় অনুসারে একটি নম্বর দেয়, ইউটিসি সময় মান। স্ট্রিংয়ের বিষয়বস্তুর উপর নির্ভর করে স্ট্রিংটিকে স্থানীয় সময়, একটি ইউটিসি সময় বা অন্য কোনও সময় অঞ্চলের সময় হিসাবে ব্যাখ্যা করা যেতে পারে।

আপনি যখন স্পষ্টভাবে সময়-ইউনিট সেট করেন তখন new Date("2016-02-16 00:00")এটি সেট হিসাবে ব্যবহার করবে hoursএবং minutes,

অন্যথায় 2 0.3.1.16 এখানে বর্ণিত

যদি টাইম জোনের অফসেটটি অনুপস্থিত থাকে তবে তারিখের সময়টিকে স্থানীয় সময় হিসাবে ব্যাখ্যা করা হয়।


হ্যাঁ তবে এটি কেন এক ক্ষেত্রে এটি করে তবে অন্য ক্ষেত্রে নয়?
মাইকেল 5


তাহলে কেন সেগুলি ভিন্ন ফলাফল? স্ট্যান্ডার্ড দাবি করে যে এটি অবশ্যই একই হবে
জের্কামস

@ জারকামস স্ট্যান্ডার্ড বলছে যে আপনি সময় ইউনিটগুলি পাস করার সময় এটি কী করবে, যখন আপনি যাবেন না তখন এটি কী করবে তা তা বলে না। এটি স্পষ্টভাবে বলেছে The String may be interpreted as a local time, a UTC time, or a time in some other time zone, depending on the contents of the String.যে এটি দাবি করা কোথায় এটি দাবি করা উচিত?
gurvinder372

@ gurvinder372 আমি প্রশ্নের মন্তব্যে উদ্ধৃতি সরবরাহ করেছি: "যদি এইচএইচ, মিমি, বা এসএস ক্ষেত্র অনুপস্থিত থাকে তবে" 00 "অনুপস্থিত এসএসএস ক্ষেত্রের মান হিসাবে ব্যবহৃত হয়" 000 "। যদি সময় অঞ্চল অফসেট হয় অনুপস্থিত, তারিখের সময়টিকে স্থানীয় সময় হিসাবে ব্যাখ্যা করা হয়।
zerkms
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.