লোকালডেটটাইমের সাথে কীভাবে পার্স / ফর্ম্যাটের তারিখগুলি করবেন? (জাভা 8)


341

জাভা 8 তারিখ এবং সময় ( জেএসআর 310 ) এর সাথে কাজ করার জন্য একটি নতুন জাভা.টাইম এপিআই যুক্ত করেছে ।

স্ট্রিং হিসাবে আমার তারিখ এবং সময় রয়েছে (যেমন "2014-04-08 12:30")। আমি কীভাবে LocalDateTimeপ্রদত্ত স্ট্রিং থেকে উদাহরণ পেতে পারি ?

আমি LocalDateTimeঅবজেক্টটির সাথে কাজ শেষ করার পরে: আমি কীভাবে LocalDateTimeউদাহরণস্বরূপ আবার উপরের মতো একই ফর্ম্যাট দিয়ে স্ট্রিংয়ে রূপান্তর করতে পারি ?


11
এফওয়াইআই, বেশিরভাগ মানুষ বেশিরভাগ সময় একটি ZonedDateTimeনা চেয়ে চাইবে LocalDateTime। নামটি পাল্টা স্বজ্ঞাত; Localমানে কোন একটি নির্দিষ্ট সময়ের অঞ্চল সাধারণভাবে এলাকার বদলে। যেমন, কোনও LocalDateTimeবস্তু সময় লাইনের সাথে আবদ্ধ হয় না। অর্থের অর্থ, সময়রেখায় একটি নির্দিষ্ট মুহুর্ত পেতে আপনাকে অবশ্যই একটি সময় অঞ্চল প্রয়োগ করতে হবে।
তুলিল বাউরক

LocalDateTimeবনাম ZonedDateTimeবনাম OffsetDateTimeবনাম Instantবনাম LocalDateবনামের ব্যাখ্যাটির জন্য আমার উত্তর দেখুন LocalTime, কেন এটি এত জটিল এবং কীভাবে এটি প্রথম শটে ঠিক কীভাবে করা যায় সে সম্পর্কে কীভাবে শান্ত থাকবেন।
ওন্দ্র Žižka

1
যদি এটি ব্যবহারিকভাবে দীর্ঘ না হয় LocalDateTimeতবে সম্ভবত নামকরণ করা হত ZonelessOffsetlessDateTime
ওন্দ্র Žižka

উত্তর:


534

তারিখ এবং সময় পার্সিং

LocalDateTimeস্ট্রিং থেকে কোনও অবজেক্ট তৈরি করতে আপনি স্ট্যাটিক LocalDateTime.parse()পদ্ধতিটি ব্যবহার করতে পারেন । এটি একটি স্ট্রিং এবং DateTimeFormatterপ্যারামিটার হিসাবে লাগে । DateTimeFormatterতারিখ / সময় প্যাটার্ন উল্লেখ করতে ব্যবহৃত হয়।

String str = "1986-04-08 12:30";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime dateTime = LocalDateTime.parse(str, formatter);

ফর্ম্যাট করার তারিখ এবং সময়

একটি LocalDateTimeঅবজেক্ট আউটআউট তৈরি করতে আপনি format()পদ্ধতিটি ব্যবহার করতে পারেন ।

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime dateTime = LocalDateTime.of(1986, Month.APRIL, 8, 12, 30);
String formattedDateTime = dateTime.format(formatter); // "1986-04-08 12:30"

মনে রাখবেন যে কিছু সাধারণ হিসাবে ব্যবহৃত তারিখ / সময় ফর্ম্যাটগুলি পূর্ববর্তী হিসাবে পূর্বনির্ধারিত হয় DateTimeFormatter। উদাহরণস্বরূপ: উপর থেকে উদাহরণটি DateTimeFormatter.ISO_DATE_TIMEফর্ম্যাট LocalDateTimeকরতে ব্যবহারের ফলে স্ট্রিং হয়ে যাবে "1986-04-08T12:30:00"

parse()এবং format()(যেমন পদ্ধতি সব তারিখ / সময় এর সাথে সম্পর্কিত অবজেক্টের জন্য পাওয়া যায় LocalDateবা ZonedDateTime)


77
কেবলমাত্র লক্ষ্য করুন যে ডেটটাইমফর্ম্যাটরটি অপরিবর্তনীয় এবং থ্রেড-নিরাপদ এবং এইভাবে প্রস্তাবিত পন্থা হ'ল এটি যেখানে সম্ভব সেখানে একটি স্থির ধ্রুব্যে সংরক্ষণ করা।
জোদাস্টেফেন

@ মিছা এই তারিখের ফরমেট আমার কাছে "2016-12-31T07: 59: 00.000Z" থাকলে কী হবে?
দাউদ আহমেদ

14
@ দাউদআববাসি চেষ্টা করুনDateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX")
রায় হুলহা

1
@ লেনিক্স সম্ভবত এটি কারণ আপনি format()উদাহরণের পরিবর্তে লোকালডেটটাইম ক্লাসে কল করার চেষ্টা করছেন ? অন্তত, যে আমি কি আমি বিভ্রান্ত DateTimeসঙ্গে dateTimeউপরোক্ত উদাহরণে।
glaed


159

এছাড়াও আপনি ব্যবহার করতে পারেন LocalDate.parse()বা LocalDateTime.parse()একটি উপর Stringএকটি প্যাটার্ন সঙ্গে এটি প্রদান না করেই, যদি Stringহয় আইএসও-8601 বিন্যাস

উদাহরণ স্বরূপ,

String strDate = "2015-08-04";
LocalDate aLD = LocalDate.parse(strDate);
System.out.println("Date: " + aLD);

String strDatewithTime = "2015-08-04T10:11:30";
LocalDateTime aLDT = LocalDateTime.parse(strDatewithTime);
System.out.println("Date with Time: " + aLDT);

আউটপুট ,

Date: 2015-08-04
Date with Time: 2015-08-04T10:11:30

এবং DateTimeFormatterযদি আপনাকে অন্যান্য তারিখের নিদর্শনগুলির সাথে ডিল করতে হয় তবেই ব্যবহার করুন ।

উদাহরণস্বরূপ, নিম্নলিখিত উদাহরণে, dd এমএমএম ইউউউ মাসের দিন (দুটি অঙ্ক), মাসের নামের তিনটি অক্ষর (জানুয়ারি, ফেব্রুয়ারি, মার্চ, ...) এবং একটি চার-অঙ্কের বছরের প্রতিনিধিত্ব করে:

DateTimeFormatter dTF = DateTimeFormatter.ofPattern("dd MMM uuuu");
String anotherDate = "04 Aug 2015";
LocalDate lds = LocalDate.parse(anotherDate, dTF);
System.out.println(anotherDate + " parses to " + lds);

আউটপুট

04 Aug 2015 parses to 2015-08-04

এছাড়াও মনে রাখবেন যে DateTimeFormatterবিষয়টি দ্বিদ্বিতীয়; এটি ইনপুট এবং ফর্ম্যাট আউটপুট উভয় পার্স করতে পারে।

String strDate = "2015-08-04";
LocalDate aLD = LocalDate.parse(strDate);
DateTimeFormatter dTF = DateTimeFormatter.ofPattern("dd MMM uuuu");
System.out.println(aLD + " formats as " + dTF.format(aLD));

আউটপুট

2015-08-04 formats as 04 Aug 2015

( ফরম্যাটিং এবং পার্সিং ডেটফর্ম্যাটরের জন্য প্যাটার্নগুলির সম্পূর্ণ তালিকা দেখুন )

  Symbol  Meaning                     Presentation      Examples
  ------  -------                     ------------      -------
   G       era                         text              AD; Anno Domini; A
   u       year                        year              2004; 04
   y       year-of-era                 year              2004; 04
   D       day-of-year                 number            189
   M/L     month-of-year               number/text       7; 07; Jul; July; J
   d       day-of-month                number            10

   Q/q     quarter-of-year             number/text       3; 03; Q3; 3rd quarter
   Y       week-based-year             year              1996; 96
   w       week-of-week-based-year     number            27
   W       week-of-month               number            4
   E       day-of-week                 text              Tue; Tuesday; T
   e/c     localized day-of-week       number/text       2; 02; Tue; Tuesday; T
   F       week-of-month               number            3

   a       am-pm-of-day                text              PM
   h       clock-hour-of-am-pm (1-12)  number            12
   K       hour-of-am-pm (0-11)        number            0
   k       clock-hour-of-am-pm (1-24)  number            0

   H       hour-of-day (0-23)          number            0
   m       minute-of-hour              number            30
   s       second-of-minute            number            55
   S       fraction-of-second          fraction          978
   A       milli-of-day                number            1234
   n       nano-of-second              number            987654321
   N       nano-of-day                 number            1234000000

   V       time-zone ID                zone-id           America/Los_Angeles; Z; -08:30
   z       time-zone name              zone-name         Pacific Standard Time; PST
   O       localized zone-offset       offset-O          GMT+8; GMT+08:00; UTC-08:00;
   X       zone-offset 'Z' for zero    offset-X          Z; -08; -0830; -08:30; -083015; -08:30:15;
   x       zone-offset                 offset-x          +0000; -08; -0830; -08:30; -083015; -08:30:15;
   Z       zone-offset                 offset-Z          +0000; -0800; -08:00;

   p       pad next                    pad modifier      1

   '       escape for text             delimiter
   ''      single quote                literal           '
   [       optional section start
   ]       optional section end
   #       reserved for future use
   {       reserved for future use
   }       reserved for future use

11
এই জবাবটি একটি গুরুত্বপূর্ণ বিষয়ে স্পর্শ করেছে: যেখানেই সম্ভব পূর্বনির্ধারিত ফর্ম্যাটর ব্যবহার করুন উদাহরণস্বরূপ "yyyy-MM-dd" এ একটি ফর্ম্যাটর বেস তৈরি করবেন না, পরিবর্তে ডেটটাইম ফর্ম্যাটর ব্যবহার করুন। আইসো_সোক্ল__আর এটি আপনার কোডটিকে পুরো লট ক্লিনার দেখায়। তদ্ব্যতীত, ISO8061 ফর্ম্যাটটির ব্যবহার সর্বাধিক করার চেষ্টা করুন, এটি দীর্ঘমেয়াদে লভ্যাংশ প্রদান করবে।
ক্রিস্টোফার ইয়াং

আমি বৈধতার জন্য একটি তারিখের মত পার্স করতে চাই 2018-08-09 12:00:08তবে আমি যখন বিশ্লেষণ করি তখন দেখি এমন একটি Tযুক্ত হয়েছে যা আমার দরকার নেই। এটি করার কোন উপায় আছে?
রঘুবীর

@ রঘুवीर টি টি কেবলমাত্র ISO-8061 তারিখ এবং সময়ের মধ্যে ডিলিমিটার। পরিবর্তে আপনার যদি আপনার ফর্ম্যাটে একটি স্থান থাকে তবে আপনি yyyy-MM-dd hh:mm:ssপার্সিং এবং ফর্ম্যাটিংয়ের জন্য কেবল প্যাটার্নটি ব্যবহার করতে পারেন । টি সর্বদা ডিফল্ট (ISO-8061) ফর্ম্যাটে প্রদর্শিত হবে তবে আপনি নিজের প্যাটার্ন ব্যবহার করতে পারেন।
ডিম হ্যান্স

39

উপরের দুটি উত্তরই স্ট্রিং প্যাটার্ন সম্পর্কিত প্রশ্নটি খুব ভালভাবে ব্যাখ্যা করে। তবে, আপনি যদি আইএসও 8601 এর সাথে কাজ করছেন তবে আবেদন করার দরকার নেই DateTimeFormatterযেহেতু লোকালডেটটাইম এর জন্য ইতিমধ্যে প্রস্তুত রয়েছে:

লোকালডেটটাইমকে টাইম জোনের ISO8601 স্ট্রিংয়ে রূপান্তর করুন

LocalDateTime ldt = LocalDateTime.now(); 
ZonedDateTime zdt = ldt.atZone(ZoneOffset.UTC); //you might use a different zone
String iso8601 = zdt.toString();

ISO8601 স্ট্রিং থেকে লোকালডেটটাইমে ফিরে যান

String iso8601 = "2016-02-14T18:32:04.150Z";
ZonedDateTime zdt = ZonedDateTime.parse(iso8601);
LocalDateTime ldt = zdt.toLocalDateTime();

20

একটি নির্দিষ্ট পয়েন্টে সময় এবং তারিখের সাথে স্ট্রিংকে পার্স করা (জাভা এটিকে " Instant" বলে ডাকে ) যথেষ্ট জটিল is জাভা বেশ কয়েকটি পুনরাবৃত্তিতে এটি মোকাবেলা করছে। সর্বশেষতম java.timeএবং এবং java.time.chrono, প্রায় সমস্ত প্রয়োজনীয়তা ( টাইম ডাইলেশন :) বাদে ) covers

তবে সেই জটিলতা অনেকটা বিভ্রান্তি এনে দেয়।

তারিখ পার্সিং বোঝার মূল চাবিকাঠিটি হ'ল:

জাভা কেন একটি তারিখ বিশ্লেষণ করার অনেক উপায় আছে

  1. একটি সময় পরিমাপ করার জন্য বেশ কয়েকটি সিস্টেম রয়েছে। উদাহরণস্বরূপ, Japaneseতিহাসিক জাপানি ক্যালেন্ডারগুলি সংশ্লিষ্ট সম্রাট বা রাজবংশের সময়কাল থেকে উদ্ভূত হয়েছিল। তারপরে যেমন ইউনিক্স টাইমস্ট্যাম্প। ভাগ্যক্রমে, পুরো (ব্যবসায়) বিশ্ব একই ব্যবহার করতে সক্ষম হয়েছিল।
  2. Icallyতিহাসিকভাবে, বিভিন্ন কারণে সিস্টেমগুলি / থেকে স্যুইচ করা হচ্ছিল । যেমন জুলিয়ান ক্যালেন্ডার থেকে গ্রেগরিয়ান ক্যালেন্ডারে 1582 সালে So তাই 'পশ্চিমা' তারিখগুলির আগে আলাদা আচরণ করা দরকার।
  3. এবং অবশ্যই পরিবর্তনটি একবারে ঘটেনি। কারণ ক্যালেন্ডারটি কিছু ধর্মের সদর দফতর থেকে এসেছিল এবং ইউরোপের অন্যান্য অংশগুলি অন্যান্য ডায়েটে বিশ্বাস করে, উদাহরণস্বরূপ জার্মানি 1700 সাল পর্যন্ত পরিবর্তন করে নি।

... এবং কেন LocalDateTime, ZonedDateTimeইত্যাদি। তাই জটিল

  1. আছে সময় অঞ্চল । একটি সময় অঞ্চল হ'ল মূলত পৃথিবীর পৃষ্ঠের একটি "স্ট্রিপ" * [[1] যার কর্তৃপক্ষগুলি কখন কখন অফসেট থাকে তার একই নিয়ম অনুসরণ করে। এর মধ্যে গ্রীষ্মের সময় নিয়ম অন্তর্ভুক্ত।
    সময় অঞ্চল বিভিন্ন অঞ্চলগুলির জন্য সময়ের সাথে সাথে পরিবর্তিত হয়, বেশিরভাগের উপর নির্ভর করে কে কাকে বিজয়ী করে। এবং সময়ের সাথে সাথে এক সময় অঞ্চলের নিয়মগুলিও পরিবর্তিত হয়

  2. সময় অফসেট আছে। এটি সময় অঞ্চলগুলির মতো নয়, কারণ একটি সময় অঞ্চল যেমন "প্রাগ" হতে পারে তবে গ্রীষ্মের সময় অফসেট এবং শীতের সময় অফসেট থাকে।
    আপনি যদি কোনও সময় অঞ্চলটির সাথে টাইমস্ট্যাম্প পান তবে অফসেটটি পরিবর্তিত হতে পারে, এটি বছরের কোন অংশে থাকে তার উপর নির্ভর করে le রূপান্তরিত।
    দ্রষ্টব্য: টাইমস্ট্যাম্পের দ্বারা আমার অর্থ "একটি স্ট্রিং যা একটি তারিখ এবং / অথবা সময় ধারণ করে, বিকল্পভাবে সময় অঞ্চল এবং / অথবা সময় অফসেট সহ" "

  3. বেশ কয়েকটি সময় অঞ্চল নির্দিষ্ট সময়ের জন্য একই সময়ে অফসেট ভাগ করতে পারে। উদাহরণস্বরূপ, গ্রীষ্মের সময় অফসেট কার্যকর না হলে GMT / UTC সময় অঞ্চলটি "লন্ডন" টাইম জোনের সমান।

এটিকে কিছুটা জটিল করার জন্য (তবে এটি আপনার ব্যবহারের ক্ষেত্রে খুব বেশি গুরুত্বপূর্ণ নয়):

  1. বিজ্ঞানীরা পৃথিবীর গতিশীল পর্যবেক্ষণ করেন, যা সময়ের সাথে সাথে পরিবর্তিত হয়; তার উপর ভিত্তি করে, তারা পৃথক বছর শেষে কয়েক সেকেন্ড যুক্ত করে। (সুতরাং 2040-12-31 24:00:00একটি বৈধ তারিখ-সময় হতে পারে)) এটির জন্য মেটাডেটার নিয়মিত আপডেটগুলি দরকার যা সিস্টেমগুলি তারিখ রূপান্তরগুলি সঠিক করতে ব্যবহার করে। যেমন লিনাক্সে, আপনি জাভা প্যাকেজগুলিতে এই নতুন ডেটা সহ নিয়মিত আপডেট পান।
  2. আপডেটগুলি সর্বদা historicalতিহাসিক এবং ভবিষ্যতের উভয় টাইমস্ট্যাম্পের জন্য পূর্বের আচরণকে রাখে না। সুতরাং এটি ঘটতে পারে যে দুটি টাইমস্ট্যাম্পগুলির তুলনা করে কিছু সময় অঞ্চলের পরিবর্তনের সাথে তাদের তুলনা করা সফ্টওয়্যারটির বিভিন্ন সংস্করণে চলার সময় বিভিন্ন ফলাফল দিতে পারে । এটি প্রভাবিত সময় অঞ্চল এবং অন্যান্য সময় অঞ্চলের মধ্যে তুলনার ক্ষেত্রেও প্রযোজ্য।

    এটির কারণে আপনার সফ্টওয়্যারটিতে কোনও ত্রুটি দেখা দিতে পারে, এমন কিছু টাইমস্ট্যাম্প ব্যবহার করা বিবেচনা করুন যা ইউনিক্স টাইমস্ট্যাম্পের মতো জটিল নিয়ম না করে ।

  3. 7 এর কারণে, ভবিষ্যতের তারিখগুলির জন্য, আমরা তারিখগুলি নির্ভুলতার সাথে রূপান্তর করতে পারি না। সুতরাং, উদাহরণস্বরূপ, বর্তমানের পার্সিং 8524-02-17 12:00:00ভবিষ্যতের বিশ্লেষণ থেকে কয়েক সেকেন্ড বন্ধ হতে পারে।

এর জন্য জেডিকের এপিআইগুলি সমসাময়িক প্রয়োজনের সাথে বিকশিত হয়েছিল

  • প্রারম্ভিক জাভা রিলিজগুলির java.util.Dateকিছুটা নিখরচায় দৃষ্টিভঙ্গি ছিল যা ধরে নিয়েছিল যে বছর, মাস, দিন এবং সময় আছে। এটি দ্রুত যথেষ্ট ছিল না।
  • এছাড়াও, ডাটাবেসের প্রয়োজনীয়তা আলাদা ছিল, তাই খুব তাড়াতাড়ি, java.sql.Dateএর নিজস্ব সীমাবদ্ধতা প্রবর্তিত হয়েছিল।
  • যেহেতু উভয়ই বিভিন্ন ক্যালেন্ডার এবং সময় অঞ্চলগুলি ভালভাবে কভার করেনি, Calendarএপিআই চালু হয়েছিল।
  • এটি এখনও সময় অঞ্চলগুলির জটিলতা coverাকেনি। এবং তবুও, উপরের এপিআইগুলির মিশ্রণটি কাজ করার জন্য সত্যই একটি ব্যথা ছিল। সুতরাং জাভা বিকাশকারীরা বিশ্ব ওয়েব অ্যাপ্লিকেশনগুলিতে কাজ শুরু করার সাথে সাথে জোডাটাইমের মতো বেশিরভাগ ব্যবহারের ক্ষেত্রে লক্ষ্যযুক্ত লাইব্রেরিগুলি দ্রুত জনপ্রিয় হয়ে উঠল। জোডাটাইম প্রায় এক দশক ধরে ডি-ফ্যাক্টো স্ট্যান্ডার্ড ছিল।
  • তবে জেডিকে জোদাটাইমের সাথে সংহত হয়নি, তাই এর সাথে কাজ করা কিছুটা জটিল ছিল। সুতরাং, কিভাবে ব্যাপার কাছে উপর একটি খুব দীর্ঘ আলোচনার পর, JSR-310 তৈরি করা হয়েছে প্রধানত JodaTime উপর ভিত্তি করে

জাভা এর সাথে এটি কীভাবে মোকাবেলা করবেন java.time

কোন টাইমস্ট্যাম্পকে পার্স করতে হবে তা নির্ধারণ করুন

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

এতে কি তারিখ এবং সময় রয়েছে?

  1. এটি একটি সময় অফসেট আছে?
    একটি সময় অফসেট +hh:mmঅংশ হয়। কখনও কখনও, 'জুলু সময়', ইউনিভার্সাল সময় সমন্বিত, বা গ্রিনিচ গড় সময় হিসাবে +00:00পরিবর্তিত হতে পারে । এগুলি সময় অঞ্চল নির্ধারণ করে। এই টাইমস্ট্যাম্পগুলির জন্য, আপনি ব্যবহার করুন ।ZUTCGMT
    OffsetDateTime

  2. এটির কি টাইম জোন আছে?
    এই টাইমস্ট্যাম্পগুলির জন্য, আপনি ব্যবহার করুন ZonedDateTime
    অঞ্চল দ্বারা হয় নির্দিষ্ট করা হয়

    সময় অঞ্চলগুলির তালিকা আইসিএএএন সমর্থিত একটি "টিজেড ডাটাবেস" দ্বারা সংকলিত হয়েছে ।

    ZoneIdএর জাভাদোকের মতে , জোন আইডির কোনওরকমভাবে সেট Zও অফসেটও নির্দিষ্ট করা যেতে পারে । আমি নিশ্চিত না কীভাবে এই অঞ্চলগুলি বাস্তব অঞ্চলে যাবে। টাইমস্ট্যাম্প, যা কেবলমাত্র একটি টিজেড রয়েছে, অফসেট পরিবর্তনের এক লিপ ঘন্টার মধ্যে পড়ে যদি তা যায় তবে তা অস্পষ্ট, এবং ব্যাখ্যাটির বিষয় ResolverStyle, নীচে দেখুন।

  3. যদি এটি না থাকে তবে অনুপস্থিত প্রসঙ্গটি ধরে নেওয়া বা অবহেলা করা হবে। এবং ভোক্তা সিদ্ধান্ত নিতে হবে। সুতরাং এটি অনুপস্থিত তথ্য যুক্ত করে পার্স LocalDateTimeএবং রূপান্তর করা দরকার OffsetDateTime:

    • আপনি ধরে নিতে পারেন যে এটি একটি ইউটিসি সময়। ইউটিসি 0 ঘন্টা অফসেট যোগ করুন।
    • আপনি ধরে নিতে পারেন যে এটি সেই স্থানের সময় যেখানে স্থানান্তর ঘটছে। সিস্টেমের সময় অঞ্চল যুক্ত করে এটিকে রূপান্তর করুন।
    • আপনি অবহেলা করতে পারেন এবং ঠিক যেমন এটি ব্যবহার করতে পারেন। এটি দরকারী যেমন উদাহরণস্বরূপ বা দুটি বার বিয়োগ (দেখুন Duration), বা যখন আপনি জানেন না এবং এটি সত্যিই কিছু যায় না (যেমন স্থানীয় বাসের সময়সূচী)।

আংশিক সময়ের তথ্য

  • কি টাইমস্ট্যাম্প রয়েছে উপর ভিত্তি করে, আপনি গ্রহণ করতে পারেন LocalDate, LocalTime, OffsetTime, MonthDay, Year, অথবা YearMonthএটা শেষ হয়ে এসেছে।

আপনার কাছে সম্পূর্ণ তথ্য থাকলে আপনি একটি পেতে পারেন java.time.Instant। এটি অভ্যন্তরীণভাবে OffsetDateTimeএবং এর মধ্যে রূপান্তর করতে ব্যবহৃত হয় ZonedDateTime

কীভাবে এটি পার্স করবেন তা চিত্রিত করুন

একটি বিস্তৃত ডকুমেন্টেশন রয়েছে DateTimeFormatterযার উপর উভয়ই টাইমস্ট্যাম্প স্ট্রিং এবং স্ট্রিংয়ে ফর্ম্যাটকে পার্স করতে পারে।

প্রাক নির্মিত DateTimeFormatterগুলি moreless সব মান টাইমস্ট্যাম্প ফরম্যাটের ঢেকে রাখুক। উদাহরণস্বরূপ, ISO_INSTANTপার্স করতে পারেন 2011-12-03T10:15:30.123457Z

আপনার যদি কিছু বিশেষ ফর্ম্যাট থাকে তবে আপনি নিজের ডেটটাইম ফর্ম্যাটর তৈরি করতে পারেন (যা পার্সারও রয়েছে)।

private static final DateTimeFormatter TIMESTAMP_PARSER = new DateTimeFormatterBuilder()
   .parseCaseInsensitive()
   .append(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SX"))
   .toFormatter();

আমি এর উত্স কোডটি দেখার DateTimeFormatterএবং কীভাবে এটি ব্যবহার করে একটি তৈরি করতে হবে সে সম্পর্কে অনুপ্রাণিত হওয়ার পরামর্শ দিয়েছি DateTimeFormatterBuilder। আপনি সেখানে ResolverStyleথাকাকালীন, ফর্ম্যাটগুলি এবং অস্পষ্ট তথ্যের জন্য পার্সার লেন্সিয়েন্ট, স্মার্ট বা স্ট্রাইক কিনা তা নিয়ন্ত্রণ করে।

TemporalAccessor

এখন, ঘন ঘন ভুলটি জটিলতায় intoোকে TemporalAccessor। এটি কীভাবে বিকাশকারীদের সাথে কাজ করতে ব্যবহৃত হয়েছিল তা থেকে আসে SimpleDateFormatter.parse(String)। ঠিক আছে, DateTimeFormatter.parse("...")আপনাকে দেয় TemporalAccessor

// No need for this!
TemporalAccessor ta = TIMESTAMP_PARSER.parse("2011-... etc");

তবে, পূর্ববর্তী বিভাগের জ্ঞান দিয়ে সজ্জিত, আপনি সহজেই আপনার প্রয়োজনীয় ধরণের পার্স করতে পারেন:

OffsetDateTime myTimestamp = OffsetDateTime.parse("2011-12-03T10:15:30.123457Z", TIMESTAMP_PARSER);

আপনার আসলে কোনওটির দরকার নেই DateTimeFormatter। আপনি যে ধরণের পার্স করতে চান সেগুলির parse(String)পদ্ধতি রয়েছে।

OffsetDateTime myTimestamp = OffsetDateTime.parse("2011-12-03T10:15:30.123457Z");

সম্পর্কিত TemporalAccessor, আপনি স্ট্রিংয়ে কী তথ্য আছে সে সম্পর্কে অস্পষ্ট ধারণা থাকলে এবং রানটাইমে সিদ্ধান্ত নিতে চাইলে আপনি এটি ব্যবহার করতে পারেন।

আমি আশা করি আমি আপনার আত্মার উপর কিছুটা বোঝার আলো ফেলেছি :)

দ্রষ্টব্য: java.timeজাভা 6 এবং 7: থ্রিটেন-ব্যাকপোর্টের ব্যাকপোর্ট রয়েছে । অ্যান্ড্রয়েডের জন্য এটিতে থ্রিটেনএবিপি রয়েছে

[1] কেবল এগুলি নয় যে তারা স্ট্রিপস নয়, তবে কিছু অদ্ভুত মাত্রাও রয়েছে। উদাহরণস্বরূপ, কিছু প্রতিবেশী প্রশান্ত মহাসাগরীয় দ্বীপগুলিতে +14: 00 এবং -11: 00 সময় অঞ্চল রয়েছে। এর অর্থ হ'ল, এক দ্বীপে থাকাকালীন 1 মে 3 অপরাহ্ন, অন্য দ্বীপে এখনও অবধি নেই, এখনও 30 এপ্রিল 12 পিএম (যদি আমি সঠিকভাবে গণনা করি :))


3

প্রয়োজনীয় ফরমেটে বর্তমান ইউটিসি সময় পাবেন T

// Current UTC time
        OffsetDateTime utc = OffsetDateTime.now(ZoneOffset.UTC);

        // GET LocalDateTime 
        LocalDateTime localDateTime = utc.toLocalDateTime();
        System.out.println("*************" + localDateTime);

        // formated UTC time
        DateTimeFormatter dTF = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
        System.out.println(" formats as " + dTF.format(localDateTime));

        //GET UTC time for current date
        Date now= new Date();
        LocalDateTime utcDateTimeForCurrentDateTime = Instant.ofEpochMilli(now.getTime()).atZone(ZoneId.of("UTC")).toLocalDateTime();
        DateTimeFormatter dTF2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
        System.out.println(" formats as " + dTF2.format(utcDateTimeForCurrentDateTime));

0

আমি তারিখের সময়ের বিন্যাসের একাধিক রূপগুলি এর মতো করে আচ্ছন্ন করে দেখতে পেলাম:

final DateTimeFormatterBuilder dtfb = new DateTimeFormatterBuilder();
dtfb.appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSSSS"))
.appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSSS"))
.appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSS"))
.appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS"))
.appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSS"))
.appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSS"))
    .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))
    .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS"))
    .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S"))
    .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
    .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
    .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0);

1
`` `সর্বজনীন চূড়ান্ত স্থির তারিখটাইম ফর্ম্যাটার TIMESTAMP_XX = নতুন তারিখটাইম ফর্ম্যাটর বিল্ডার ()। পার্সড্যাফল্টিং (ক্রোনোফিল্ড। ইয়ার, ২০২০) । `` `
অ্যালান স্টুয়ার্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.