TL; ড
হোস্ট মেশিনে ম্যানুয়ালি সিস্টেমের ঘড়িটি পরিবর্তনের পরিবর্তে সিস্টেমকন্ট্রেন্টটাইমমিলিসের মাধ্যমে উপস্থাপিত বর্তমান সময়কে ওভাররাইড করার জন্য কোডে বা জেভিএম আর্গুমেন্টের সাথে কি কোনও উপায় আছে?
হ্যাঁ.
Instant.now(
Clock.fixed(
Instant.parse( "2016-01-23T12:34:56Z"), ZoneOffset.UTC
)
)
Clock জাভা.টাইমে
ভুল -তারিখ-সময়ের মানগুলির সাথে পরীক্ষার সুবিধার্থে আমাদের প্লাগেবল ঘড়ি প্রতিস্থাপনের সমস্যার নতুন সমাধান রয়েছে । Java.time প্যাকেজ মধ্যে জাভা 8 একটি বিমূর্ত বর্গ অন্তর্ভুক্ত java.time.Clock, একটি সুনির্দিষ্ট উদ্দেশ্য সঙ্গে:
যখন প্রয়োজন হয় তখন বিকল্প ঘড়িগুলি প্লাগ ইন করার অনুমতি দেয়
আপনি নিজের বাস্তবায়নের জন্য প্লাগ ইন Clockকরতে পারেন, যদিও আপনি সম্ভবত আপনার চাহিদা মেটাতে ইতিমধ্যে তৈরি একটি খুঁজে পেতে পারেন। আপনার সুবিধার জন্য, জাভা.টাইমে বিশেষ বাস্তবায়ন উপার্জনের স্থিত পদ্ধতি অন্তর্ভুক্ত। এই বিকল্প বাস্তবায়ন পরীক্ষার সময় মূল্যবান হতে পারে।
পরিবর্তিত ক্যাডেন্স
বিভিন্ন tick…পদ্ধতি এমন ঘড়ি তৈরি করে যা বর্তমান মুহুর্তটিকে আলাদা আলাদা ক্যাডেন্সের সাথে বাড়িয়ে তোলে।
ডিফল্ট Clockসময় যেমন ঘন ঘন আপডেট করা যেমন রিপোর্ট মিলিসেকেন্ড যেমন জরিমানা হিসাবে জাভা 8 এবং জাভা 9 ন্যানোসেকেন্ড (আপনার হার্ডওয়ার উপর নির্ভর করে)। আপনি সত্যিকারের বর্তমান মুহুর্তটিকে ভিন্ন গ্রানুলারিটির সাথে প্রতিবেদন করার জন্য বলতে পারেন।
মিথ্যা ঘড়ি
কিছু ঘড়ি মিথ্যা বলতে পারে, হোস্ট ওএসের হার্ডওয়্যার ক্লকের চেয়ে আলাদা ফলাফল তৈরি করে।
fixed - একক অপরিবর্তনীয় (অ-বর্ধমান) মুহুর্তটিকে বর্তমান মুহুর্ত হিসাবে প্রতিবেদন করে।
offset- বর্তমান মুহুর্তের প্রতিবেদন করে তবে পাস হওয়া Durationযুক্তি দ্বারা স্থানান্তরিত ।
উদাহরণস্বরূপ, এই বছরের প্রথম দিকের ক্রিসমাসের প্রথম মুহূর্তে লক করুন। অন্য কথায়, যখন সান্তা এবং তার নীলকান্তি তাদের প্রথম থামবে । নিকটতম সময় অঞ্চল আজকাল মনে করা হয় Pacific/Kiritimatiএ +14:00।
LocalDate ld = LocalDate.now( ZoneId.of( "America/Montreal" ) );
LocalDate xmasThisYear = MonthDay.of( Month.DECEMBER , 25 ).atYear( ld.getYear() );
ZoneId earliestXmasZone = ZoneId.of( "Pacific/Kiritimati" ) ;
ZonedDateTime zdtEarliestXmasThisYear = xmasThisYear.atStartOfDay( earliestXmasZone );
Instant instantEarliestXmasThisYear = zdtEarliestXmasThisYear.toInstant();
Clock clockEarliestXmasThisYear = Clock.fixed( instantEarliestXmasThisYear , earliestXmasZone );
সর্বদা একই মুহূর্তটি ফিরে আসতে সেই নির্দিষ্ট স্থির ঘড়িটি ব্যবহার করুন। আমরা কিরীটিমতিতে ক্রিসমাস দিবসের প্রথম মুহূর্তটি পাই , ইউটিসি চৌদ্দ ঘন্টা আগে দেওয়াল-ঘড়ির সময় দেখায় , ২৪ শে ডিসেম্বর এর পূর্বের তারিখের দশটায় AM
Instant instant = Instant.now( clockEarliestXmasThisYear );
ZonedDateTime zdt = ZonedDateTime.now( clockEarliestXmasThisYear );
instant.toString (): 2016-12-24T10: 00: 00Z
zdt.toString (): 2016-12-25T00: 00 + 14: 00 [প্রশান্ত মহাসাগর / কিরীটিমতি]
IdeOne.com এ লাইভ কোড দেখুন ।
সত্য সময়, বিভিন্ন সময় অঞ্চল
Clockবাস্তবায়নের মাধ্যমে কোন সময় অঞ্চল নির্ধারিত হয়েছে তা আপনি নিয়ন্ত্রণ করতে পারেন । এটি কিছু পরীক্ষায় কার্যকর হতে পারে। তবে আমি এটি উত্পাদন কোডে প্রস্তাব দিই না, যেখানে আপনার সর্বদা theচ্ছিক ZoneIdবা ZoneOffsetযুক্তিগুলি স্পষ্টভাবে নির্দিষ্ট করা উচিত ।
আপনি ইউটিসিটিকে ডিফল্ট অঞ্চল হিসাবে নির্দিষ্ট করতে পারেন।
ZonedDateTime zdtClockSystemUTC = ZonedDateTime.now ( Clock.systemUTC () );
আপনি যে কোনও নির্দিষ্ট সময় অঞ্চল নির্দিষ্ট করতে পারেন। একটি নির্দিষ্ট করুন সঠিক সময় অঞ্চল নাম এর বিন্যাসে continent/regionযেমন America/Montreal, Africa/Casablancaঅথবা Pacific/Auckland। কখনও যেমন 3-4 চিঠি সংক্ষেপ ব্যবহার ESTবা ISTহিসাবে তারা না সত্য সময় অঞ্চল, না মান, এবং এমনকি অনন্য নয় (!)।
ZonedDateTime zdtClockSystem = ZonedDateTime.now ( Clock.system ( ZoneId.of ( "America/Montreal" ) ) );
আপনি জেভিএমের বর্তমান ডিফল্ট টাইম অঞ্চল নির্দিষ্ট Clockকোনও অবজেক্টের জন্য ডিফল্ট হওয়া উচিত তা নির্দিষ্ট করতে পারেন ।
ZonedDateTime zdtClockSystemDefaultZone = ZonedDateTime.now ( Clock.systemDefaultZone () );
তুলনা করতে এই কোড চালান। নোট করুন যে তারা সকলেই একই মুহূর্ত, একই লাইনে সময়রেখায় প্রতিবেদন করে। তারা কেবল প্রাচীর-ঘড়ির সময়গুলিতে পৃথক হয় ; অন্য কথায়, একই জিনিস বলার জন্য তিনটি উপায়, একই মুহুর্তটি প্রদর্শনের জন্য তিনটি উপায়।
System.out.println ( "zdtClockSystemUTC.toString(): " + zdtClockSystemUTC );
System.out.println ( "zdtClockSystem.toString(): " + zdtClockSystem );
System.out.println ( "zdtClockSystemDefaultZone.toString(): " + zdtClockSystemDefaultZone );
America/Los_Angeles এই কোডটি চালিত কম্পিউটারে জেভিএম বর্তমান ডিফল্ট অঞ্চল ছিল।
zdtClockSystemUTC.toString (): 2016-12-31T20: 52: 39.688Z
zdtClockSystem.toString (): 2016-12-31T15: 52: 39.750-05: 00 [আমেরিকা / মন্ট্রিল]
zdtClockSystemDefaultZone.toString (): 2016-12-31T12: 52: 39.762-08: 00 [আমেরিকা / লস_এঞ্জেলস]
Instantবর্গ সংজ্ঞা দ্বারা ইউটিসি সর্বদা। সুতরাং এই তিনটি অঞ্চল-সম্পর্কিত Clockব্যবহারের ঠিক একই প্রভাব রয়েছে।
Instant instantClockSystemUTC = Instant.now ( Clock.systemUTC () );
Instant instantClockSystem = Instant.now ( Clock.system ( ZoneId.of ( "America/Montreal" ) ) );
Instant instantClockSystemDefaultZone = Instant.now ( Clock.systemDefaultZone () );
ইনস্ট্যান্টক্লকসিস্টমুটসি.টোস্ট্রিং (): 2016-12-31T20: 52: 39.763Z
ইনস্ট্যান্টক্লকসিস্টেম.টোস্ট্রিং (): 2016-12-31T20: 52: 39.763Z
ইনস্ট্যান্টক্লকসিস্টেমডিফল্টজোন.টো স্ট্রিং (): 2016-12-31T20: 52: 39.763Z
ডিফল্ট ঘড়ি
এর জন্য ডিফল্টরূপে প্রয়োগ করা বাস্তবায়নের মাধ্যমে Instant.nowফিরে আসে Clock.systemUTC()। আপনি যখন কোনও নির্দিষ্ট না করেন তখন এটি ব্যবহার করা হয় Clock। প্রি-রিলিজ জাভা 9 এর জন্য কোডের জন্যInstant.now নিজের জন্য দেখুন ।
public static Instant now() {
return Clock.systemUTC().instant();
}
Clockজন্য ডিফল্ট OffsetDateTime.nowএবং ZonedDateTime.nowহয় Clock.systemDefaultZone()। উত্স কোড দেখুন ।
public static ZonedDateTime now() {
return now(Clock.systemDefaultZone());
}
জাভা 8 এবং জাভা 9 এর মধ্যে পূর্বনির্ধারিত প্রয়োগগুলির আচরণ পরিবর্তিত হয়েছে জাভা 8-এ, বর্তমান মুহুর্তটি ন্যানোসেকেন্ডগুলির রেজোলিউশন সঞ্চয় করার ক্লাসগুলির ক্ষমতা থাকা সত্ত্বেও কেবলমাত্র মিলি সেকেন্ডে একটি রেজোলিউশনের সাহায্যে ধরা পড়ে । জাভা 9 আপনার কম্পিউটারের হার্ডওয়্যার ঘড়ির ক্ষমতার উপর নির্ভর করে - অবশ্যই ন্যানোসেকেন্ডগুলির রেজোলিউশন সহ বর্তমান মুহূর্তটি ক্যাপচারে সক্ষম একটি নতুন বাস্তবায়ন এনেছে।
জাভা.টাইম সম্পর্কে
Java.time ফ্রেমওয়ার্ক জাভা 8 এবং পরে পাতাটা করা হয়। এই ক্লাসগুলি , & , এর মতো সমস্যাযুক্ত পুরানো উত্তরাধিকারের তারিখ-সময়ের ক্লাসগুলিকে সহায়তা করে ।java.util.DateCalendarSimpleDateFormat
আরও জানতে, ওরাকল টিউটোরিয়ালটি দেখুন । এবং অনেক উদাহরণ এবং ব্যাখ্যার জন্য স্ট্যাক ওভারফ্লো অনুসন্ধান করুন। স্পেসিফিকেশনটি জেএসআর 310 ।
Joda-টাইম প্রকল্প, এখন রক্ষণাবেক্ষণ মোড , মাইগ্রেশনে উপদেশ java.time ক্লাস।
আপনি আপনার ডাটাবেসের সাথে জাভা.টাইম অবজেক্টগুলি সরাসরি বিনিময় করতে পারেন । জেডিবিসি ৪.২ বা তারপরের সাথে অনুগত একটি জেডিবিসি ড্রাইভার ব্যবহার করুন । স্ট্রিংগুলির দরকার নেই, ক্লাসের প্রয়োজন নেই । হাইবারনেট 5 এবং জেপিএ 2.2 সমর্থন জাভা.টাইম ।java.sql.*
জাভা.টাইম ক্লাস কোথায় পাবেন?