জাভা.ইটিল.ডেটে একটি তারিখের স্ট্রিংকে পার্স করার সময় অবৈধ প্যাটার্নের অক্ষর 'টি'


181

আমার একটি তারিখের স্ট্রিং রয়েছে এবং আমি জাভা ডেট এপিআই ব্যবহার করে এটিকে স্বাভাবিক তারিখে পার্স করতে চাই, নিম্নলিখিতটি আমার কোড:

public static void main(String[] args) {
    String date="2010-10-02T12:23:23Z";
    String pattern="yyyy-MM-ddThh:mm:ssZ";
    SimpleDateFormat sdf=new SimpleDateFormat(pattern);
    try {
        Date d=sdf.parse(date);
        System.out.println(d.getYear());
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

তবে আমি একটি ব্যতিক্রম পেয়েছি: java.lang.IllegalArgumentException: Illegal pattern character 'T'

সুতরাং আমি ভাবছি যদি আমাকে স্ট্রিংটি বিভক্ত করতে হয় এবং ম্যানুয়ালি পার্স করতে হয়?

বিটিডাব্লু, আমি টি এর দুপাশে একক উদ্ধৃতি চরিত্র যুক্ত করার চেষ্টা করেছি:

String pattern="yyyy-MM-dd'T'hh:mm:ssZ";

এটিও কাজ করে না।


1
আপনি কি জানেন যে এই "টি" এর অর্থ কী? যতদূর আমি মনে করি 'টি' সহ পুরো তারিখ তারিখ ( 'একক উদ্ধৃতি' মাধ্যমে এটি কুঁদন না রূপান্তরিত করা উচিত, কিন্তু জিনিস আমরা অনুপস্থিত থাকেন পার্স প্যাটার্ন।
coding_idiot

9
Tঘোরা সময় এবং অংশ ISO8601 আন্তর্জাতিক তারিখ সময় বিন্যাসের জন্য মান।

1
অদ্ভুত জিনিস. Tএকক উদ্ধৃতিগুলিতে মোড়ানো আমার পক্ষে কাজ করেছিল (অন্তত পার্স ত্রুটি সমাধানের ক্ষেত্রে)।
আগি হামারথিফ 21'19

উত্তর:


203

জাভা 8 এবং উচ্চতর জন্য আপডেট

আপনি এখন সহজভাবে এখনই করতে পারেন Instant.parse("2015-04-28T14:23:38.521Z")এবং সঠিক জিনিসটি এখনই পেতে পারেন , বিশেষত যেহেতু আপনার জাভাটির সাম্প্রতিকতম সংস্করণগুলির সাথে Instantভাঙার পরিবর্তে ব্যবহার করা উচিত java.util.Date

আপনার পাশাপাশি ব্যবহার DateTimeFormatterকরা উচিত SimpleDateFormatter

আসল উত্তর:

ফর্ম্যাটটি কী উপস্থাপন করে তা নীচের ব্যাখ্যাটি এখনও বৈধ। তবে এটি জাভা 8 সর্বব্যাপী হওয়ার আগে লেখা হয়েছিল তাই এটি পুরানো শ্রেণিগুলি ব্যবহার করে যা আপনি জাভা 8 বা ততোধিক উচ্চতর ব্যবহার করছেন যদি আপনার ব্যবহার করা উচিত নয়।

এটি Zপ্রদর্শিত হিসাবে ইনপুট সঙ্গে কাজ করে :

প্যাটার্নে উভয় পাশ Tদিয়ে পালানো 'হয়।

Zশেষের XXXদিকেটির প্যাটার্নটি আসলে জাভাক ডকুমেন্টে যেমন নথিবদ্ধ হয়েছে SimpleDateFormat, এটি আসলে কীভাবে ব্যবহার করা যায় তা খুব স্পষ্ট নয় যেহেতু Zপুরানো TimeZoneতথ্যের জন্য চিহ্নিতকারী ।

Q2597083.java

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;

public class Q2597083
{
    /**
     * All Dates are normalized to UTC, it is up the client code to convert to the appropriate TimeZone.
     */
    public static final TimeZone UTC;

    /**
     * @see <a href="http://en.wikipedia.org/wiki/ISO_8601#Combined_date_and_time_representations">Combined Date and Time Representations</a>
     */
    public static final String ISO_8601_24H_FULL_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";

    /**
     * 0001-01-01T00:00:00.000Z
     */
    public static final Date BEGINNING_OF_TIME;

    /**
     * 292278994-08-17T07:12:55.807Z
     */
    public static final Date END_OF_TIME;

    static
    {
        UTC = TimeZone.getTimeZone("UTC");
        TimeZone.setDefault(UTC);
        final Calendar c = new GregorianCalendar(UTC);
        c.set(1, 0, 1, 0, 0, 0);
        c.set(Calendar.MILLISECOND, 0);
        BEGINNING_OF_TIME = c.getTime();
        c.setTime(new Date(Long.MAX_VALUE));
        END_OF_TIME = c.getTime();
    }

    public static void main(String[] args) throws Exception
    {

        final SimpleDateFormat sdf = new SimpleDateFormat(ISO_8601_24H_FULL_FORMAT);
        sdf.setTimeZone(UTC);
        System.out.println("sdf.format(BEGINNING_OF_TIME) = " + sdf.format(BEGINNING_OF_TIME));
        System.out.println("sdf.format(END_OF_TIME) = " + sdf.format(END_OF_TIME));
        System.out.println("sdf.format(new Date()) = " + sdf.format(new Date()));
        System.out.println("sdf.parse(\"2015-04-28T14:23:38.521Z\") = " + sdf.parse("2015-04-28T14:23:38.521Z"));
        System.out.println("sdf.parse(\"0001-01-01T00:00:00.000Z\") = " + sdf.parse("0001-01-01T00:00:00.000Z"));
        System.out.println("sdf.parse(\"292278994-08-17T07:12:55.807Z\") = " + sdf.parse("292278994-08-17T07:12:55.807Z"));
    }
}

নিম্নলিখিত আউটপুট উত্পাদন করে:

sdf.format(BEGINNING_OF_TIME) = 0001-01-01T00:00:00.000Z
sdf.format(END_OF_TIME) = 292278994-08-17T07:12:55.807Z
sdf.format(new Date()) = 2015-04-28T14:38:25.956Z
sdf.parse("2015-04-28T14:23:38.521Z") = Tue Apr 28 14:23:38 UTC 2015
sdf.parse("0001-01-01T00:00:00.000Z") = Sat Jan 01 00:00:00 UTC 1
sdf.parse("292278994-08-17T07:12:55.807Z") = Sun Aug 17 07:12:55 UTC 292278994

26

TL; ড

java.time.Instantইউটিসিতে একটি মুহুর্ত উপস্থাপন করে স্ট্যান্ডার্ড আইএসও 8601 ফর্ম্যাটে পাঠ্যকে পার্স করতে শ্রেণি ব্যবহার করুন ।

Instant.parse( "2010-10-02T12:23:23Z" )

আইএসও 8601

তারিখ-সময়ের স্ট্রিং ফর্ম্যাটের জন্য এই ফর্ম্যাটটি আইএসও 8601 স্ট্যান্ডার্ড দ্বারা সংজ্ঞায়িত করা হয়েছে ।

উভয়:

… স্ট্রিংগুলি পার্সিং ও উত্পন্ন করার জন্য ডিফল্টরূপে আইএসও 8601 ফর্ম্যাটগুলি ব্যবহার করুন।

আপনার সাধারণত পুরানো java.util.Date /.Clander & java.text.SimleDate Format ক্লাসগুলি ব্যবহার করা এড়ানো উচিত কারণ তারা কুখ্যাতভাবে ঝামেলা, বিভ্রান্তিকর এবং ত্রুটিযুক্ত। আন্তঃব্যবস্থাপনার জন্য প্রয়োজন হলে, আপনি রূপান্তর করতে পারেন এবং আবারও করতে পারেন।

java.time

জাভা 8 এ নির্মিত এবং পরে নতুন জাভা.টাইম ফ্রেমওয়ার্ক রয়েছে। জোদা-টাইম দ্বারা অনুপ্রাণিত , জেএসআর 310 দ্বারা সংজ্ঞায়িত এবং থ্রিটেন-এক্সট্রা প্রকল্প দ্বারা প্রসারিত ।

Instant instant = Instant.parse( "2010-10-02T12:23:23Z" );  // `Instant` is always in UTC.

পুরানো শ্রেণিতে রূপান্তর করুন।

java.util.Date date = java.util.Date.from( instant );  // Pass an `Instant` to the `from` method.

সময় অঞ্চল

প্রয়োজনে, আপনি একটি সময় অঞ্চল নির্ধারণ করতে পারেন।

ZoneId zoneId = ZoneId.of( "America/Montreal" ); // Define a time zone rather than rely implicitly on JVM’s current default time zone.
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );  // Assign a time zone adjustment from UTC.

রূপান্তর করুন।

java.util.Date date = java.util.Date.from( zdt.toInstant() );  // Extract an `Instant` from the `ZonedDateTime` to pass to the `from` method.

Joda-টাইম

আপডেট: জোদা-সময় প্রকল্পটি এখন রক্ষণাবেক্ষণ মোডে রয়েছে। দলটি জাভা.টাইম ক্লাসগুলিতে মাইগ্রেশন করার পরামর্শ দেয় ।

এখানে জোদা-সময় ২.৮-তে কিছু উদাহরণ কোড দেওয়া আছে।

org.joda.time.DateTime dateTime_Utc = new DateTime( "2010-10-02T12:23:23Z" , DateTimeZone.UTC );  // Specifying a time zone to apply, rather than implicitly assigning the JVM’s current default.

পুরানো শ্রেণিতে রূপান্তর করুন। নোট করুন যে নির্ধারিত সময় অঞ্চলটি রূপান্তরকরণে হারিয়ে গেছে, যেহেতু জুডেটকে সময় অঞ্চল নির্ধারণ করা যায় না।

java.util.Date date = dateTime_Utc.toDate(); // The `toDate` method converts to old class.

সময় অঞ্চল

প্রয়োজনে, আপনি একটি সময় অঞ্চল নির্ধারণ করতে পারেন।

DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime dateTime_Montreal = dateTime_Utc.withZone ( zone );

জাভাতে আধুনিক এবং উত্তরাধিকার উভয়ই তারিখের সময়ের ধরণের সারণী।


জাভা.টাইম সম্পর্কে

Java.time ফ্রেমওয়ার্ক জাভা 8 এবং পরে পাতাটা করা হয়। এই ক্লাসগুলি , & , এর মতো সমস্যাযুক্ত পুরানো উত্তরাধিকারের তারিখ-সময়ের ক্লাসগুলিকে সহায়তা করে ।java.util.DateCalendarSimpleDateFormat

Joda-টাইম প্রকল্প, এখন রক্ষণাবেক্ষণ মোড , মাইগ্রেশনে উপদেশ java.time ক্লাস।

আরও জানতে, ওরাকল টিউটোরিয়ালটি দেখুন । এবং অনেক উদাহরণ এবং ব্যাখ্যার জন্য স্ট্যাক ওভারফ্লো অনুসন্ধান করুন। স্পেসিফিকেশনটি জেএসআর 310

আপনি আপনার ডাটাবেসের সাথে জাভা.টাইম অবজেক্টগুলি সরাসরি বিনিময় করতে পারেন । জেডিবিসি ৪.২ বা তারপরের সাথে অনুগত একটি জেডিবিসি ড্রাইভার ব্যবহার করুন । স্ট্রিংগুলির দরকার নেই, ক্লাসের প্রয়োজন নেই ।java.sql.*

জাভা.টাইম ক্লাস কোথায় পাবেন?

জাভা বা অ্যান্ড্রয়েডের কোন সংস্করণটি ব্যবহার করবে তা জাভা.টাইম লাইব্রেরির সারণী।

ThreeTen-অতিরিক্ত প্রকল্প অতিরিক্ত শ্রেণীর সাথে java.time প্রসারিত করে। এই প্রকল্পটি জাভা.টাইমে সম্ভাব্য ভবিষ্যতের সংযোজনগুলির একটি প্রমাণযোগ্য ক্ষেত্র। আপনি এখানে কিছু দরকারী শ্রেণীর যেমন খুঁজে পেতে পারেন Interval, YearWeek, YearQuarter, এবং আরো


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

আপনাকে ধন্যবাদ, আমি এটি ইউটিসি সময় এবং / অথবা লোকাল সময় থেকে সার্ভার থেকে মিলিসেকেন্ডগুলি পেতে ব্যবহার করি এবং এই ক্ষেত্রে আমার পক্ষে ভাল কাজ করে ..
আলাপ প্যাটেল

ইনস্ট্যান্ট.পার্সের অ্যান্ড্রয়েডে ন্যূনতম এপিআই স্তরের 26 প্রয়োজন
নাভিদ আহমেদ

1
@ নাভিদআহমাদ থ্রিটেন-ব্যাকপোর্ট এবং থ্রিটেনএবিপি প্রকল্পগুলি সম্পর্কে উত্তরের নীচে বুলেটগুলি দেখুন ।
তুলসিল বাউর্ক

0

আপ-টু-টু-আপের উপরে দুটি উত্তর রয়েছে এবং সেগুলি উভয়ই দীর্ঘ (এবং টিএল; ডাঃ খুব ছোট আইএমএইচও), তাই আমি নতুন জাভা.টাইম লাইব্রেরি ব্যবহার শুরু করার অভিজ্ঞতা থেকে সংক্ষিপ্ত লিখি (জাভা সংস্করণের অন্যান্য উত্তরে উল্লিখিত হিসাবে প্রযোজ্য) 8+)। আইএসও 8601 তারিখগুলি লেখার মানক উপায় সেট করে: YYYY-MM-DDসুতরাং তারিখ-সময়ের ফর্ম্যাটটি কেবল নীচের মতো (মিলি সেকেন্ডের জন্য 0, 3, 6 বা 9 সংখ্যা হতে পারে) এবং কোনও বিন্যাসের স্ট্রিং প্রয়োজনীয় নয়:

import java.time.Instant;
public static void main(String[] args) {
    String date="2010-10-02T12:23:23Z";
    try {
        Instant myDate = Instant.parse(date);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

আমার এটির দরকার ছিল না, তবে বছরটি প্রশ্ন থেকেই কোডে আসে, তারপরে:
এটি কৌশলযুক্ত, Instantসরাসরি থেকে করা যায় না, Calendarপ্রশ্নগুলির মাধ্যমে করা যেতে পারে জাভা এবং রূপান্তরকারী জাভাতে বর্তমান বছরের পূর্ণসংখ্যার মান পান Get ক্যালেন্ডারে সময় তবে আইএমএইচও হিসাবে ফর্ম্যাটটি স্থির থাকে সাবস্ট্রিং ব্যবহার করা সহজ:

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