ইনস্ট্যান্ট টু স্ট্রিংয়ে ফর্ম্যাট করুন


226

আমি নতুন জাভা 8 টাইম-এপি এবং একটি প্যাটার্ন ব্যবহার করে একটি স্ট্রিংয়ের সাথে ইনস্ট্যান্ট ফর্ম্যাট করার চেষ্টা করছি:

Instant instant = ...;
String out = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(instant);

উপরের কোডটি ব্যবহার করে আমি একটি ব্যতিক্রম পাই যা একটি অসমর্থিত ক্ষেত্রের অভিযোগ করে:

java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra
    at java.time.Instant.getLong(Instant.java:608)
    at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)
    ...

উত্তর:


309

সময় অঞ্চল

Instantএকটি সময়-অঞ্চল ফর্ম্যাট করতে প্রয়োজন। সময়-অঞ্চল ব্যতীত ফর্ম্যাটরটি কীভাবে তাত্ক্ষণিকভাবে মানব তারিখের সময় ক্ষেত্রগুলিতে রূপান্তর করতে পারে তা জানে না এবং তাই একটি ব্যতিক্রম ছোঁড়ে।

সময় অঞ্চলটি ব্যবহার করে সরাসরি ফর্ম্যাটারে যুক্ত করা যায় withZone()

DateTimeFormatter formatter =
    DateTimeFormatter.ofLocalizedDateTime( FormatStyle.SHORT )
                     .withLocale( Locale.UK )
                     .withZone( ZoneId.systemDefault() );

উত্পাদন স্ট্রিং

আপনার তাত্ক্ষণিকের স্ট্রিং উপস্থাপনা তৈরি করতে এখন সেই বিন্যাসটি ব্যবহার করুন।

Instant instant = Instant.now();
String output = formatter.format( instant );

কনসোল করতে ডাম্প।

System.out.println("formatter: " + formatter + " with zone: " + formatter.getZone() + " and Locale: " + formatter.getLocale() );
System.out.println("instant: " + instant );
System.out.println("output: " + output );

যখন রান।

formatter: Localized(SHORT,SHORT) with zone: US/Pacific and Locale: en_GB
instant: 2015-06-02T21:34:33.616Z
output: 02/06/15 14:34

50
ধন্যবাদ!! বিটিডাব্লু ব্যতিক্রম "অসমর্থিত ক্ষেত্র" উদাহরণস্বরূপ, বছর, দর্শনীয়ভাবে অবসন্ন হয়। হতে পারে এই পরিস্থিতিটি সনাক্ত করা উচিত এবং তাত্ক্ষণিক্রে সরাসরি অনুপস্থিত জোনের আইডিতে একটি ব্যতিক্রম চিহ্নিত করা উচিত!
ডেভিডবাক

1
আরও উদ্ভটভাবে, যদি আপনি .WithZone (উদাহরণস্বরূপ, উইথজোন (জোনআইড.ফ ("জেড"))) অন্তর্ভুক্ত করেন এবং একটি লোকালডেটটাইম ফর্ম্যাট করেন তবে অঞ্চলটি আইজিএনরেড! সুতরাং যতক্ষণ না .WithZone () অন্তর্ভুক্ত থাকে ততক্ষণ একই ফর্ম্যাটরটি তাত্ক্ষণিকভাবে এবং লোকালডেটটাইম উভয়ের জন্য ব্যবহার করা যেতে পারে, পরবর্তীগুলির জন্য প্রদর্শিত সময়কে প্রভাবিত না করেই।
গ্লেন

1
তাত্ক্ষণিকের একটি টাইমজোন যা জিএমটি, তা গ্রহণ করা কেন এতটা কঠিন?
Koray Tugay

1
@ কোরেতুগায় কারণ প্যাডেন্টিক "তাত্ক্ষণিকভাবে ইতিমধ্যে GMT" মন্তব্যগুলি সত্য হতে পারে, তবে সময় ব্যয় না করে ইনস্ট্যান্টের বিন্যাসকরণ কাজ করে না বলে একটি ব্যতিক্রম ট্রেস নিক্ষেপের মুখোমুখি হয়ে গেলে তারা সহায়ক । GMT এর কাছে ফর্ম্যাটরটি ডিফল্ট থাকলে ভাল হত oh
তি স্টারগা

এখন এটি আপনাকে yyyy-MM-dd hh:mm:ssফর্ম্যাট দেয় :DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss").withZone(ZoneId.of("Europe/Paris"));
ওয়েস্টার্নগুন

38
public static void main(String[] args) {

    DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
            .withZone(ZoneId.systemDefault());

    System.out.println(DATE_TIME_FORMATTER.format(new Date().toInstant()));

}

3
যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কীভাবে এবং কেন এটি সমস্যার সমাধান করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করলে উত্তরের দীর্ঘমেয়াদী মান উন্নত হবে।
আলেকজান্ডার

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

23
DateTimeFormatter.ISO_INSTANT.format(Instant.now())

এটি আপনাকে ইউটিসিতে রূপান্তর করা থেকে বাঁচায়। তবে অন্য কিছু ভাষার টাইম ফ্রেমওয়ার্কগুলি মিলিসেকেন্ডগুলিকে সমর্থন করতে পারে না তাই আপনার করা উচিত

DateTimeFormatter.ISO_INSTANT.format(Instant.now().truncatedTo(ChronoUnit.SECONDS))

"অন্য কোনও ভাষার টাইম ফ্রেমওয়ার্ক" বলতে কী বোঝ? আইএসআইএনএসএসটিএনটি.ফর্ম্যাট () স্বয়ংক্রিয়ভাবে কয়েক সেকেন্ডে কেটে যাবে?
গুয়াংটং শেন

কিছু ফ্রেমওয়ার্কগুলি কেবলমাত্র সেকেন্ডে যাওয়ার সময় আশা করে কারণ তারা সম্পূর্ণ আইএসও কনভেনশন অনুসরণ করে না এবং ইনপুট স্ট্রিংয়ের অংশ হিসাবে মিলিসেকেন্ড থাকলে ভেঙে যায়।
আর্কিমিডিস ট্রাজানো

21

Instantবর্গ জোন তথ্য থাকে না, এটি শুধুমাত্র সঞ্চয়, ইউনিক্স যুগান্তকারী থেকে মিলিসেকেন্ডে টাইমস্ট্যাম্প অর্থাত 1 জানুয়ারী 1070 ইউটিসি থেকে। সুতরাং, ফর্ম্যাটর একটি তারিখ মুদ্রণ করতে পারে না কারণ তারিখ সর্বদা কংক্রিট সময় অঞ্চলের জন্য মুদ্রিত হয়। আপনার টাইম জোনটি ফর্ম্যাটারে সেট করা উচিত এবং সমস্ত ঠিকঠাক হবে, এর মতো:

Instant instant = Instant.ofEpochMilli(92554380000L);
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).withLocale(Locale.UK).withZone(ZoneOffset.UTC);
assert formatter.format(instant).equals("07/12/72 05:33");
assert instant.toString().equals("1972-12-07T05:33:00Z");

4

অথবা আপনি যদি এখনও প্যাটার্ন থেকে তৈরি ফর্ম্যাটর ব্যবহার করতে চান তবে আপনি কেবল তাত্ক্ষণিকের পরিবর্তে লোকালডেটটাইম ব্যবহার করতে পারেন:

LocalDateTime datetime = LocalDateTime.now();
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(datetime)

4

তাত্ক্ষণিক ইতিমধ্যে ইউটিসিতে রয়েছে এবং ইতিমধ্যে yyyy-MM-dd এর একটি ডিফল্ট তারিখ বিন্যাস রয়েছে । আপনি যদি এতে সন্তুষ্ট হন এবং সময় অঞ্চল বা ফর্ম্যাটিংয়ের সাথে ঝামেলা করতে চান না, আপনি এটিও করতে পারেন toString():

Instant instant = Instant.now();
instant.toString()
output: 2020-02-06T18:01:55.648475Z


টি এবং জেড চান না? (জেড এই তারিখটি ইউটিসি নির্দেশ করে Z Z এর অর্থ হল "জুলু" ওরফে "জিরো আওয়ার অফসেট" ওরফে ইউটিসি):

instant.toString().replaceAll("[TZ]", " ")
output: 2020-02-06 18:01:55.663763


ন্যানোসেকেন্ডের পরিবর্তে মিলিসেকেন্ডগুলি চান? (সুতরাং আপনি এটি একটি বর্গ কোয়েরিতে প্লপ করতে পারেন):

instant.truncatedTo(ChronoUnit.MILLIS).toString().replaceAll("[TZ]", " ")
output: 2020-02-06 18:01:55.664

প্রভৃতি


-3
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd");
String text = date.toString(formatter);
LocalDate date = LocalDate.parse(text, formatter);

আমি বিশ্বাস করি এটি সাহায্য করতে পারে, আপনার তাত্ক্ষণিকের পরিবর্তে কিছু প্রকারের স্থানীয় তারিখের প্রকরণ ব্যবহার করতে হতে পারে

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