জাভা ক্যালেন্ডারে কেন জানুয়ারী মাস 0?


300

ইন java.util.Calendar, জানুয়ারী মাস 0 হিসাবে গণ্য করা হয়, 1 মাস নয়। এর কোনও নির্দিষ্ট কারণ আছে কি?

আমি অনেক লোককে এ সম্পর্কে বিভ্রান্ত হতে দেখেছি ...


4
জানুয়ারি, ফেব্রুয়ারী ইত্যাদির অস্তিত্বগুলি যেহেতু বিদ্যমান, সেহেতু কি এ জাতীয় প্রয়োগের বিবরণ নয়? তারিখের ক্লাসগুলি যথাযথ জাভা এনাম সাপোর্টের পূর্বাভাস দেয়।
gnud

6
আরও বেশি বিরক্তিকর - কেন একটি অনুলিপি আছে?
ম্যাট বি

40
@ অদ্ভুত: না, এটি বাস্তবায়নের বিশদ নয়। যখন আপনাকে "প্রাকৃতিক" বেসে (যেমন জানুয়ারী = 1) একটি পূর্ণসংখ্যা দেওয়া হয় তখন এটিকে ব্যথার সৃষ্টি করে এবং ক্যালেন্ডার এপিআই দিয়ে আপনার এটি ব্যবহার করা দরকার।
জন স্কিটি

1
@ ম্যাট বি: এটি ত্রিশ মাস ধরে অ গ্রেগরিয়ান ক্যালেন্ডারগুলির (চন্দ্র ক্যালেন্ডার ইত্যাদি) জন্য। এজন্য পদ সংখ্যাতে না ভাবা ভাল, তবে ক্যালেন্ডারটিকে স্থানীয়করণ দিন let
এরিকসন

7
13-মাসের যুক্তিটি কোনও মানে করে না। যদি তা হয় তবে অতিরিক্ত মাস 0 বা 13 হবে না কেন?
কুইন টেলর

উত্তর:


323

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

নিজের পক্ষে নিজেকে করুন এবং পরিবর্তে জোদা সময় ব্যবহার করুন, বা সম্ভবত জেএসআর -310

সম্পাদনা: যে কারণগুলির জন্য - অন্যান্য উত্তরে যেমন উল্লেখ করা হয়েছে, এটি পুরানো সি এপিআইগুলির কারণে, বা 0 থেকে সমস্ত কিছু শুরু করার সাধারণ অনুভূতির কারণে হতে পারে ... তবে দিনগুলি অবশ্যই 1 দিয়ে শুরু করা উচিত of মূল বাস্তবায়ন দলের বাইরের কেউ সত্যই কারণগুলি বর্ণনা করতে পারে কিনা তা নিয়ে আমি সন্দেহ করি - তবে আবার আমি পাঠকদের প্রতি আহ্বান জানাব যে খারাপ সিদ্ধান্ত কেন নেওয়া হয়েছে সে সম্পর্কে এতটা চিন্তা না করার জন্য, যাতে ঘৃণ্যতার পুরো বিষয়টি সম্পর্কে নজর দেওয়া যায় java.util.Calendarএবং আরও ভাল কিছু পাওয়া যায়।

এক বিন্দু যা হয় 0 ভিত্তিক সূচী ব্যবহারের পক্ষে এটি "নামের অ্যারে" ভালো জিনিস তোলে সহজ:

// I "know" there are 12 months
String[] monthNames = new String[12]; // and populate...
String name = monthNames[calendar.get(Calendar.MONTH)];

অবশ্যই, আপনি 13 মাসের সাথে ক্যালেন্ডার পাওয়ার সাথে সাথে এটি ব্যর্থ হবে ... তবে কমপক্ষে নির্দিষ্ট আকারটি আপনার প্রত্যাশিত মাসের সংখ্যা।

এটি কোনও ভাল কারণ নয়, তবে এটি একটি কারণ ...

সম্পাদনা: একটি মন্তব্য সাজানোর অনুরোধ হিসাবে তারিখ / ক্যালেন্ডারের সাথে আমার কী ভুল বলে মনে হয় সে সম্পর্কে কয়েকটি ধারণা অনুরোধ করে:

  • অবাক করা ঘাঁটি (১৯০০ সালে তারিখের বর্ষ ভিত্তি হিসাবে অবহেলিত কনস্ট্রাক্টরদের জন্য স্বীকৃত; উভয় ক্ষেত্রেই মাসের ভিত্তি হিসাবে 0)
  • পরিবর্তনশীলতা - অপরিবর্তনীয় ধরনের ব্যবহার করে এটি তোলে অনেক কি সত্যিই কার্যকরভাবে এর সাথে কাজ করা সহজ মান
  • অপর্যাপ্ত একটি প্রকারের সেট: এটি আলাদা Dateএবং Calendarবিভিন্ন জিনিস হিসাবে ভাল, তবে "স্থানীয়" বনাম "জোনেড" মানগুলির পৃথকীকরণ অনুপস্থিত, যেমন তারিখ / সময় বনাম তারিখ বনাম সময়
  • একটি এপিআই যা স্পষ্টভাবে নাম দেওয়া পদ্ধতির পরিবর্তে ম্যাজিক ধ্রুবকগুলির সাথে কুশল কোডের দিকে পরিচালিত করে
  • এমন একটি এপিআই যা সম্পর্কে বিতর্ক করা খুব শক্ত - যখন জিনিসগুলি পুনরায় সংশোধন করা হয় ইত্যাদি সম্পর্কে সমস্ত ব্যবসায়
  • "এখন" -কে ডিফল্ট করতে প্যারামিটারলেস কনস্ট্রাক্টর ব্যবহার করে, যা পরীক্ষার জন্য কঠোর কোডের দিকে নিয়ে যায়
  • Date.toString()বাস্তবায়ন যা সবসময় সিস্টেম স্থানীয় সময় অঞ্চল ব্যবহার (যে এর অনেক স্ট্যাক ওভারফ্লো ব্যবহারকারীদের সামনে এখন বিভ্রান্ত)

14
... এবং সমস্ত দরকারী সাধারণ তারিখ পদ্ধতি অবমূল্যায়নের সাথে কী হবে? এখন আমাকে সেই ভয়ঙ্কর ক্যালেন্ডার অবজেক্টটি সহজ পদ্ধতিতে ব্যবহার করতে জটিল উপায়ে ব্যবহার করতে হবে।
ব্রায়ান নোব্লাচ

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

8
আপনি প্রশ্নের উত্তর না।
জিমি

2
@ ব্যবহারকারী 443854: আমি একটি সম্পাদনায় কিছু পয়েন্ট তালিকাভুক্ত করেছি - দেখুন এটি সাহায্য করে কিনা।
জন স্কিটি

2
আপনি যদি জাভা 8 ব্যবহার করছেন তবে আপনি ক্যালেন্ডার ক্লাসটি খনন করতে পারেন এবং নতুন এবং স্নেহসী ডেটটাইম এপিআইতে স্যুইচ করতে পারেন । নতুন API এছাড়াও threadsafe একটি অপরিবর্তনীয় / অন্তর্ভুক্ত DateTimeFormatter যা সমস্যাযুক্ত এবং ব্যয়বহুল SimpleDateFormat উপর একটি বড় উন্নতি হয়।
সিসিপিজ্জা

43

কারণ মাস সহ গণিত করা অনেক সহজ is

ডিসেম্বরের পরের 1 মাস জানুয়ারী, তবে সাধারণত এটি বের করতে আপনাকে মাসের নম্বরটি নিয়ে গণিত করতে হবে

12 + 1 = 13 // What month is 13?

আমি জানি! আমি 12 এর একটি মডিউল ব্যবহার করে এটি দ্রুত সমাধান করতে পারি।

(12 + 1) % 12 = 1

এটি নভেম্বর পর্যন্ত 11 মাস ঠিক কাজ করে ...

(11 + 1) % 12 = 0 // What month is 0?

আপনি মাসটি যুক্ত করার আগে 1 টি বিয়োগ করে আপনি এই সমস্ত কাজটি আবার করতে পারেন, তারপরে আপনার মডুলাসটি করুন এবং শেষ পর্যন্ত আবার 1 যুক্ত করুন ... অন্তর্নিহিত সমস্যার আশেপাশের কাজ।

((11 - 1 + 1) % 12) + 1 = 12 // Lots of magical numbers!

এখন আসুন 0 - 11 মাসের সমস্যা সম্পর্কে ভাবা যাক।

(0 + 1) % 12 = 1 // February
(1 + 1) % 12 = 2 // March
(2 + 1) % 12 = 3 // April
(3 + 1) % 12 = 4 // May
(4 + 1) % 12 = 5 // June
(5 + 1) % 12 = 6 // July
(6 + 1) % 12 = 7 // August
(7 + 1) % 12 = 8 // September
(8 + 1) % 12 = 9 // October
(9 + 1) % 12 = 10 // November
(10 + 1) % 12 = 11 // December
(11 + 1) % 12 = 0 // January

সমস্ত মাস একই কাজ করে এবং চারপাশের কোনও কাজ প্রয়োজন হয় না।


5
এটি সন্তোষজনক। অন্তত এই উন্মাদনার কিছু মূল্য আছে!
moljac024

"প্রচুর যাদুকর সংখ্যা" - নাহ, এটি কেবলমাত্র দু'বার প্রদর্শিত হবে।
ব্যবহারকারী 123444555621

একমাস পিছনে ফিরে যাওয়া এখনও বাছাই করা আইকি, যদিও, সি এর দুর্ভাগ্যবশত "মডুলাস" না দিয়ে "বাকি" অপারেটর ব্যবহারের জন্য ধন্যবাদ। আমি এও নিশ্চিত নই যে বছরে সামঞ্জস্য না করে একজনকে একবারে কত ঘন ঘন ঘন ঘন ঘন ঘন ঝাঁকিয়ে দেখার দরকার হয়, এবং মাসগুলি 1-12 চলে গেলে with যখন (মাস> 12) {মাস- = 12; বছর ++;}
ক্যাট

2
যেহেতু ডেটটাইম-এর মতো বুদ্ধিমান কাজগুলি অ্যাডম্যাথসগুলি
কোনও

8
আমি এই upvotes বুঝতে পারছি না - ((11 - 1 + 1) % 12) + 1 = 12শুধু (11 % 12) + 1মাসের 1..12 জন্য অর্থাত আপনি মাত্র 1 যোগ করতে হবে পরে মডিউল করছেন। কোন যাদু প্রয়োজন।
এমফিটজপ

35

সি ভিত্তিক ভাষাগুলি সি কিছু ডিগ্রীতে কপি করে। tmগঠন (সংজ্ঞায়িত time.h) একটি পূর্ণসংখ্যা ক্ষেত্র রয়েছে tm_mon(মন্তব্য) 0-11 পরিসীমা সঙ্গে।

সি ভিত্তিক ভাষাগুলি সূচক 0 এ অ্যারে শুরু করে So সুতরাং সূচী সহ মাসের নামের একটি অ্যারেতে স্ট্রিং আউটপুট দেওয়ার পক্ষে এটি সুবিধাজনক ছিল tm_mon


22

এর উত্তর অনেক আছে, তবে আমি যাই হোক না কেন এই বিষয়ে আমার মতামত দেব। এই অদ্ভুত আচরণের পেছনের কারণটি আগে বলা হয়েছে, পসিক্স সি থেকে এসেছে time.hযেখানে কয়েক মাসের মধ্যে 0-10 রেঞ্জের সাথে সংরক্ষণ করা হয়। কেন তা ব্যাখ্যা করার জন্য, এটি এর মতো দেখুন; বছর এবং দিনগুলিকে কথ্য ভাষায় সংখ্যা হিসাবে বিবেচনা করা হয়, তবে মাসের নিজস্ব নাম রয়েছে। সুতরাং জানুয়ারী প্রথম মাস হওয়ায় এটি প্রথম অ্যারের উপাদান অফসেট 0 হিসাবে সংরক্ষণ করা হবে।monthname[JANUARY]হবে "January"। বছরের প্রথম মাসে প্রথম মাসের অ্যারের উপাদান।

অন্যদিকে দিনের সংখ্যা, যেহেতু তাদের নাম নেই, সেহেতু 0-30 হিসাবে একটি ইনট্রে সংরক্ষণ করা বিভ্রান্তিকর হবে, প্রচুর পরিমাণে যুক্ত করুন day+1 আউটপুট দেওয়ার জন্য নির্দেশাবলী এবং অবশ্যই বাগের ঝুঁকিতে পড়বেন।

বলা হচ্ছে, অসঙ্গতিটি বিভ্রান্তিকর, বিশেষত জাভাস্ক্রিপ্টে (যা এই "বৈশিষ্ট্যটি "ও পেয়েছে), এটি একটি স্ক্রিপ্টিং ভাষা যেখানে এই লিঙ্গ থেকে অনেক দূরে সরানো উচিত।

টিএল; ডিআর : কারণ মাসের নাম এবং মাসের দিন থাকে না।


1
"মাসের নাম আছে এবং দিনগুলি নেই" " 'শুক্রবার' শুনেছেন কখনও? ;) ঠিক আছে আমি অনুমান করছি আপনার অর্থ '.. মাসের দিনগুলি হয় না' - সম্ভবত এটি আপনার (অন্যথায় ভাল) উত্তর সম্পাদনা করার জন্য অর্থ দিতে পারে। :-)
অ্যান্ড্রু থম্পসন

0/0/0000 আরও ভাল "00-জানু -0000" বা "00-XXX-0000" হিসাবে রেন্ডার করা হয়েছে? আইএমএইচও, তেরো "মাস" থাকলে প্রচুর কোড ক্লিন থাকত তবে ০১ মাসকে একটি ডামি নাম দেওয়া হয়েছিল।
সুপারক্যাট

1
আকর্ষণীয়ভাবে গ্রহণ করা যায় তবে 0/0/0000 একটি বৈধ তারিখ নয়। আপনি 40/40/0000 কীভাবে রেন্ডার করবেন?
পিক্সেল বিটওয়ার্কস

12

জাভা 8-এ, একটি নতুন তারিখ / সময় এপিআই জেএসআর 310 রয়েছে যা আরও বুদ্ধিমান। স্পেক সীসা জোদাটাইমের প্রাথমিক লেখকের সমান এবং তারা অনেকগুলি অনুরূপ ধারণা এবং নিদর্শনগুলি ভাগ করে।


2
নতুন তারিখের সময় এপিআই এখন জাভা 8
mschenk74

9

আমি অলসতা বলব। অ্যারে 0 থেকে শুরু হয় (প্রত্যেকে এটি জানেন); বছরের মাসগুলি একটি অ্যারে হয়, যা আমাকে বিশ্বাস করতে পরিচালিত করে যে সুনের কিছু প্রকৌশলী কেবল জাভা কোডের মধ্যে এই একটি ছোট্ট নব্বইটি লাগিয়ে বিরক্ত করেননি।


9
না, আমি না। একজনের প্রোগ্রামারদের চেয়ে কারও গ্রাহকের দক্ষতা অনুকূল করা আরও গুরুত্বপূর্ণ। যেহেতু এই গ্রাহক এখানে জিজ্ঞাসা করে সময় কাটাচ্ছেন, তারা তাতে ব্যর্থ হয়েছিল।
দ্য স্মার্ফ

2
এটি দক্ষতার সাথে সম্পূর্ণ সম্পর্কযুক্ত নয় - এটি এমন নয় যে মাসগুলি কোনও অ্যারেতে সঞ্চিত থাকে এবং আপনার 12 মাসের প্রতিনিধিত্ব করার জন্য 13 প্রয়োজন। এপিআইটি ব্যবহারকারী হিসাবে বন্ধুত্বপূর্ণ হিসাবে তৈরি করা উচিত নয় কারণ তাদের প্রথম স্থানে থাকা উচিত ছিল। "কার্যকর জাভা" তে জোশ ব্লচ তারিখ এবং ক্যালেন্ডারে র‌্যাগ করে। খুব কম সংখ্যক এপিআই নিখুঁত, এবং জাভাতে তারিখ / সময়ের এপিআইগুলিতে বোকা বানানো দুর্ভাগ্যজনক ভূমিকা ছিল। এটাই জীবন, তবে এর দক্ষতার সাথে এর কিছু করার ভান করি না।
কুইন টেলর

1
কেন 0 থেকে 30 পর্যন্ত দিন গণনা করবেন না? এটি কেবল বেমানান এবং ম্লান।
জুয়াংউই জর্ডান


8

কারণ প্রোগ্রামাররা 0-ভিত্তিক সূচকগুলিতে আবেশযুক্ত। ঠিক আছে, এটি এর চেয়ে কিছুটা জটিল: আপনি যখন 0-ভিত্তিক সূচক ব্যবহার করতে নিম্ন-স্তরের যুক্তি দিয়ে কাজ করছেন তখন এটি আরও বোধগম্য হয়। তবে বড় বড়, আমি এখনও আমার প্রথম বাক্যটি ধরে রেখেছি।


1
এই সেই বাগধারার / অভ্যাস যে যান সেখানকার হয় অন্য উপায় প্রতীকী ভাষান্তর বা মেশিনে ভাষা যেখানে সবকিছু অফসেটের না ইনডেক্স পরিপ্রেক্ষিতে মধ্যে সম্পন্ন করা হয় ফিরে। অ্যারে নোটেশনটি অফসেট ০. থেকে শুরু করে সামঞ্জস্যপূর্ণ ব্লকগুলি অ্যাক্সেসের জন্য একটি শর্ট কাট হয়ে উঠেছে
কেন জেন্টেল

4

ব্যক্তিগতভাবে, আমি জাভা ক্যালেন্ডার এপিআইয়ের অদ্ভুততাটিকে একটি ইঙ্গিত হিসাবে গ্রহণ করেছি যে গ্রেগরিয়ান-কেন্দ্রিক মানসিকতা থেকে নিজেকে তালাক দেওয়া এবং সেই বিষয়ে আরও কৃষ্ণবিজ্ঞানের সাথে প্রোগ্রাম করার চেষ্টা করা দরকার। বিশেষত, আমি মাসের মতো জিনিসগুলির জন্য হার্ডকডযুক্ত ধ্রুবকগুলি এড়াতে আবারও শিখেছি।

নিম্নলিখিত কোনটি সঠিক হওয়ার সম্ভাবনা বেশি?

if (date.getMonth() == 3) out.print("March");

if (date.getMonth() == Calendar.MARCH) out.print("March");

এটি এমন একটি বিষয় চিত্রিত করে যা জোদা সময় সম্পর্কে আমাকে কিছুটা কমায় ks (তবে কিছুটা হলেও। জোদা প্রোগ্রামারদের খারাপ প্রোগ্রাম করতে বাধ্য করছে বলে মনে হচ্ছে না))


1
আপনার কোডটিতে ধ্রুবক না থাকলে কোন স্কিম আপনাকে মাথা ব্যথার সম্ভাবনা দেয় - আপনার একটি মান রয়েছে যা ওয়েব পরিষেবা কল বা যা-ই হোক না কেন ফলাফল।
জন স্কিটি

সেই ওয়েব পরিষেবা কলটি অবশ্যই অবশ্যই সেই ধ্রুবকটি ব্যবহার করা উচিত। :-) একই কোনও বাহ্যিক কলারের জন্য যায়। একবার আমরা প্রতিষ্ঠিত করেছি যে একাধিক মান বিদ্যমান, একটি কার্যকর করার প্রয়োজনীয়তা স্পষ্ট হয়ে যায়। (আমি আশা করি আমি আপনার মন্তব্যটি বুঝতে পেরেছি ...)
পল ব্রিনকলে

3
হ্যাঁ, আমাদের মাসিকটি প্রকাশের সময় বিশ্বের প্রায় সমস্ত কিছু ব্যবহার করে এমন স্ট্যান্ডার্ডটি প্রয়োগ করা উচিত - 1-ভিত্তিক মান।
জন স্কিটি

মূল শব্দটি "প্রায়" হচ্ছে। স্পষ্টতই, জানুয়ারী = 1, ইত্যাদি অত্যন্ত বিস্তৃত ব্যবহারের সাথে একটি ডেট সিস্টেমে প্রাকৃতিক বোধ করে তবে কেন এই একটি ক্ষেত্রে এমনকি হার্ডকোডযুক্ত ধ্রুবকগুলি এড়িয়ে যাওয়ার জন্য কেন নিজেকে ব্যতিক্রম করার অনুমতি দেয়?
পল ব্রিনকলে 21

3
কারণ এটি জীবনকে সহজ করে তোলে। এটা ঠিক আছে। 1-ভিত্তিক মাস সিস্টেমের সাথে আমি কখনও অফ-ও-এক সমস্যার মুখোমুখি হইনি । আমি জাভা এপিআই এর সাথে এ জাতীয় প্রচুর বাগ দেখতে পেয়েছি । বিশ্বের অন্য সবাই কী উপেক্ষা করে তা বোঝা যায় না।
জন স্কিটি

4

আমার জন্য, কেউ এটিকে মাইন্ডপ্রো ডটকমের চেয়ে ভালভাবে ব্যাখ্যা করে না :

Gotchas

java.util.GregorianCalendarold java.util.Dateক্লাসের তুলনায় অনেক কম বাগ এবং গোটচ রয়েছে তবে এটি এখনও কোনও পিকনিক নয়।

ডেফলট সেভিং টাইমটি প্রথম প্রস্তাবিত হওয়ার পরে যদি প্রোগ্রামাররা থাকত তবে তারা এটিকে পাগল এবং অন্তরঙ্গ হিসাবে ভেটো করে দিত। দিবালোক সাশ্রয়ের সাথে একটি মৌলিক অস্পষ্টতা রয়েছে। শরত্কালে আপনি যখন আপনার ঘড়িগুলি দুপুর ২ টা ৪৫ মিনিটে ফিরে যান তখন সেখানে দুটি ভিন্ন তাত্ক্ষণিক সময় উপস্থিত থাকে উভয়কে স্থানীয় সময় 1:30 এএম বলা হয়। আপনি যদি কেবল রাইট রেকর্ডিং বা পড়াশোনার সাথে স্ট্যান্ডার্ড সময় চেয়েছিলেন কিনা তা রেকর্ড করে তবেই আপনি এগুলি বলতে পারবেন।

দুর্ভাগ্যক্রমে, GregorianCalendarআপনি কোনটি উদ্দেশ্য করে তা জানানোর উপায় নেই । অস্পষ্টতা এড়াতে আপনার অবশ্যই ডামি ইউটিসি টাইমজোন এর সাথে স্থানীয় সময়টি বলার অবলম্বন করতে হবে। প্রোগ্রামাররা সাধারণত এই সমস্যার দিকে তাদের চোখ বন্ধ করে রাখে এবং কেবল আশা করি এই সময়ের মধ্যে কেউ কিছু করবে না।

মিলেনিয়াম বাগ বাগগুলি এখনও ক্যালেন্ডার শ্রেণীর বাইরে নেই। এমনকি জেডিকে (জাভা ডেভলপমেন্ট কিট) ১.৩ এ একটি 2001 বাগ রয়েছে। নিম্নলিখিত কোড বিবেচনা করুন:

GregorianCalendar gc = new GregorianCalendar();
gc.setLenient( false );
/* Bug only manifests if lenient set false */
gc.set( 2001, 1, 1, 1, 0, 0 );
int year = gc.get ( Calendar.YEAR );
/* throws exception */

বাগটি এমএসটি-র জন্য 2001/01/01 সকাল 7 টা থেকে অদৃশ্য হয়ে যায়।

GregorianCalendarটাইপযুক্ত ইন্টি ম্যাজিক কনস্ট্যান্টের একটি বিশালাকার গাদা দ্বারা নিয়ন্ত্রিত হয়। এই কৌশলটি সংকলন-সময় ত্রুটি পরীক্ষার কোনও আশা সম্পূর্ণরূপে ধ্বংস করে দেয়। উদাহরণস্বরূপ আপনি যে মাসটি ব্যবহার করেন তা পেতে GregorianCalendar. get(Calendar.MONTH));

GregorianCalendarকাঁচা GregorianCalendar.get(Calendar.ZONE_OFFSET)এবং দিবালোক সঞ্চয় আছে GregorianCalendar. get( Calendar. DST_OFFSET) , তবে প্রকৃত সময় অঞ্চলটি অফসেট পাওয়ার কোনও উপায় নেই। আপনাকে অবশ্যই এই দুটি পৃথক করে একসাথে যুক্ত করতে হবে।

GregorianCalendar.set( year, month, day, hour, minute) 0 এ সেকেন্ড সেট করে না।

DateFormat এবং GregorianCalendar সঠিকভাবে জাল না। আপনাকে অবশ্যই দুবার ক্যালেন্ডার নির্দিষ্ট করতে হবে, একবার অপ্রত্যক্ষভাবে তারিখ হিসাবে।

যদি ব্যবহারকারী তার সময় অঞ্চলটি সঠিকভাবে কনফিগার না করে থাকে তবে এটি শান্তভাবে পিএসটি বা জিএমটি-তে ডিফল্ট হয়ে যাবে।

গ্রেগরিয়ানক্যালেন্ডারে, গ্রহটির প্রত্যেকের মতো 1 টির পরিবর্তে মাস গণনা করা হয় 0 জানুয়ারিতে। তবুও দিনগুলি রবিবার = 1, সোমবার = 2,… শনিবার = 7 এর সাথে সপ্তাহের দিনগুলির মতো 1 এ শুরু হয়। তবুও ডেটফর্ম্যাট। পার্স Januaryতিহ্যবাহী পদ্ধতিতে জানুয়ারী = 1 এর সাথে আচরণ করে।


4

java.util.Month

জাভা আপনাকে কয়েক মাসের জন্য 1 ভিত্তিক সূচকগুলি ব্যবহার করার অন্য উপায় সরবরাহ করে। java.time.Monthএনাম ব্যবহার করুন । একটি বস্তু বারো মাসের প্রতিটি জন্য পূর্বনির্ধারিত is জানুয়ারি-ডিসেম্বরের জন্য তাদের প্রত্যেকের জন্য 1-12 নির্ধারিত নম্বর রয়েছে; getValueনম্বর জন্য কল করুন ।

এর করতে ব্যবহার Month.JULY(আপনি 7 দেয়) পরিবর্তে Calendar.JULY(আপনি 6 দেয়)।

(import java.time.*;)

3

TL; ড

Month.FEBRUARY.getValue()  // February → 2.

2

বিস্তারিত

জন স্কিট দ্বারা উত্তর সঠিক।

এখন আমাদের সেই অসুবিধাগুলি পুরানো উত্তরাধিকারের তারিখ-সময় ক্লাস: জাভা.টাইম ক্লাসগুলির জন্য একটি আধুনিক প্রতিস্থাপন রয়েছে ।

java.time.Month

এই ক্লাসগুলির মধ্যে এনামও রয়েছে । একটি এনাম এক বা একাধিক পূর্বনির্ধারিত অবজেক্ট, বস্তুগুলি বহন করে যা শ্রেণি লোড হওয়ার পরে স্বয়ংক্রিয়ভাবে ইনস্ট্যান্ট হয়। উপর : আমরা এক ডজন যেমন বস্তুর আছে, প্রতিটি একটি নাম দেওয়া , , , ইত্যাদি। এগুলির প্রত্যেকটি একটি শ্রেণির ধ্রুবক। আপনি এই কোডগুলি আপনার কোডের যে কোনও জায়গায় ব্যবহার এবং পাস করতে পারেন। উদাহরণ:Month MonthJANUARYFEBRUARYMARCHstatic final publicsomeMethod( Month.AUGUST )

সৌভাগ্যক্রমে, তাদের সংখ্যার সংখ্যার পরিমাণ রয়েছে, 1-12 যেখানে 1 জানুয়ারী এবং 12 ডিসেম্বর হয়।

Monthনির্দিষ্ট মাসের সংখ্যার (1-12) জন্য একটি অবজেক্ট পান ।

Month month = Month.of( 2 );  // 2 → February.

অন্য দিকে যেতে, Monthকোনও মাসের মাসের সংখ্যা জিজ্ঞাসা করুন ।

int monthNumber = Month.FEBRUARY.getValue();  // February → 2.

এই শ্রেণিতে অন্যান্য অনেক সহজ পদ্ধতি যেমন প্রতি মাসে কত দিনের সংখ্যা জেনে রাখা । ক্লাসটি এমনকি মাসের একটি স্থানীয় নাম তৈরি করতে পারে ।

আপনি বিভিন্ন দৈর্ঘ্য বা সংক্ষিপ্তসারগুলিতে মাসের স্থানীয়করণের নামটি পেতে পারেন।

String output = 
    Month.FEBRUARY.getDisplayName( 
        TextStyle.FULL , 
        Locale.CANADA_FRENCH 
    );

ফেব্রুয়ারী

এছাড়াও, আপনার কোড বেসের উপরে এই এনামের অবজেক্টগুলি কেবল পূর্ণসংখ্যার সংখ্যার পরিবর্তে পাস করা উচিত । এটি করা প্রকারের সুরক্ষা প্রদান করে, মানগুলির একটি বৈধ পরিসীমা নিশ্চিত করে এবং আপনার কোডকে আরও স্ব-ডকুমেন্টিং করে। জাভাতে আশ্চর্যজনকভাবে শক্তিশালী এনাম সুবিধার সাথে অজানা থাকলে ওরাকল টিউটোরিয়ালটি দেখুন ।

আপনি দরকারী Yearএবং YearMonthক্লাসগুলিও দরকারী খুঁজে পেতে পারেন ।


জাভা.টাইম সম্পর্কে

Java.time ফ্রেমওয়ার্ক জাভা 8 এবং পরে পাতাটা করা হয়। এই ক্লাসগুলি , & , এর মতো সমস্যাযুক্ত পুরানো উত্তরাধিকারের তারিখ-সময়ের ক্লাসগুলিকে সহায়তা করে ।java.util.Date.Calendarjava.text.SimpleDateFormat

Joda-টাইম প্রকল্প, এখন রক্ষণাবেক্ষণ মোড , স্থানান্তরণ java.time করার পরামর্শ দেয়।

আরও জানতে, ওরাকল টিউটোরিয়াল দেখুন । এবং অনেক উদাহরণ এবং ব্যাখ্যার জন্য স্ট্যাক ওভারফ্লো অনুসন্ধান করুন। স্পেসিফিকেশনটি জেএসআর 310

জাভা.টাইম ক্লাস কোথায় পাবেন?

ThreeTen-অতিরিক্ত প্রকল্প অতিরিক্ত শ্রেণীর সাথে java.time প্রসারিত করে। এই প্রকল্পটি জাভা.টাইমে সম্ভাব্য ভবিষ্যতের সংযোজনগুলির একটি প্রমাণযোগ্য ক্ষেত্র। আপনি এখানে কিছু দরকারী শ্রেণীর যেমন খুঁজে পেতে পারেন Interval, YearWeek, YearQuarter, এবং আরো


0

এটি প্রতি সেউর মতো শূন্য হিসাবে সংজ্ঞায়িত নয়, এটি ক্যালেন্ডার হিসাবে সংজ্ঞায়িত করা হয়েছে an জানুয়ারী। এটি এনামগুলির পরিবর্তে অন্তরগুলি স্থির হিসাবে ব্যবহার করার সমস্যা। ক্যালেন্ডার.জানুরি == 0।


1
মানগুলি এক এবং একই রকম। এপিআইগুলি 0ও ফিরে আসতে পারে, এটি ধ্রুবকের সমান। ক্যালেন্ডার.জানুয়ারী 1 হিসাবে সংজ্ঞায়িত করা যেতে পারে - এটাই পুরো বিষয়টি। একটি এনাম একটি দুর্দান্ত সমাধান হতে পারে তবে জাভা 5 অবধি প্রকৃত এনামগুলিকে ভাষায় যুক্ত করা হয়নি, এবং শুরু থেকেই তারিখটি প্রায় ছিল। এটি দুর্ভাগ্যজনক, তবে তৃতীয় পক্ষের কোডটি একবার ব্যবহার করার পরে আপনি এই জাতীয় মৌলিক এপিআইকে "ঠিক" করতে পারবেন না। সবচেয়ে ভাল যেটি করা যায় তা হ'ল নতুন এপিআই সরবরাহ করা এবং লোককে এগিয়ে যাওয়ার জন্য উত্সাহিত করতে পুরানোটিকে অবমূল্যায়ন করা। আপনাকে ধন্যবাদ, জাভা 7 ...
কুইন টেলর

0

যেহেতু ভাষা লেখাগুলি দেখতে তার চেয়ে শক্ত এবং বিশেষত পরিচালনা করার সময়টি বেশিরভাগ লোকেরা মনে করেন তার চেয়ে অনেক কঠিন। সমস্যার অল্প অংশের জন্য (বাস্তবে জাভা নয়), https://www.youtube.com/watch?v=-5wpm-gesOY এ ইউটিউব ভিডিও "টাইম অ্যান্ড টাইমজোনস - কম্পিউটারফিলি সঙ্গে সমস্যা" দেখুন । আপনার মাথা গুলিয়ে ফেললে বিস্মিত হবেন না।


-1

ড্যানিস্মার্ফের আলস্যতার উত্তর ছাড়াও, আমি যুক্ত করব যে এটি আপনাকে ধ্রুবকগুলি ব্যবহার করতে উত্সাহিত করবে Calendar.JANUARY


5
আপনি যখন কোনও নির্দিষ্ট মাসের জন্য স্পষ্টভাবে কোডটি লিখছেন তখন এটি খুব ভাল হয়, তবে আপনি যখন কোনও মাস্টারটি অন্য উত্স থেকে "স্বাভাবিক" আকারে পেয়েছেন তখন খুব কষ্ট হয়।
জন স্কিটি

1
আপনি যখন কোনও নির্দিষ্ট উপায়ে সেই মাসের মানটি মুদ্রণের চেষ্টা করছেন তখন এটিও একটি বেদনা always
ব্রায়ান ওয়ারশওয়া

-2

কারণ সমস্ত কিছু 0 দিয়ে শুরু হয় এটি জাভাতে প্রোগ্রামিংয়ের একটি প্রাথমিক তথ্য fact যদি একটি জিনিস এটি থেকে বিচ্যুত হয়, তবে এটি বিভ্রান্তির পুরো স্লুতে পরিচালিত করবে। আসুন তাদের গঠন এবং তাদের সাথে কোড যুক্তি না।


2
না, বাস্তব বিশ্বের বেশিরভাগ জিনিস 1 দিয়ে শুরু হয় Off অফসেট 0 দিয়ে শুরু হয়, এবং বছরের মাসটি অফসেট নয়, বারোটির মধ্যে একটির মতো, ঠিক যেমন মাসের দিনটি 31 বা 30 বা 29 এর মধ্যে একটি বা ২৮. অফসেট হিসাবে মাসের আচরণ করা কেবল মজাদার, বিশেষত যদি একই সাথে আমরা মাসের দিনটিকে একইভাবে ব্যবহার না করি treat এই পার্থক্যের কারণ কী হবে?
সান্টিবাইলার্স

রিয়েল ওয়ার্ল্ডে শুরু 1, জাভা দুনিয়াতে 0 দিয়ে শুরু করুন ... তবে আমি মনে করি এটি কারণ: - সপ্তাহের দিন গণনা করার জন্য কয়েক দফায় আরও কয়েকটি পদক্ষেপ যুক্ত না করে কোনও দম্পতি গণনার জন্য অফসেট করা যায় না এটি ... - অতিরিক্ত হিসাবে এটি প্রয়োজনে মাসের পুরো দিনগুলি দেখায় (বিভ্রান্তি না করে বা ফেব্রুয়ারী পরীক্ষা করা প্রয়োজন না) - মাসের জন্য এটি আপনাকে তারিখের ফর্ম্যাটে আউটপুট দিতে বাধ্য করে যা কোনওভাবেই ব্যবহার করা উচিত। অতিরিক্ত হিসাবে যেহেতু এক বছরের মাসের সংখ্যাগুলি নিয়মিত এবং এক মাসের দিনগুলি হ'ল এটির অর্থ হয় না যদি আপনাকে অ্যারেগুলি ঘোষণা করতে হয় এবং অ্যারেটি আরও ভালভাবে ফিট করার জন্য একটি অফসেট ব্যবহার করতে হয়।
সিরিরাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.