কেন
ZonedDateTime now = ZonedDateTime.now();
System.out.println(now.withZoneSameInstant(ZoneOffset.UTC)
.equals(now.withZoneSameInstant(ZoneId.of("UTC"))));
প্রিন্ট আউট false
?
আমি উভয় ZonedDateTime
দৃষ্টান্ত সমান হবে আশা করি ।
কেন
ZonedDateTime now = ZonedDateTime.now();
System.out.println(now.withZoneSameInstant(ZoneOffset.UTC)
.equals(now.withZoneSameInstant(ZoneId.of("UTC"))));
প্রিন্ট আউট false
?
আমি উভয় ZonedDateTime
দৃষ্টান্ত সমান হবে আশা করি ।
উত্তর:
উত্তরটি (জোর দেওয়া খনি) এর জাভাদোকZoneId
থেকে এসেছে ...
একটি জোনআইড ইনস্ট্যান্ট এবং লোকালডেটটাইমের মধ্যে রূপান্তর করতে ব্যবহৃত নিয়মগুলি সনাক্ত করতে ব্যবহৃত হয়। দুটি পৃথক ধরণের আইডি রয়েছে:
- স্থির অফসেট - ইউটিসি / গ্রিনউইচ থেকে সম্পূর্ণরূপে সমাধান হওয়া অফসেট, যা সমস্ত স্থানীয় তারিখের সময়গুলির জন্য একই অফসেট ব্যবহার করে
- ভৌগলিক অঞ্চল - এমন একটি অঞ্চল যেখানে ইউটিসি / গ্রিনউইচ থেকে অফসেট সন্ধানের জন্য নিয়মের একটি নির্দিষ্ট সেট প্রযোজ্য
সর্বাধিক স্থির অফসেটগুলি জোনঅফসেট দ্বারা প্রতিনিধিত্ব করা হয়। যেকোন জোনআইডিতে কল করুন () স্বাভাবিক করা নিশ্চিত করবে যে একটি স্থির অফসেট আইডি জোনঅফসেট হিসাবে উপস্থাপন করা হবে।
... এবং (জোর খনি) এর জাভাদোকZoneId#of
থেকে :
এই পদ্ধতিটি একটি জোনআইড বা জোনঅফসেট উত্পাদনকারী আইডিটিকে বিশ্লেষণ করে। আইডি 'জেড', বা '+' বা '-' দিয়ে শুরু হলে একটি জোনঅফসেট ফিরে আসে ।
আর্গুমেন্ট আইডি হিসাবে নির্দিষ্ট করা হয়েছে "UTC"
, সুতরাং এটি ZoneId
অফসেট সহ একটি ফিরিয়ে দেবে , যা স্ট্রিং আকারে উপস্থাপন করেছে:
System.out.println(now.withZoneSameInstant(ZoneOffset.UTC));
System.out.println(now.withZoneSameInstant(ZoneId.of("UTC")));
আউটপুট:
2017-03-10T08:06:28.045Z
2017-03-10T08:06:28.045Z[UTC]
আপনি equals
তুলনার জন্য পদ্ধতিটি ব্যবহার করার সাথে সাথে আপনি অবজেক্টের সমতুল্যের জন্য পরীক্ষা করে দেখুন । বর্ণিত পার্থক্যের কারণে, মূল্যায়নের ফলাফল false
।
যখন normalized()
পদ্ধতি হিসাবে ডকুমেন্টেশন প্রস্তাব ব্যবহার করা হয়, ব্যবহার তুলনা equals
ফিরে আসবে true
, যেমন normalized()
সংশ্লিষ্ট ফিরে আসবে ZoneOffset
:
সময়-অঞ্চল আইডিটিকে সাধারণ করে তোলে, যেখানে সম্ভব সেখানে জোনঅফसेटটি ফিরিয়ে দেয়।
now.withZoneSameInstant(ZoneOffset.UTC)
.equals(now.withZoneSameInstant(ZoneId.of("UTC").normalized())); // true
ডকুমেন্টেশনে যেমন বলা হয়েছে, আপনি যদি ইনপুট আইডি ব্যবহার করেন "Z"
বা "+0"
হিসাবে ব্যবহার of
করেন, ZoneOffset
সরাসরি ফিরে আসবে এবং কল করার দরকার নেই normalized()
:
now.withZoneSameInstant(ZoneOffset.UTC).equals(now.withZoneSameInstant(ZoneId.of("Z"))); //true
now.withZoneSameInstant(ZoneOffset.UTC).equals(now.withZoneSameInstant(ZoneId.of("+0"))); //true
তারা একই তারিখের সময় সঞ্চয় করে কিনা তা পরীক্ষা করার জন্য , আপনি তার isEqual
পরিবর্তে পদ্ধতিটি ব্যবহার করতে পারেন :
now.withZoneSameInstant(ZoneOffset.UTC)
.isEqual(now.withZoneSameInstant(ZoneId.of("UTC"))); // true
নমুনা
System.out.println("equals - ZoneId.of(\"UTC\"): " + nowZoneOffset
.equals(now.withZoneSameInstant(ZoneId.of("UTC"))));
System.out.println("equals - ZoneId.of(\"UTC\").normalized(): " + nowZoneOffset
.equals(now.withZoneSameInstant(ZoneId.of("UTC").normalized())));
System.out.println("equals - ZoneId.of(\"Z\"): " + nowZoneOffset
.equals(now.withZoneSameInstant(ZoneId.of("Z"))));
System.out.println("equals - ZoneId.of(\"+0\"): " + nowZoneOffset
.equals(now.withZoneSameInstant(ZoneId.of("+0"))));
System.out.println("isEqual - ZoneId.of(\"UTC\"): "+ nowZoneOffset
.isEqual(now.withZoneSameInstant(ZoneId.of("UTC"))));
আউটপুট:
equals - ZoneId.of("UTC"): false
equals - ZoneId.of("UTC").normalized(): true
equals - ZoneId.of("Z"): true
equals - ZoneId.of("+0"): true
isEqual - ZoneId.of("UTC"): true
ZoneId.of("Z")
আপনাকে দেয়ZoneOffset.UTC
কিন্তুZoneId.of("UTC")
আপনাকে দেয়ZoneId
(তা নয়ZoneOffset.UTC
)। কমপক্ষে বলতে গেলে এই এপিআই অপ্রয়োজনীয়।