লোকালডেটটাইম (জাভা 8) পার্স করার সময় টেম্পোরালএ্যাকসেসরের কাছ থেকে লোকালডেটটাইম পেতে অক্ষম


150

আমি কেবল জাভা 8-তে একটি ডেট স্ট্রিংকে ডেটটাইম অবজেক্টে রূপান্তরিত করার চেষ্টা করছি নীচের লাইনগুলি চালানোর পরে:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime dt = LocalDateTime.parse("20140218", formatter);

আমি নিম্নলিখিত ত্রুটি পেয়েছি:

Exception in thread "main" java.time.format.DateTimeParseException: 
Text '20140218' could not be parsed: 
Unable to obtain LocalDateTime from TemporalAccessor: 
{},ISO resolved to 2014-02-18 of type java.time.format.Parsed
    at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1918)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1853)
    at java.time.LocalDateTime.parse(LocalDateTime.java:492)

সিনট্যাক্সটি এখানে যা পরামর্শ দেওয়া হয়েছে তার অনুরূপ , তবুও আমি একটি ব্যতিক্রম সহ পরিবেশন করছি। আমি ব্যবহার করছি JDK-8u25

উত্তর:


177

দেখা যাচ্ছে যে জাভা তারিখের সময় হিসাবে একটি খালি তারিখ মান গ্রহণ করে না। লোকালডেটটাইমের পরিবর্তে লোকালডেট ব্যবহার করা সমস্যার সমাধান করে:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate dt = LocalDate.parse("20140218", formatter);

42
এটির মূল্য কীসের জন্য: ব্যবহার করার সময় LocalDateএবং না করার পরেও আমার একই সমস্যা ছিল LocalDateTime। বিষয়টি ছিল যে আমি আমার তৈরি করেছে DateTimeFormatterব্যবহার .withResolverStyle(ResolverStyle.STRICT);, তাই আমি তারিখ প্যাটার্ন ব্যবহার ছিল uuuuMMddপরিবর্তে yyyyMMdd(পরিবর্তে "বছরের অফ যুগ" এর মানে ওই "বছর")!
জিরোঅন

71

আপনার যদি সত্যই কোনও তারিখকে লোকালডেটটাইম অবজেক্টে রূপান্তর করতে হয় তবে আপনি লোকালডেট.এটিস্টার্টঅফডে () ব্যবহার করতে পারেন। ঘন্টা, মিনিট এবং দ্বিতীয় ক্ষেত্রটি 0 তে সেট করা আপনাকে নির্দিষ্ট তারিখে এটি একটি লোকালডেটটাইম অবজেক্ট দেবে:

final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime time = LocalDate.parse("20140218", formatter).atStartOfDay();

2
সংশোধন: সেদিনের শুরুতে যে কোনও সময় সেট করা হবে
ট্রেজকাজ

20
LocalDateTime.fromatStartOfDay()ইতিমধ্যে রিটার্ন হিসাবে অপ্রয়োজনীয় বলে মনে হচ্ছে LocalDateTime
দরিউজ

1
স্কাল: ভাল সময় = লোকালডেট.পারস ("20171220", ডেটটাইম ফর্ম্যাটটার.ওফ প্যাটার্ন ("yyyyMMdd")) St স্টার্টঅফডে.ফর্ম্যাট (ডেটটাইমফর্ম্যাটর.ওফ্যাটার্ন ("yyyy-MM-dd HH: মিমি: এসএস"))
উডি সান

48

কারও পক্ষে যদি এই বিষয়টি আবার পড়তে হয় তবে (আমার মত) সঠিক উত্তরটি DateTimeFormatterসংজ্ঞাতে হবে, উদাহরণস্বরূপ:

private static DateTimeFormatter DATE_FORMAT =  
            new DateTimeFormatterBuilder().appendPattern("dd/MM/yyyy[ [HH][:mm][:ss][.SSS]]")
            .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
            .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
            .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
            .toFormatter(); 

Theyচ্ছিক ক্ষেত্রগুলি প্রদর্শিত হবে যদি সেগুলি সেট করা উচিত। এবং কোডের বাকী অংশটি হুবহু এক রকম হওয়া উচিত।


1
এই যেমন পদ্ধতির উদাহরণস্বরূপ এটি সত্য সর্বজনীন সমাধান: লং getFileTimestamp (স্ট্রিং ফাইল, প্যাটার্ন প্যাটার্ন, তারিখটাইমফর্ম্যাটর dtf, int গ্রুপ); এখানে আপনার বিভিন্ন নিদর্শন এবং ডেটটাইমফর্মেটর, ডাব্লু / এবং ডাব্লু / ও সময় নির্দিষ্ট করা আছে।
টুটোও

এটি কি স্থির ক্ষেত্র হতে পারে? জাভাডকে আমি খুঁজে পাইনি যে কোনও দৃষ্টান্তটি সেভাবে তৈরি করেছে থ্রেড-নিরাপদ
কামিল রোমান

parseDefaultingআপনি কল করেছেন তারপরে যোগ করতে ভুলবেন না appendPattern। নাহলে দিবে DateTimeParseException
উইটিয়ামেটা

31

এটি সত্যিই অস্পষ্ট এবং অসহায় ত্রুটির বার্তা। অনেক পরীক্ষা এবং ত্রুটির পরে আমি খুঁজে পেয়েছি যে LocalDateTimeআপনি যদি একটি সময়কে বিশ্লেষণের চেষ্টা না করেন তবে উপরের ত্রুটিটি দিবে। LocalDateপরিবর্তে ব্যবহার করে, এটি ত্রুটি ছাড়াই কাজ করে।

এটি খারাপভাবে নথিভুক্ত করা হয়েছে এবং সম্পর্কিত ব্যতিক্রমটি অত্যন্ত সহায়তামূলক।


25

রেটোগ্রাফির উত্তরে প্রসারিত করা ..: ব্যবহার করার সময় LocalDateএবং না করার পরেও আমার একই সমস্যা ছিল LocalDateTime। বিষয়টি ছিল যে আমি আমার তৈরি করেছে DateTimeFormatterব্যবহার .withResolverStyle(ResolverStyle.STRICT);, তাই আমি তারিখ প্যাটার্ন ব্যবহার ছিল uuuuMMddপরিবর্তে yyyyMMdd(পরিবর্তে "বছরের অফ যুগ" এর মানে ওই "বছর")!

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
  .parseStrict()
  .appendPattern("uuuuMMdd")
  .toFormatter()
  .withResolverStyle(ResolverStyle.STRICT);
LocalDate dt = LocalDate.parse("20140218", formatter);

(এই সমাধানটি মূলত রেটোগ্রাফির উত্তরের মন্তব্য ছিল, তবে আমি এটিকে এককভাবে উত্তর হিসাবে পোস্ট করতে উত্সাহিত হয়েছিল কারণ এটি অনেক লোকের পক্ষে দৃশ্যত সত্যই ভাল কাজ করে))


1
কেন 'ইউ' "Y" এর পরিবর্তে এই লিঙ্কে উত্তর দেওয়া হয়েছে উত্তর uuuu-বনাম-YYYY-ইন-datetimeformatter-বিন্যাস-প্যাটার্ন-কোডগুলি-ইন-জাভা @Peru
prashanth

23

যে কেউ এই ত্রুটি নিয়ে এখানে অবতরণ করেছে, যেমন আমি করেছি:

Unable to obtain LocalDateTime from TemporalAccessor: {HourOfAmPm=0, MinuteOfHour=0}

এটি নিম্নলিখিত লাইন থেকে এসেছে:

LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy h:mm"));

দেখা গেল যে আমি 24 ঘন্টা প্যাটার্নের পরিবর্তে 0 ঘন্টা 12 ঘন্টা আওয়ার প্যাটার্নটি ব্যবহার করছিলাম।

রাজধানী এইচ ব্যবহার করে ঘন্টাটি 24 ঘন্টা প্যাটার্নে পরিবর্তন করা এটি ঠিক করে:

LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy H:mm"));

12

যদি তারিখের স্ট্রিংটিতে ঘন্টা, মিনিট এবং ইত্যাদির জন্য কোনও মান অন্তর্ভুক্ত না করা হয় তবে আপনি সরাসরি এটিকে রূপান্তর করতে পারবেন না LocalDateTime। আপনি শুধুমাত্র একটি এটি রূপান্তর করতে পারেন LocalDate, কারণ স্ট্রিং শুধুমাত্র প্রতিনিধিত্ব বছর, মাস ও তারিখ উপাদান এটা করতে সঠিক জিনিস হবে।

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate ld = LocalDate.parse("20180306", dtf); // 2018-03-06

যাইহোক আপনি এ রূপান্তর করতে পারেন LocalDateTime

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate ld = LocalDate.parse("20180306", dtf);
LocalDateTime ldt = LocalDateTime.of(ld, LocalTime.of(0,0)); // 2018-03-06T00:00

ফর্ম্যাটটি সঠিক কিনা তাও নিশ্চিত করুন। এই ফিক্সটি আমার পক্ষে কার্যকর হয়নি কারণ আমি ফর্ম্যাটটি yyyy-mm-ddকখন তৈরি করা উচিত ছিল সেট করেছিলাম yyyy-MM-dd
প্যাটসুয়ার্ট

0

আর একবার চেষ্টা কর:

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("MM-dd-yyyy"); 
LocalDate fromLocalDate = LocalDate.parse(fromdstrong textate, dateTimeFormatter);

আপনি যে কোনও ফর্ম্যাট যুক্ত করতে পারেন। সেটা আমার জন্য কাজ করে!


0

এটি কাজ করে

public class DateDemo {
    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm");
        String date = "16-08-2018 12:10";
        LocalDate localDate = LocalDate.parse(date, formatter);
        System.out.println("VALUE="+localDate);

        DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm");
        LocalDateTime parse = LocalDateTime.parse(date, formatter1);
        System.out.println("VALUE1="+parse);
    }
}

আউটপুট:

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