TL; ড
Instant
এবং LocalDateTime
দুটি সম্পূর্ণ ভিন্ন প্রাণী: একটি একটি মুহুর্তকে উপস্থাপন করে, অন্যটি তা করে না।
Instant
একটি মুহূর্ত প্রতিনিধিত্ব করে, সময়রেখার একটি নির্দিষ্ট পয়েন্ট।
LocalDateTime
একটি তারিখ এবং দিনের একটি সময় প্রতিনিধিত্ব করে। তবে টাইম অঞ্চল বা অফসেট-থেকে-ইউটিসির অভাব, এই শ্রেণিটি একটি মুহুর্তের প্রতিনিধিত্ব করতে পারে না । এটি প্রায় 26 থেকে 27 ঘন্টা ব্যাপী সম্ভাব্য মুহুর্তগুলিকে উপস্থাপন করে , সারা বিশ্বের সর্বকালের জোনের পরিসর।
ভুল অনুমান
LocalDateTime
বরং তারিখ / ঘড়ির প্রতিনিধিত্ব মানুষের জন্য সময় অঞ্চলগুলি সহ।
আপনার বিবৃতিটি ভুল: A LocalDateTime
এর কোনও সময় অঞ্চল নেই । টাইম জোন না থাকা এই শ্রেণীর পুরো পয়েন্ট।
এই শ্রেণীর 'ডকের উদ্ধৃতি দিতে:
এই শ্রেণিটি কোনও সময়-অঞ্চল সংরক্ষণ করে না বা উপস্থাপন করে না। পরিবর্তে, এটি একটি তারিখের বিবরণ, জন্মদিনের জন্য ব্যবহৃত হিসাবে, স্থানীয় সময়ের সাথে মিলিতভাবে দেয়ালের ঘড়িতে দেখা যায়। এটি অফসেট বা সময় অঞ্চল হিসাবে অতিরিক্ত তথ্য ছাড়া সময়রেখায় তাত্ক্ষণিকভাবে প্রতিনিধিত্ব করতে পারে না।
এর Local…
অর্থ "জোনড নয়, অফসেট নেই"
Instant
একটি Instant
মধ্যে টাইমলাইনে একটি মুহূর্ত ইউটিসি , একটি গণনা ন্যানোসেকেন্ড 1970 ইউটিসি (মূলত মোদ্দা কথা বিস্তারিত জানার জন্য বর্গ ডক দেখুন) প্রথম মুহূর্ত কাল থেকে। যেহেতু আপনার বেশিরভাগ ব্যবসায়িক যুক্তি, ডেটা সঞ্চয়স্থান এবং ডেটা এক্সচেঞ্জটি ইউটিসিতে হওয়া উচিত, এটি প্রায়শই ব্যবহৃত হয় y
Instant instant = Instant.now() ; // Capture the current moment in UTC.
OffsetDateTime
শ্রেণীর OffsetDateTime
শ্রেণিটি ইউটিসির পিছনে বা পিছনে কিছু সংখ্যক ঘন্টা-মিনিট-সেকেন্ডের প্রসঙ্গে একটি তারিখ এবং সময় হিসাবে একটি মুহূর্তকে উপস্থাপন করে। অফসেটের পরিমাণ, ঘন্টা-মিনিট-সেকেন্ডের সংখ্যা, ZoneOffset
শ্রেণি দ্বারা প্রতিনিধিত্ব করা হয় ।
ঘণ্টা-মিনিট-সেকেন্ড শূন্য সংখ্যা হয়, তাহলে একটি OffsetDateTime
ইউটিসি একটি মুহূর্ত একটি হিসাবে একই প্রতিনিধিত্ব করে Instant
।
ZoneOffset
ZoneOffset
বর্গ প্রতিনিধিত্ব করে একটি অফসেট-ইউটিসি থেকে , ইউটিসি এগিয়ে বা ইউটিসি পিছনে ঘণ্টা-মিনিট-সেকেন্ড একটি সংখ্যা।
এ ZoneOffset
কেবল কয়েক ঘন্টা-মিনিট-সেকেন্ডের, আর কিছুই নয়। একটি জোন আরও অনেক কিছু, নাম এবং অফসেটে পরিবর্তনের ইতিহাস রয়েছে। সুতরাং একটি জোন ব্যবহার করা সর্বদা নিখরচায় অফসেট ব্যবহার করা পছন্দনীয়।
ZoneId
একটি সময় অঞ্চলZoneId
শ্রেণীর দ্বারা প্রতিনিধিত্ব করা হয় ।
উদাহরণস্বরূপ, মন্ট্রিয়ালের চেয়ে প্যারিসে একটি নতুন দিন শুরুর দিকে । সুতরাং আমাদের প্রদত্ত অঞ্চলের জন্য দুপুরের (যখন সূর্য সরাসরি উপরিভাগে থাকে) আরও ভাল প্রতিফলিত করার জন্য আমাদের ঘড়ির হাতগুলি সরানো দরকার । পশ্চিম ইউরোপ / আফ্রিকার ইউটিসি লাইন থেকে আরও দূরে পূর্ব / পশ্চিম দিকে অফসেটটি বৃহত্তর।
একটি সময় অঞ্চল হ'ল স্থানীয় সম্প্রদায় বা অঞ্চল দ্বারা অনুশীলন অনুসারে সামঞ্জস্যতা এবং ব্যতিক্রমগুলি পরিচালনা করার নিয়মের একটি সেট। ডায়ালাইট সেভিং টাইম (ডিএসটি) নামে পরিচিত সর্ব-অতি-জনপ্রিয় পাগলির মধ্যে সর্বাধিক প্রচলিত অসংগতি ।
একটি সময় অঞ্চলে অতীতের বিধি, বর্তমান বিধি এবং নিকট ভবিষ্যতের জন্য নিশ্চিত হওয়া নিয়মের ইতিহাস রয়েছে।
এই বিধিগুলি আপনার প্রত্যাশার চেয়ে প্রায়শই পরিবর্তন হয়। আপনার তারিখ-সময় গ্রন্থাগারের নিয়মগুলি অবশ্যই 'tz' ডাটাবেসের একটি অনুলিপি আপ টু ডেট রাখতে ভুলবেন না। জাভা 8-তে অর-আপ-টু-ডেট রাখা এখনকার চেয়ে সহজ আরও রয়েছে ওরাকল একটি টাইমজোন আপডেটার সরঞ্জাম প্রকাশের মাধ্যমে ।
একটি নির্দিষ্ট করুন সঠিক সময় অঞ্চল নাম এর বিন্যাসে Continent/Region
যেমন America/Montreal
, Africa/Casablanca
অথবা Pacific/Auckland
। কখনও যেমন 2-4 চিঠি সংক্ষেপ ব্যবহার EST
বা IST
হিসাবে তারা না সত্য সময় অঞ্চল, না মান, এবং এমনকি অনন্য নয় (!)।
সময় অঞ্চল = অফসেট + সামঞ্জস্যের নিয়ম
ZoneId z = ZoneId.of( “Africa/Tunis” ) ;
ZonedDateTime
নির্ধারিত সহ ZonedDateTime
ধারণা হিসাবে ভাবুন ।Instant
ZoneId
জোনেডেটটাইম = (তাত্ক্ষণিক + জোনআইডি)
কোনও নির্দিষ্ট অঞ্চলের (একটি সময় অঞ্চল) লোকেরা ব্যবহৃত প্রাচীর-ঘড়ির সময় হিসাবে দেখা বর্তমান মুহুর্তটি ক্যাপচার করতে:
ZonedDateTime zdt = ZonedDateTime.now( z ) ; // Pass a `ZoneId` object such as `ZoneId.of( "Europe/Paris" )`.
আপনার প্রায় সমস্ত ব্যাকএন্ড, ডাটাবেস, ব্যবসায়িক যুক্তি, ডেটা অধ্যবসায়, ডেটা এক্সচেঞ্জ সবই ইউটিসিতে থাকা উচিত। তবে ব্যবহারকারীদের কাছে উপস্থাপনের জন্য আপনাকে ব্যবহারকারীর দ্বারা প্রত্যাশিত একটি সময় অঞ্চলে সমন্বয় করতে হবে। ZonedDateTime
ক্লাস এবং বিন্যাসক ক্লাসগুলির উদ্দেশ্যটি সেই তারিখের সময়ের মানগুলির স্ট্রিং উপস্থাপনা তৈরি করতে ব্যবহৃত হয়।
ZonedDateTime zdt = instant.atZone( z ) ;
String output = zdt.toString() ; // Standard ISO 8601 format.
আপনি স্থানীয় ফর্ম্যাট ব্যবহার করে পাঠ্য উত্পন্ন করতে পারেন DateTimeFormatter
।
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( Locale.CANADA_FRENCH ) ;
String outputFormatted = zdt.format( f ) ;
মার্দি 30 এপ্রিল 2019 à 23 এইচ 22 মিনিট 55 হিউরে ডি এল ইন্ডে
LocalDate
, LocalTime
,LocalDateTime
"স্থানীয়" তারিখ সময় ক্লাস, LocalDateTime
, LocalDate
, LocalTime
, Critter একটি ভিন্ন ধরনের হয়। এগুলি কোনও একটি এলাকা বা সময় অঞ্চলে আবদ্ধ নয়। এগুলি টাইমলাইনে আবদ্ধ নয়। আপনি সময়রেখায় একটি বিন্দু খুঁজে পেতে কোনও অঞ্চলে এগুলি প্রয়োগ না করা পর্যন্ত তাদের কোনও আসল অর্থ নেই ।
এই শ্রেণীর নামগুলিতে "স্থানীয়" শব্দটি নিরবচ্ছিন্নদের পক্ষে পাল্টা স্বজ্ঞাত হতে পারে। শব্দ মানে কোন স্থান, বা যে স্থান, কিন্তু না একটি নির্দিষ্ট অঞ্চল।
সুতরাং ব্যবসায়ের অ্যাপ্লিকেশনগুলির জন্য, "স্থানীয়" প্রকারগুলি প্রায়শই ব্যবহৃত হয় না কারণ এগুলি কোনও সম্ভাব্য তারিখ বা সময় সম্পর্কে সাধারণ ধারণা উপস্থাপন করে কারণ টাইমলাইনে নির্দিষ্ট মুহুর্ত নয়। ব্যবসায়িক অ্যাপ্লিকেশনগুলিতে চালানটি আসার সঠিক মুহুর্ত, পরিবহণের জন্য প্রেরিত পণ্য, কোনও কর্মচারী নিয়োগ দেওয়া হয়েছিল, বা ট্যাক্সি গ্যারেজটি ছেড়ে গেছে সে সম্পর্কে যত্নবান হয়ে থাকে। তাই ব্যবসা অ্যাপ্লিকেশন ডেভেলপারদের ব্যবহার Instant
এবং ZonedDateTime
ক্লাস হিসেবে সবচেয়ে বেশি যে।
তাহলে আমরা কখন ব্যবহার করব LocalDateTime
? তিনটি পরিস্থিতিতে: যেখানে আমরা একাধিক অবস্থানগুলিতে একটি নির্দিষ্ট তারিখ এবং সময়ের-সময় প্রয়োগ করতে চাই, যেখানে আমরা অ্যাপয়েন্টমেন্টগুলি বুকিং করছি, বা যেখানে আমাদের একটি নির্ধারিত এখনও নির্ধারিত সময় অঞ্চল রয়েছে। লক্ষ্য করুন যে এই তিনটি মামলার কোনওটিই টাইমলাইনের একটি নির্দিষ্ট নির্দিষ্ট পয়েন্ট নয়, এর কোনওটিই একটি মুহুর্ত নয়।
দিনের এক সময়ের, একাধিক মুহুর্ত
কখনও কখনও আমরা একটি নির্দিষ্ট তারিখের একটি নির্দিষ্ট সময়ের অফুরন্ত প্রতিনিধিত্ব করতে চাই, তবে সময় অঞ্চল জুড়ে একাধিক এলাকায় এটি প্রয়োগ করতে চাই।
উদাহরণস্বরূপ, "ক্রিসমাস 25 ডিসেম্বর 2015 এর মধ্যরাতে শুরু হয়" একটি LocalDateTime
। মন্ট্রিয়ালের চেয়ে প্যারিসে বিভিন্ন মুহুর্তে মধ্যরাতের ধর্মঘট, এবং সিয়াটলে এবং অকল্যান্ডে আবার আলাদা ।
LocalDate ld = LocalDate.of( 2018 , Month.DECEMBER , 25 ) ;
LocalTime lt = LocalTime.MIN ; // 00:00:00
LocalTime ldt = LocalDateTime.of( ld , lt ) ; // Xmas morning anywhere.
আরেকটি উদাহরণ, "অ্যাকমে কোম্পানির একটি নীতি আছে যে বিশ্বব্যাপী এর প্রতিটি ফ্যাক্টরির মধ্যাহ্নভোজ 12:30 টায় শুরু হয়" ক LocalTime
। আসল অর্থ বোঝার জন্য আপনাকে স্টুটগার্ট কারখানায় 12:30 বা রাবাত কারখানায় 12:30 বা সিডনি ফ্যাক্টরিতে 12:30 এর মুহূর্তটি চিত্রিত করার জন্য টাইমলাইনে এটি প্রয়োগ করতে হবে ।
অ্যাপয়েন্টমেন্ট বুকিং
ব্যবহারের আরেকটি পরিস্থিতি LocalDateTime
হ'ল ভবিষ্যতের ইভেন্টগুলি বুকিংয়ের জন্য (উদা: দন্ত বিশেষজ্ঞের অ্যাপয়েন্টমেন্ট)। এই অ্যাপয়েন্টমেন্টগুলি ভবিষ্যতে অনেক বেশি হতে পারে যে আপনি রাজনীতিবিদদের সময় অঞ্চলটিকে নতুন করে সংজ্ঞায়িত করার ঝুঁকিপূর্ণ। রাজনীতিবিদরা প্রায়শই সামান্য আগুন জ্বালান, এমনকি কোনও সতর্কতাও দেন না। যদি রাজনীতিবিদরা কীভাবে ঘড়ির সাথে খেলতে পারেন নির্বিশেষে আপনার যদি আগামী ২৩ শে জানুয়ারী "3 টা প্রধানমন্ত্রী" এর অর্থ হয়, তবে আপনি একটি মুহূর্তও রেকর্ড করতে পারবেন না - যদি সেই অঞ্চলটি ডাইটলাইট সেভিংয়ের সময়টিকে অবলম্বন করে বা বাদ দেয় তবে 3 মিনিটের সময় 2 বা 4 মিনিটে পরিণত হতে পারে, উদাহরণ স্বরূপ.
অ্যাপয়েন্টমেন্টের জন্য, আলাদাভাবে রাখা একটি LocalDateTime
এবং একটি সঞ্চয় করুন ZoneId
। পরে, তফসিল তৈরি করার সময়, অন-ফ্লাই LocalDateTime::atZone( ZoneId )
কোনও ZonedDateTime
অবজেক্ট উত্পন্ন করার জন্য কল করে একটি মুহূর্ত নির্ধারণ করে ।
ZonedDateTime zdt = ldt.atZone( z ) ; // Given a date, a time-of-day, and a time zone, determine a moment, a point on the timeline.
প্রয়োজনে আপনি ইউটিসিতে সামঞ্জস্য করতে পারেন। এর Instant
থেকে একটি বের করুন ZonedDateTime
।
Instant instant = zdt.toInstant() ; // Adjust from some zone to UTC. Same moment, same point on the timeline, different wall-clock time.
অজানা অঞ্চল
কিছু লোক এমন LocalDateTime
পরিস্থিতিতে ব্যবহার করতে পারে যেখানে সময় অঞ্চল বা অফসেট অজানা।
আমি এই কেসটিকে অনুচিত এবং বুদ্ধিমান বিবেচনা করি। যদি কোনও অঞ্চল বা অফসেট উদ্দেশ্যযুক্ত তবে নির্ধারিত হয়, আপনার কাছে খারাপ ডেটা রয়েছে। এটি উদ্দেশ্যমূলক মুদ্রা না জেনে কোনও পণ্যের মূল্য সঞ্চয় করার মতো হবে। ভালো বুদ্ধি নই.
সমস্ত তারিখ-সময় প্রকার
সম্পূর্ণতার জন্য, এখানে জাভাতে আধুনিক এবং উত্তরাধিকারী এবং এসকিউএল স্ট্যান্ডার্ড দ্বারা সংজ্ঞায়িত সমস্ত সম্ভাব্য তারিখ-সময়ের ধরণের একটি টেবিল রয়েছে। এটি বৃহত্তর প্রসঙ্গে Instant
& LocalDateTime
ক্লাসগুলি স্থাপনে সহায়তা করতে পারে ।
জেডিবিসি ৪.২ ডিজাইনে জাভা দলটি করা অদ্ভুত পছন্দগুলি লক্ষ্য করুন। তারা সব জাভা.টাইম সময় সমর্থন করে ... দুটি সর্বাধিক ব্যবহৃত ক্লাস বাদে: Instant
এবং ZonedDateTime
।
তবে চিন্তার কিছু নেই। আমরা সহজেই পিছনে পিছনে রূপান্তর করতে পারি।
রূপান্তরিত হচ্ছে Instant
।
// Storing
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
myPreparedStatement.setObject( … , odt ) ;
// Retrieving
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Instant instant = odt.toInstant() ;
রূপান্তরিত হচ্ছে ZonedDateTime
।
// Storing
OffsetDateTime odt = zdt.toOffsetDateTime() ;
myPreparedStatement.setObject( … , odt ) ;
// Retrieving
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = odt.atZone( z ) ;
জাভা.টাইম সম্পর্কে
Java.time ফ্রেমওয়ার্ক জাভা 8 এবং পরে পাতাটা করা হয়। এই ক্লাসগুলি , & , এর মতো সমস্যাযুক্ত পুরানো উত্তরাধিকারের তারিখ-সময়ের ক্লাসগুলিকে সহায়তা করে ।java.util.Date
Calendar
SimpleDateFormat
Joda-টাইম প্রকল্প, এখন রক্ষণাবেক্ষণ মোড , মাইগ্রেশনে উপদেশ java.time ক্লাস।
আরও জানতে, ওরাকল টিউটোরিয়াল দেখুন । এবং অনেক উদাহরণ এবং ব্যাখ্যার জন্য স্ট্যাক ওভারফ্লো অনুসন্ধান করুন। স্পেসিফিকেশনটি জেএসআর 310 ।
আপনি আপনার ডাটাবেসের সাথে জাভা.টাইম অবজেক্টগুলি সরাসরি বিনিময় করতে পারেন । জেডিবিসি ৪.২ বা তারপরের সাথে অনুগত একটি জেডিবিসি ড্রাইভার ব্যবহার করুন । স্ট্রিংগুলির দরকার নেই, ক্লাসের প্রয়োজন নেই ।java.sql.*
জাভা.টাইম ক্লাস কোথায় পাবেন?
ThreeTen-অতিরিক্ত প্রকল্প অতিরিক্ত শ্রেণীর সাথে java.time প্রসারিত করে। এই প্রকল্পটি জাভা.টাইমে সম্ভাব্য ভবিষ্যতের সংযোজনগুলির একটি প্রমাণযোগ্য ক্ষেত্র। আপনি এখানে কিছু দরকারী শ্রেণীর যেমন খুঁজে পেতে পারেন Interval
, YearWeek
, YearQuarter
, এবং আরো ।