জাভা তারিখ এবং সময় এপিআই এর সাথে কী সমস্যা? [বন্ধ]


105

আমি প্রায়শই জাভা Dateএবং অন্যান্য তারিখ-সময় সম্পর্কিত ক্লাসগুলিতে নেতিবাচক প্রতিক্রিয়া দেখতে পাই । । নেট বিকাশকারী হয়ে আমি পুরোপুরি (তাদের ব্যবহার না করে) বুঝতে পারি না, তাদের সাথে আসলে কী হয়েছে।

কেউ কি এই বিষয়ে কিছু আলোকপাত করতে পারে?


উত্তর:


142

আহা, জাভা Dateক্লাস। যে কোনও ভাষায়, যে কোনও জায়গায় কীভাবে কিছু না করা যায় তার সেরা উদাহরণগুলির মধ্যে একটি। আমি কোথা থেকে শুরু করবেন?

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

যাইহোক, ডিজাইনের সিদ্ধান্তগুলি একটি ভাল ডিজাইনযুক্ত এপিআই হওয়ার কোনও চিন্তাই নষ্ট করে দেয়। এখানে কয়েকটি প্রিয় ভুল রয়েছে:

  • সহস্রাব্দের শেষ দশকে ডিজাইন করা সত্ত্বেও, এটি ১৯০০ সাল থেকে বছরগুলিকে দুটি অঙ্ক হিসাবে রেট করে this
  • মাস শূন্য একটি অ্যারের অফ মাসের থাকার এবং তেরো উপাদানের বিন্যাস সঙ্গে বসবাস না, একটি ধারণকারী যার প্রথম দর্শনীয়ভাবেই অস্বাভাবিক ক্ষেত্রে জন্য সূচিবদ্ধ হয়েছে পূরণ করার জন্য null। ফলস্বরূপ, আমাদের 0.01 (এবং আজ 109 বছরের 11 মাস)। স্ট্রিংতে রূপান্তর করতে কয়েক মাসের মধ্যে ++ এবং - এর মতো সংখ্যক নম্বর রয়েছে।
  • সেগুলি চপল । ফলস্বরূপ, যে কোনও সময় আপনি কোনও তারিখ ফিরিয়ে দিতে চান (উদাহরণস্বরূপ কাঠামো হিসাবে বলুন) আপনাকে তারিখের অবজেক্টের পরিবর্তে সেই তারিখের ক্লোন ফিরিয়ে আনতে হবে (অন্যথায়, লোকেরা আপনার কাঠামোটিকে পরিবর্তন করতে পারে)।
  • Calendar, 'ফিক্স' এই করার জন্য ডিজাইন করা, আসলে একই ভুল করে তোলে। তারা এখনও পরিবর্তনযোগ্য।
  • Dateএকটি প্রতিনিধিত্ব করে DateTime, তবে এসকিউএল জমিতে তাদের পিছনে স্থিত করার জন্য, আরও একটি সাবক্লাস রয়েছে java.sql.Date, যা একটি একক দিনকে উপস্থাপন করে (যদিও এটির সাথে সম্পর্কিত সময়সীমা ছাড়াই)।
  • এর সাথে কোনও TimeZoneযুক্ত নেই Date, এবং তাই ব্যাপ্তিগুলি (যেমন একটি 'পুরো দিন') প্রায়শই মাঝরাত-মধ্যরাত হিসাবে উপস্থাপিত হয় (প্রায়শই কিছু স্বেচ্ছাসেবী সময়রেখায়)

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


43

জেএসআর 310 , যা জাভা 8-তে জাভা.টাইম সহ পুরানো তারিখ-কালীন ক্লাসগুলিকে অনুপ্রবেশ করেছিল, মূল জেএসআরটিতে নীচে নিজেকে ন্যায্যতা দেয় :

২.৫ প্রস্তাবিত স্পেসিফিকেশন দ্বারা জাভা সম্প্রদায়ের কোন প্রয়োজনের সমাধান করা হবে?

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

একটি ক্লাসিক বাগ (4639407) কোনও নির্দিষ্ট তারিখকে একটি ক্যালেন্ডার অবজেক্টে তৈরি হতে বাধা দেয়। কোডের একটি অনুক্রম লেখা যেতে পারে যা কিছু বছরের মধ্যে একটি তারিখ তৈরি করতে পারে তবে অন্যদের মধ্যে নয়, কিছু ব্যবহারকারীকে তাদের সঠিক জন্ম তারিখে প্রবেশ করতে বাধা দেওয়ার প্রভাব ফেলে। এটি ক্যালেন্ডার ক্লাসের ফলে গ্রীষ্মের কেবলমাত্র এক ঘন্টার জন্য দিবালোকের সঞ্চয় সময় দেয়, যখন worldতিহাসিকভাবে এটি দ্বিতীয় বিশ্বযুদ্ধের সময় প্রায় ২ ঘন্টা ছিল। এই বাগটি এখন ঠিক করা হয়েছে, ভবিষ্যতের কোনও সময় যদি কোনও দেশ গ্রীষ্মে তিন দিনের বেশি সময় ব্যয় করে দিবালোক সঞ্চয় সময় উপস্থাপনের জন্য বেছে নিয়েছিল, তবে ক্যালেন্ডার শ্রেণিটি আবার ভেঙে যাবে।

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

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

একটি বিস্তৃত তারিখ এবং সময় মডেলের অভাবের ফলে অনেকগুলি সাধারণ ক্রিয়াকলাপ হওয়া উচিত তার চেয়ে বেশি জটিল ier উদাহরণস্বরূপ, দুটি তারিখের মধ্যে দিনের সংখ্যা গণনা করা বর্তমানে একটি বিশেষ সমস্যা।

এই জেএসআর তারিখ এবং সময় (সময় অঞ্চল সহ এবং ছাড়া), মেয়াদ এবং সময়কাল, অন্তর, বিন্যাসকরণ এবং পার্সিং সহ একটি সম্পূর্ণ তারিখ এবং সময় মডেলের সমস্যা মোকাবেলা করবে।


28
  • তারিখের উদাহরণগুলি পরিবর্তনযোগ্য , যা প্রায়শই অসুবিধে হয়।
  • তাদের দ্বিগুণ স্বভাব রয়েছে। তারা একটি টাইমস্ট্যাম্প এবং একটি ক্যালেন্ডার তারিখ উভয়ই উপস্থাপন করে। তারিখে গণনা করার সময় দেখা যায় এটি সমস্যাযুক্ত।
  • ক্যালেন্ডার ডেটার সংখ্যাসমূহের উপস্থাপনগুলি অনেক ক্ষেত্রে পাল্টা স্বজ্ঞাত। উদাহরণস্বরূপ: getMonth()শূন্য-ভিত্তিক, getYear()এটি ১৯০০-ভিত্তিক (অর্থাত, ২০০৯টি 109 হিসাবে প্রতিনিধিত্ব করা হয়)।
  • তারা Dateক্লাসের কাছ থেকে প্রত্যাশিত প্রচুর কার্যকারিতা মিস করছে ।

13

প্রাক্তন। নেট প্রোগ্রামার হিসাবে আমি আপনার জন্য অনুভব করছি, আমি একই প্রশ্নগুলি জিজ্ঞাসা করেছি, নেট নেট টাইম এপিআই (টাইমস্প্যানস, অপারেটর ওভারলোডিং) খুব সুবিধাজনক।

প্রথমত, একটি নির্দিষ্ট তারিখ তৈরি করতে, আপনি হয় একটি অবহ্রাসিত API ব্যবহার করেন বা:

Calendar c = Calendar.getInstance();
c.set(2000, 31, 12)

কোনও দিন বিয়োগ করতে আপনি পছন্দ মতো মন্দ কাজ করেন

Date firstDate = ...
Calendar c = Calendar.getInstance();
c.setTime(fistDate);
c.add(Calendar.DATE,-1);
Date dayAgo = c.getTime();

বা তার থেকেও খারাপ

Date d = new Date();
Date d2 = new Date(d.getTime() - 1000*60*60*24);

দুটি তারিখের মধ্যে কত দিন কেটে গেছে তা জানতে (দিন / সপ্তাহ / মাসে) ... এটি আরও খারাপ হয়ে যায় gets

তবে অ্যাপাচি ( org.apache.commons.lang.time.DateUtils) থেকে ডেটইটিলগুলি কিছু সুবিধাজনক পদ্ধতি সরবরাহ করে এবং আমি কেবলমাত্র সেগুলি কেবল ইদানীং ব্যবহার করে দেখতে পেলাম

যেমন ব্র্যাবস্টার লিখেছিলেন, জোদা টাইমও একটি ভাল বাহ্যিক গ্রন্থাগার, তবে অ্যাপাচি অন্য কোনও কিছুর চেয়ে "সাধারণ" বলে মনে হয় ...


দয়া করে-দয়া করে, কীভাবে এটি করবেন তা আমাদের দেখান ("দুটি তারিখের মধ্যে কতটা সময় কেটে গেছে তা সন্ধান করুন")!
আন্তন গোগোলেভ

আমি আশা করি আমি একটি সহজ উপায় জানতাম ... লিপ বছর, জঞ্জাল মাস এবং স্বচ্ছল দিন সহ ...
মেডান


@ অ্যান্টনগোগোলেভ জাভা.টাইমে , বছর-মাস-দিন এবং ঘন্টা-মিনিট-সেকেন্ডের স্কেলগুলিতে যথাক্রমে অতিবাহিত সময় গণনা এবং প্রতিনিধিত্ব করতে ক্লাস Periodএবং ব্যবহার করুন Duration
তুলসী বার্ক

4

আমি জাওয়ার ডেট এপিআই ব্যবহারযোগ্য, সৎ হতে পারি। সমস্যা আমি দেখেছি এবং প্রায় শুনেছি অধিকাংশই ভারবোসিটি, দরকারী কিছু (যা করতে একাধিক শ্রেণীর জড়িত করার প্রয়োজনীয়তা সঙ্গে সম্পর্কযুক্ত Calendar, Date, DateFormat/ SimpleDateFormat) এবং মত সহজ accessors অভাব getDayOfWeek()

জোডা টাইম জাভা-র একটি উপযুক্ত সম্মানিত বিকল্প এপিআই, এবং কেন জোদা টাইম বিভাগে এটি আগ্রহী হতে পারে এমন একটি কার্যকর বিকল্প কেন এটি আরও কিছু যুক্তি দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.