জাভাস্ক্রিপ্টের তারিখ নির্মাতায় কেন মাসের যুক্তি 0 থেকে 11 পর্যন্ত?


128

Dateনীচের কলটি ব্যবহার করে জাভাস্ক্রিপ্টে কোনও নতুন অবজেক্টের সূচনা করার সময়, আমি জানতে পারি যে মাসের যুক্তিটি শূন্য থেকে শুরু করে গণনা করা হয়।

new Date(2010, 3, 1);  // that's the 1st April 2010!

মাসের যুক্তিটি 0 থেকে শুরু হয় কেন? অন্যদিকে, মাসের যুক্তির দিন (শেষ একটি) 1 থেকে 31 পর্যন্ত একটি সংখ্যা। এটির জন্য কি কোনও ভাল কারণ আছে?


96
এটি কেবল আপনাকে আপনার পায়ের আঙ্গুলের উপরে রাখার জন্য।
সানজেএ

4
শূন্য the Day of the week (integer)
সূচিকৃত একটি

কারণ এটি মানুষের জন্য নয় মেশিনগুলির জন্য কোড করা হয়েছিল। তবে এটি এখনও বাগের বিশাল উত্স কারণ অনেকগুলি কোড (এখনও) মানুষ লিখেছেন :)
ক্রিস্টোফ রাউসি

4
ক্রিস্টোফের একই যুক্তিটি দিন এবং বছরের জন্য প্রযোজ্য।
অগ্নেল কুরিয়ান

2
@ ক্রিস্টোফের রসি হ্যাঁ, যদি এটি মেশিনগুলির জন্য কোড করে দেওয়া হয়, তবে সূচকের দিনগুলি কেন ১ থেকে?
ব্যবহারকারীর 151496

উত্তর:


55

প্রোগ্রামিং জগতের এটি একটি পুরানো (সম্ভবত দুর্ভাগ্যজনক, সম্ভবত মারা যাওয়ার) tradition তিহ্য , পুরানো স্ট্যান্ডার্ড ( পসিক্স ) স্থানীয় সময় সি ফাংশন দেখুন http://linux.die.net/man/3/localtime


14
জেএস Dateঅবজেক্টটি জাভা ০.০ থেকে পোর্ট করা হয়েছিল, সে কারণেই। তার সমস্ত সংক্রান্ত ত্রুটিগুলি inheriting ... stackoverflow.com/questions/344380/...
c69

1
আপনি ঠিক বলেছেন, traditions
তিহ্যগুলি

1
2019 এবং আমি এই আচরণের সাথে সম্পর্কিত একটি সমস্যা সমাধান করছি, সুতরাং যতক্ষণ না কৌণিকের মতো ফ্রেমওয়ার্কগুলি এবং জাভাস্ক্রিপ্টের ভাষাগুলি এটিকে অবজ্ঞা করে না তবুও এটি ঘটবে - 2025 সালে এবং বিন্যাসে নির্দ্বিধায় বোধ করবেন না ;-)
মরিসিও গ্র্যাসিয়া গুটিরেজ

এটি একটি traditionতিহ্য যা সর্বদা আমাকে খেজুরের সাথে ইস্যুগুলি ডিবাগ করার জন্য সময় দেয় ... ভাবছেন যে এই ...তিহ্যটির ফলে কত ঘন্টা নষ্ট কাজের সময় ব্যয় হয়েছে।
বেদমন্ত

102

এই প্রশ্নের আসল উত্তরটি হ'ল এটি অনুলিপি করা হয়েছিল java.util.Date, যার মধ্যে এই প্রশ্নও ছিল। ব্রেন্ডন আইচের কাছ থেকে প্রমাণটি টুইটারে পাওয়া যাবে - যিনি মূলত জাভাস্ক্রিপ্ট প্রয়োগ করেছেন ( Dateবস্তুটি সহ ):

https://twitter.com/BrendanEich/status/481939099138654209

প্রথম টুইট

https://twitter.com/BrendanEich/status/771006397886533632

দ্বিতীয় টুইট

1995 এ এটি হয়েছিল এবং জেডি কে 1.0 বিটাতে ছিল। এটা তোলে 1997 সালে 1996 সালে চালু JDK 1.1 বেরিয়ে আসেন যার উপর ফাংশন বেশীরভাগ অবচিত java.util.Dateতাদের এ নিয়ে যাওয়া java.util.Calendar, কিন্তু এখনও শূন্য ভিত্তিক মাস ছিল এমনকি যে। বিকাশকারীরা এতে বিরক্ত হয়ে জোদা-টাইম লাইব্রেরি তৈরি করেছিল , যা শেষ পর্যন্ত java.timeজাভা 8 (2014) এ বেকড হওয়া প্যাকেজটির দিকে নিয়ে যায় ।

সংক্ষেপে, জাভাটির সঠিকভাবে নকশা করা তারিখ / সময় এপিআই অন্তর্নির্মিত পেতে 18 বছর সময় লেগেছে, তবে জাভাস্ক্রিপ্ট এখনও অন্ধকার যুগে আটকে রয়েছে। আমাদের কাছে মোমেন্ট.জেএস , ডেট-এফএনএস এবং জেএস-জোডার মতো দুর্দান্ত গ্রন্থাগার রয়েছে । তবে এখন Dateপর্যন্ত ভাষার অন্তর্নির্মিত ছাড়া আর কিছুই নেই । আশা করি অদূর ভবিষ্যতে এটির পরিবর্তন হবে।


24
আহ ... ভাল পুরানো ডেমো-চালিত বিকাশ পদ্ধতি method
vlvaro González

@ VlvaroGonzález আমি আসল জেডিকে 1.0 বিকাশকারীকে দোষ দেব, যিনি এটি প্রথম স্থানে প্রবর্তন করেছিলেন।
বেলা 12

30

মাসের দিন ব্যতীত সমস্ত কিছুই 0 ভিত্তিক, রেঞ্জগুলি সহ পুরো তালিকার জন্য এখানে দেখুন :)

এটি আসলে 1 ভিত্তিক দিন যা এখানে বিজোড় খেলাগুলি ... অদ্ভুতভাবে যথেষ্ট। কেন এটি করা হয়েছিল? আমি জানি না ... তবে সম্ভবত একই বৈঠক হয়েছিল তারা প্লাস্টার করে এবং সিদ্ধান্ত নিয়েছিল যে সেমিকোলনগুলি alচ্ছিক।


1
"দিনগুলি ভিত্তিক" দিনের জিনিসটি সম্ভবত কারণ তাদের সঠিক মনের কেউ দিনগুলির জন্য উদাহরণস্বরূপ স্ট্রিং নামের একটি অ্যারে তৈরি করতে পারে না (যেমন, { "first", "second", "third", ..., "twenty-seventh", ... }) এবং এটিকে সূচীকরণ করার চেষ্টা করবে না tm_mday। তারপরে আবার, তারা কেবল একটি ত্রুটি করে নিয়মিত ঘটনা ঘটাতে নিখুঁত ইউটিলিটি দেখেছিল ।
ডি.শ্যাবলি

তারা বছর 0 ভিত্তিক হয় না কেন?
বেদমন্ত

5

এক বছরে সর্বদা 12 মাস থাকে, তাই সি-এর বাস্তবিকাগুলি সূচকগুলি 0.1.11 সহ স্থির স্থির-প্রস্থের অ্যারে ব্যবহার করতে পারে।


2
জাভা তারিখ / ক্যালেন্ডার বাস্তবায়ন কিছু ক্যালেন্ডারের জন্য অতিরিক্ত মাসের জন্য সমর্থন বজায় রাখে। en.wikedia.org/wiki/Undecimber
পয়েন্টি

4

জাভাতেও এটি এর মতো .. সম্ভবত ইনটকে স্ট্রিংয়ে রূপান্তরিত করতে (0 - জানু, 1 ফেব), তারা এইভাবে কোড করেছেন .. কারণ তাদের কাছে মাসের নাম এবং এই মাসের স্ট্রিং (0 থেকে সূচীকৃত) থাকতে পারে might সংখ্যাগুলি যদি তারা 0 থেকে শুরু হয় তবে মাসের স্ট্রিংয়ের মানচিত্র তৈরি করা অনেক সহজ হবে ..


3

আমি জানি এটি সত্যিকারের মূল প্রশ্নের উত্তর নয়, তবে আমি এই সমস্যার আমার পছন্দের সমাধানটি আপনাকে কেবল দেখাতে চেয়েছিলাম, যা সময় সময় পপ আপ হওয়ার সাথে সাথে আমি কখনই মুখস্ত করতে পারি না।

ছোট ফাংশন জিরোফিল যেখানে প্রয়োজন সেখানে জিরোগুলি পূরণ করার কৌশল করে এবং মাসটি কেবল +1যুক্ত করা হয়:

function zerofill(i) {
    return (i < 10 ? '0' : '') + i;
}

function getDateString() {
    const date = new Date();
    const year = date.getFullYear();
    const month = zerofill(date.getMonth()+1);
    const day = zerofill(date.getDate());
    return year + '-' + month + '-' + day;
}

তবে হ্যাঁ, তারিখটির একটি সুন্দর অনিচ্ছাকৃত এপিআই রয়েছে, আমি যখন ব্রেন্ডন আইচের টুইটারটি পড়েছিলাম তখন আমি হাসছিলাম।


2

তারা মাসগুলিকে একটি গণনা হিসাবে বিবেচনা করেছে (প্রথম সূচক 0 হচ্ছে) এবং দিনগুলির সাথে তাদের কোনও নাম যুক্ত না হওয়ার কারণে।

অথবা বরং, তারা ভেবেছিল যে দিনের সংখ্যাটি দিনের আসল উপস্থাপনা (একইভাবে মাসগুলি 12/31 এর মতো তারিখে সংখ্যা হিসাবে উপস্থাপিত হয়), যেন আপনি ভেরিয়েবল হিসাবে সংখ্যার সাথে একটি সংখ্যা তৈরি করতে পারেন তবে বাস্তবে 0-ভিত্তিক।

সুতরাং প্রকৃতপক্ষে, কয়েক মাসের জন্য, তারা ভেবেছিল যে সঠিক গণনা উপস্থাপনাটি হবে সংখ্যার পরিবর্তে মাসের নাম ব্যবহার করা এবং যদি দিনগুলির একটি নাম উপস্থাপন থাকে তবে তারা একই কাজ করত। ভাবুন আমরা যদি 5 জানুয়ারী, 6 জানুয়ারির পরিবর্তে জানুয়ারী 5, জানুয়ারী 6, ইত্যাদি বলি, তবে সম্ভবত তারা কয়েক দিনের জন্য 0-ভিত্তিক গণনাও করেছেন ...

সম্ভবত অবচেতনভাবে তারা কয়েক মাসের জন্য, জানুয়ারি, ফেব্রুয়ারি, ... days এবং Two এক, দুই, তিন, ... days হিসাবে কয়েক দিনের জন্য নামটি বাদ দিয়ে একটি দিন হিসাবে অ্যাক্সেসের দিনগুলি ব্যতীত ভেবেছিলেন, একের জন্য 1 ইত্যাদির মতো 0 থেকে শুরু করা অসম্ভব ...


আপনার মনোবিজ্ঞানীর দ্বৈত শ্রেণির উচিত। এটি এখনও তাদের একটি ভুল, তবে তারা কেন এটি করেছে তা কমপক্ষে আমরা এখন বুঝতে পারি।
জেস্টি

0

এটি কোনও ত্রুটি হতে পারে, তবে আপনি যখন স্ট্রিং হিসাবে সপ্তাহের মাস বা দিন উপস্থাপন করতে চান তবে এটি খুব সহজও হয় [[জান, 'ফেব' ... ইত্যাদি] [নতুন তারিখ () .getMonth ()] এর স্থলে ['', 'জান', feb ... ইত্যাদি] [নতুন তারিখ ()। getMonth ()] বা ['জান', 'feb' ... ইত্যাদি] [নতুন তারিখ ( ) .getMonth () - 1]

মাসের দিনগুলি সাধারণত নামকরণ করা হয় না তাই আপনি সেইগুলির জন্য নাম দিয়ে অ্যারে তৈরি করবেন না। এক্ষেত্রে 1-31 পরিচালনা করা সহজ, তাই আপনাকে প্রতিবার 1 টি বিয়োগ করতে হবে ...


আসলে তা না. আপনি সহজেই একটি বিয়োগ করতে পারেন। এটি সমাধানের চেয়ে আরও সমস্যা তৈরি করে কারণ এখন আপনি যখন খেজুর সহ গণিত করেন, আপনাকে প্রায়ই মাসে মাসে নির্দিষ্ট হেরফের করতে হয়।
Rey
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.