নতুন তারিখের সময় API ব্যবহার করে একটি তারিখ ফর্ম্যাট করুন


118

আমি নতুন তারিখের সময় এপিআই নিয়ে খেলছিলাম তবে এটি চালানোর সময়:

public class Test {         
    public static void main(String[] args){
        String dateFormatted = LocalDate.now()
                                        .format(DateTimeFormatter
                                              .ofPattern("yyyy-MM-dd HH:mm:ss"));
        System.out.println(dateFormatted);
    }
}

এটি ছুড়ে:

Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: HourOfDay
    at java.time.LocalDate.get0(LocalDate.java:680)
    at java.time.LocalDate.getLong(LocalDate.java:659)
    at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)
    at java.time.format.DateTimeFormatterBuilder$NumberPrinterParser.format(DateTimeFormatterBuilder.java:2543)
    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.LocalDate.format(LocalDate.java:1685)
    at Test.main(Test.java:23)

স্থানীয় তারিখ শ্রেণীর উত্স কোডটি দেখার সময় আমি দেখতে পাই:

  private int get0(TemporalField field) {
        switch ((ChronoField) field) {
            case DAY_OF_WEEK: return getDayOfWeek().getValue();
            case ALIGNED_DAY_OF_WEEK_IN_MONTH: return ((day - 1) % 7) + 1;
            case ALIGNED_DAY_OF_WEEK_IN_YEAR: return ((getDayOfYear() - 1) % 7) + 1;
            case DAY_OF_MONTH: return day;
            case DAY_OF_YEAR: return getDayOfYear();
            case EPOCH_DAY: throw new UnsupportedTemporalTypeException("Invalid field 'EpochDay' for get() method, use getLong() instead");
            case ALIGNED_WEEK_OF_MONTH: return ((day - 1) / 7) + 1;
            case ALIGNED_WEEK_OF_YEAR: return ((getDayOfYear() - 1) / 7) + 1;
            case MONTH_OF_YEAR: return month;
            case PROLEPTIC_MONTH: throw new UnsupportedTemporalTypeException("Invalid field 'ProlepticMonth' for get() method, use getLong() instead");
            case YEAR_OF_ERA: return (year >= 1 ? year : 1 - year);
            case YEAR: return year;
            case ERA: return (year >= 1 ? 1 : 0);
        }
        throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

এটি ডকটিতে বর্ণিত হিসাবে:

এই পদ্ধতিটি ক্লাস ডকুমেন্টেশনে বর্ণিত বর্ণ এবং চিহ্নগুলির সাধারণ প্যাটার্নের ভিত্তিতে একটি ফর্ম্যাটর তৈরি করবে।

এবং এই সমস্ত অক্ষর সংজ্ঞায়িত করা হয়

তাহলে DateTimeFormatter.ofPatternআমাদের কিছু প্যাটার্ন লেটার ব্যবহার করার অনুমতি দেয় না কেন ?

উত্তর:


218

LocalDateডেটটাইম নয়, কেবল একটি তারিখ উপস্থাপন করে। সুতরাং "এইচএইচ: মিমি: এসএস" এ ফর্ম্যাট করার সময় কোনও অর্থ নেই LocalDateLocalDateTimeপরিবর্তে একটি ব্যবহার করুন, ধরে নিলেন যে আপনি একটি তারিখ এবং সময় উভয়ই উপস্থাপন করতে চান।


3
আমি কীভাবে এই উত্তরটিকে উঁচু করে তুলতে পারি এবং লোকালডেট এবং লোকালডেটটাইম অবজেক্ট উভয়ই থাকতে পারি ...
Xial

আমি কেবল লোকালটাইম নিয়ে কাজ করতে চাই, আপনি কীভাবে এই ব্যতিক্রম না চালিয়ে বিন্যাস সম্পাদন করবেনjava.time.temporal.UnsupportedTemporalTypeException: Unsupported field: DayOfWeek
সামুয়েল ওওনো

কিছু মনে করবেন না: এই কাজ করেDateTimeFormatter.ofPattern("HH:mm:ss")
11-22-2

36

আমি @ জেমস_ডির সঠিক উত্তরে নিম্নলিখিত বিবরণগুলি যুক্ত করতে চাই:

পটভূমি: সর্বাধিক তারিখ-এবং-সময়-লাইব্রেরি ( java.util.Calendarজাভা, দেখুন নেট-তারিখসময় বা Dateজাভাস্ক্রিপ্ট অথবা DateTimeকাব্যিক অভিব্যক্তি নেই পার্ল) একটি সার্বজনীন সমস্ত উদ্দেশ্য অনন্য সময়গত প্রকার (জার্মান ভাষায় ধারণার উপর ভিত্তি করে " eierlegnde Wollmilchsau ")। এই নকশায় কোনও অসমর্থিত ক্ষেত্র থাকতে পারে না। তবে দাম বেশি: অনেক সময় সমস্যাগুলি এমন একটি নমনীয় পদ্ধতির সাথে পর্যাপ্ত পরিমাণে পরিচালনা করা যায় না কারণ সমস্ত ধরণের টেম্পোরাল অবজেক্টের জন্য একটি সাধারণ ডিনামিনেটর খুঁজে পাওয়া কঠিন impossible

জেএসআর -310 অন্য উপায় বেছে নিয়েছে , অর্থাত্ বিভিন্ন টেম্পোরাল প্রকারগুলিকে অনুমতি দেওয়ার জন্য যা সমর্থিত অন্তর্নির্মিত ক্ষেত্রগুলির টাইপ-নির্দিষ্ট সেট সমন্বিত থাকে। প্রাকৃতিক পরিণতি হ'ল প্রতিটি সম্ভাব্য ক্ষেত্রটি প্রতিটি ধরণের দ্বারা সমর্থিত হয় না (এবং ব্যবহারকারীরা এমনকি তাদের নিজস্ব বিশেষ ক্ষেত্রগুলি সংজ্ঞায়িত করতে পারেন)। এটির সমর্থিত ক্ষেত্রগুলির নির্দিষ্ট সেটটির জন্য প্রকারের প্রতিটি অবজেক্টকে প্রোগ্রামগতভাবে জিজ্ঞাসা করাও সম্ভব TemporalAccessor। জন্য LocalDateআমরা খুঁজে পেয়েছেন:

DAY_OF_WEEK 
ALIGNED_DAY_OF_WEEK_IN_MONTH 
ALIGNED_DAY_OF_WEEK_IN_YEAR 
DAY_OF_MONTH 
DAY_OF_YEAR 
EPOCH_DAY 
ALIGNED_WEEK_OF_MONTH 
ALIGNED_WEEK_OF_YEAR 
MONTH_OF_YEAR 
PROLEPTIC_MONTH 
YEAR_OF_ERA 
YEAR 
ERA 

HOUR_OF_DAY- ক্ষেত্র নেই যা এর সমস্যার ব্যাখ্যা দেয় UnsupportedTemporalTypeException। এবং যদি আমরা জেএসআর -310- ক্ষেত্রগুলিতে প্যাটার্ন প্রতীকগুলির ম্যাপিংয়ের দিকে লক্ষ্য করি তবে আমরা দেখতে পাচ্ছি যে এইচ প্রতীকটি অসমর্থিত HOUR_OF_DAY এ ম্যাপ করা আছে:

/** Map of letters to fields. */  
private static final Map<Character, TemporalField> FIELD_MAP = new HashMap<>();
static {
  FIELD_MAP.put('G', ChronoField.ERA);
  FIELD_MAP.put('y', ChronoField.YEAR_OF_ERA);
  FIELD_MAP.put('u', ChronoField.YEAR);
  FIELD_MAP.put('Q', IsoFields.QUARTER_OF_YEAR);
  FIELD_MAP.put('q', IsoFields.QUARTER_OF_YEAR);
  FIELD_MAP.put('M', ChronoField.MONTH_OF_YEAR);
  FIELD_MAP.put('L', ChronoField.MONTH_OF_YEAR);
  FIELD_MAP.put('D', ChronoField.DAY_OF_YEAR);
  FIELD_MAP.put('d', ChronoField.DAY_OF_MONTH);
  FIELD_MAP.put('F', ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH);
  FIELD_MAP.put('E', ChronoField.DAY_OF_WEEK);
  FIELD_MAP.put('c', ChronoField.DAY_OF_WEEK);
  FIELD_MAP.put('e', ChronoField.DAY_OF_WEEK);
  FIELD_MAP.put('a', ChronoField.AMPM_OF_DAY);
  FIELD_MAP.put('H', ChronoField.HOUR_OF_DAY);
  FIELD_MAP.put('k', ChronoField.CLOCK_HOUR_OF_DAY);
  FIELD_MAP.put('K', ChronoField.HOUR_OF_AMPM);
  FIELD_MAP.put('h', ChronoField.CLOCK_HOUR_OF_AMPM);
  FIELD_MAP.put('m', ChronoField.MINUTE_OF_HOUR);
  FIELD_MAP.put('s', ChronoField.SECOND_OF_MINUTE);
  FIELD_MAP.put('S', ChronoField.NANO_OF_SECOND);
  FIELD_MAP.put('A', ChronoField.MILLI_OF_DAY);
  FIELD_MAP.put('n', ChronoField.NANO_OF_SECOND);
  FIELD_MAP.put('N', ChronoField.NANO_OF_DAY);    
}

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


4
en.wiktionary.org/wiki/eierlegnde_Wolmilchsau (আক্ষরিক অর্থে "ডিম দেওয়া দুধের বোন" বেশ কয়েকটি বিশেষায়িত সরঞ্জামের কাজ করুন। :-)
ট্রেভর রবিনসন

6

আমার জন্য সঠিক বর্গটি ছিল ZonedDateTimeসময় এবং সময় অঞ্চল উভয়ই অন্তর্ভুক্ত।

LocalDateসময় তথ্য নেই যাতে আপনি একটি পান UnsupportedTemporalTypeException: Unsupported field: HourOfDay

আপনি ব্যবহার করতে পারেন LocalDateTimeতবে আপনার কাছে টাইম জোন সম্পর্কিত তথ্য নেই তাই যদি আপনি এটি অ্যাক্সেস করার চেষ্টা করেন (এমনকি পূর্বনির্ধারিত বিন্যাসগুলির মধ্যে একটি ব্যবহার করে) আপনি একটি পাবেন UnsupportedTemporalTypeException: Unsupported field: OffsetSeconds

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