অন্যদের দ্বারা ব্যাখ্যা করা হিসাবে, সেখানে একটি সময় বিরতি। সেখানে জন্য দুটি সম্ভাব্য সময় অঞ্চল অফসেট হয় 1927-12-31 23:54:08
এ Asia/Shanghai
, কিন্তু শুধুমাত্র এক জন্য অফসেট 1927-12-31 23:54:07
। সুতরাং, অফসেটটি কোনটি ব্যবহৃত হয় তার উপর নির্ভর করে একটি হয় দ্বিতীয় সেকেন্ড পার্থক্য বা 5 মিনিট এবং 53 সেকেন্ডের পার্থক্য।
অফসেটের এই সামান্য শিফটটি, আমাদের এক ঘন্টার স্বাভাবিক দিবালোক সঞ্চয় (গ্রীষ্মকালীন সময়) এর পরিবর্তে সমস্যাটি কিছুটা অস্পষ্ট করে।
নোট করুন যে টাইমজোন ডাটাবেসের 2013a আপডেটটি এই সীমাবদ্ধতাটি কয়েক সেকেন্ড আগে সরিয়ে নিয়েছিল, তবে এর প্রভাবটি এখনও পর্যবেক্ষণযোগ্য হবে।
java.time
জাভা 8- এ নতুন প্যাকেজটি এটিকে আরও স্পষ্টভাবে দেখতে দিন এবং এটি পরিচালনা করার জন্য সরঞ্জাম সরবরাহ করুন। প্রদত্ত:
DateTimeFormatterBuilder dtfb = new DateTimeFormatterBuilder();
dtfb.append(DateTimeFormatter.ISO_LOCAL_DATE);
dtfb.appendLiteral(' ');
dtfb.append(DateTimeFormatter.ISO_LOCAL_TIME);
DateTimeFormatter dtf = dtfb.toFormatter();
ZoneId shanghai = ZoneId.of("Asia/Shanghai");
String str3 = "1927-12-31 23:54:07";
String str4 = "1927-12-31 23:54:08";
ZonedDateTime zdt3 = LocalDateTime.parse(str3, dtf).atZone(shanghai);
ZonedDateTime zdt4 = LocalDateTime.parse(str4, dtf).atZone(shanghai);
Duration durationAtEarlierOffset = Duration.between(zdt3.withEarlierOffsetAtOverlap(), zdt4.withEarlierOffsetAtOverlap());
Duration durationAtLaterOffset = Duration.between(zdt3.withLaterOffsetAtOverlap(), zdt4.withLaterOffsetAtOverlap());
তারপরে durationAtEarlierOffset
এক সেকেন্ড হবে, যখন durationAtLaterOffset
পাঁচ মিনিট 53 সেকেন্ড হবে।
এছাড়াও, এই দুটি অফসেট একই:
// Both have offsets +08:05:52
ZoneOffset zo3Earlier = zdt3.withEarlierOffsetAtOverlap().getOffset();
ZoneOffset zo3Later = zdt3.withLaterOffsetAtOverlap().getOffset();
তবে এই দুটি পৃথক:
// +08:05:52
ZoneOffset zo4Earlier = zdt4.withEarlierOffsetAtOverlap().getOffset();
// +08:00
ZoneOffset zo4Later = zdt4.withLaterOffsetAtOverlap().getOffset();
আপনি দেখতে পারেন একই সমস্যা তুলনা 1927-12-31 23:59:59
সঙ্গে 1928-01-01 00:00:00
, যদিও, এই ক্ষেত্রে, আগেই অফসেট যা আর বিকিরণ উৎপন্ন করে, এবং এটি আগের তারিখ দুটি সম্ভাব্য অফসেট রয়েছে।
এর কাছে যাওয়ার আরও একটি উপায় হ'ল কোনও রূপান্তর চলছে কিনা তা যাচাই করা। আমরা এটি এইভাবে করতে পারি:
// Null
ZoneOffsetTransition zot3 = shanghai.getRules().getTransition(ld3.toLocalDateTime);
// An overlap transition
ZoneOffsetTransition zot4 = shanghai.getRules().getTransition(ld3.toLocalDateTime);
আপনি সেই তারিখ / সময়টির জন্য একাধিক বৈধ অফসেট বা সেই ফাঁক যেখানে date অঞ্চল আইডির জন্য সেই তারিখ / সময়টি বৈধ নয় - সেখানে isOverlap()
এবং isGap()
পদ্ধতিগুলি ব্যবহার করে ট্রানজিশনটি ওভারল্যাপ কিনা তা আপনি পরীক্ষা করতে পারেন zot4
।
আমি আশা করি একবার জাভা 8 ব্যাপকভাবে উপলব্ধ হয়ে উঠলে বা JSR 310 ব্যাকপোর্ট গ্রহণকারী জাভা 7 ব্যবহারকারীদের কাছে এটি এই ধরণের সমস্যাটিকে পরিচালনা করতে সহায়তা করে।