জোনঅফসেট.ইউটিসি! = জোনালআইড.ওফ ("ইউটিসি") কেন?


125

কেন

ZonedDateTime now = ZonedDateTime.now();
System.out.println(now.withZoneSameInstant(ZoneOffset.UTC)
        .equals(now.withZoneSameInstant(ZoneId.of("UTC"))));

প্রিন্ট আউট false?

আমি উভয় ZonedDateTimeদৃষ্টান্ত সমান হবে আশা করি ।

উত্তর:


180

উত্তরটি (জোর দেওয়া খনি) এর জাভাদোক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

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