জাভা 8-তে টাইমজোন সহ লোকালডেটটাইম ফর্ম্যাট করুন


121

আমার এই সহজ কোডটি রয়েছে:

DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss.SSSSSS Z");
LocalDateTime.now().format(FORMATTER)

তাহলে আমি নিম্নলিখিত ব্যতিক্রম পাব:

java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: OffsetSeconds
at java.time.LocalDate.get0(LocalDate.java:680)
at java.time.LocalDate.getLong(LocalDate.java:659)
at java.time.LocalDateTime.getLong(LocalDateTime.java:720)
at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)
at java.time.format.DateTimeFormatterBuilder$OffsetIdPrinterParser.format(DateTimeFormatterBuilder.java:3315)
at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2182)
at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1745)
at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1719)
at java.time.LocalDateTime.format(LocalDateTime.java:1746)

কীভাবে এই সমস্যাটি সমাধান করবেন?

উত্তর:


212

LocalDateTimeসময়-অঞ্চল ছাড়া তারিখের সময়। আপনি বিন্যাসে টাইম জোন অফসেট ফর্ম্যাট প্রতীকটি নির্দিষ্ট করেছেন, তবে LocalDateTimeএই জাতীয় তথ্য নেই। এজন্য ত্রুটি ঘটেছে।

আপনি যদি সময়-অঞ্চলের তথ্য চান তবে আপনার ব্যবহার করা উচিত ZonedDateTime

DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss.SSSSSS Z");
ZonedDateTime.now().format(FORMATTER);
=> "20140829 14:12:22.122000 +09"

3
সুপার সহায়ক। নিশ্চিত না যে আমি এত সহজেই টাইমজোন টুকরোটি ধরতে পারতাম। দুর্দান্ত উত্তর। ধন্যবাদ!
লরান ইভান্স

40

জেএসআর -310 (জাভা -8-এ জাভা.টাইম-প্যাকেজ) -এর "স্থানীয়" উপসর্গটি নির্দেশ করে না যে class শ্রেণির অভ্যন্তরীণ অবস্থার সময়সীমা সম্পর্কিত তথ্য রয়েছে (এখানে LocalDateTime:)। মত প্রায়ই বিভ্রান্তিকর নাম যেমন শ্রেণীর সত্ত্বেও LocalDateTimeবা LocalTimeকোন সময় অঞ্চল তথ্য বা অফসেট আছে

আপনি অফসেট তথ্য (যেমন প্যাটার্ন প্রতীক জেড দ্বারা নির্দেশিত) সহ এ জাতীয় একটি টাইমোরাল টাইপ (যা কোনও অফসেট ধারণ করে না) ফর্ম্যাট করার চেষ্টা করেছিলেন। সুতরাং ফর্ম্যাটরটি একটি অনুপলব্ধ তথ্য অ্যাক্সেস করার চেষ্টা করে এবং আপনি যে ব্যতিক্রম লক্ষ্য করেছেন তা নিক্ষেপ করতে হবে।

সমাধান:

এমন কোনও টাইপ ব্যবহার করুন যাতে অফসেট বা টাইমজোন সম্পর্কিত তথ্য রয়েছে। জেএসআর -310 এ হয় হয় OffsetDateTime(এতে অফসেট থাকে তবে ডিএসটি-বিধি সহ টাইমজোন নয়) বা ZonedDateTime। আপনি এই জাতীয় ধরণের সমস্ত সমর্থিত ক্ষেত্রগুলি পদ্ধতিটি সমর্থনযোগ্য (টেম্পোরালফিল্ড) এর উপর নজর রাখতে পারেন। । ক্ষেত্রটি OffsetSecondsইন OffsetDateTimeএবং সমর্থন করে ZonedDateTimeনা LocalDateTime

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss.SSSSSS Z");
String s = ZonedDateTime.now().format(formatter);

বিভ্রান্তি এড়াতে আপনি কোন উপসর্গের সাথে "স্থানীয়" উপস্থাপন করেছিলেন?
ম্যাথু

@ ম্যাথেজও ছিল একটি ব্যাংক ক্রেডিট স্যুসের বিতর্ক শুরু হয়েছিল যার নাম PlainDateTimeইত্যাদি বোঝাচ্ছিল সম্ভবত সম্ভবত আরও ভাল কারণ উপসর্গটির "প্লেইন" ইঙ্গিত দেয় যে ঠিক তারিখের বাইরে আর কিছু নেই। আমরা যদি এখনও জাভা ভি 1.0 এর আগে থাকতাম তবে উপসর্গটি আরও ভাল হত না, তবে Dateইত্যাদির নামগুলি ইতিমধ্যে পুরানো জেডিকে দ্বারা সংরক্ষিত।
মেনো হচসচাইল্ড

-4

লোকালডেটটাইম.নো () ফর্ম্যাট (তারিখটাইমফর্ম্যাটর.ওফ প্যাটার্ন ("yyyyMMdd এইচ: মিমি: এসএসএসএসএস জেড"));

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.