এই তারিখের ফর্ম্যাটটি কী? 2011-08-12T20: 17: 46.384Z


381

আমি নিম্নলিখিত তারিখ আছে: 2011-08-12T20:17:46.384Z। এটি কোন ফর্ম্যাট? আমি এর মাধ্যমে জাভা ১.৪ দিয়ে পার্স করার চেষ্টা করছি DateFormat.getDateInstance().parse(dateStr)এবং পাচ্ছি

java.text.ParseException: আনসারসিয়েবল তারিখ: "2011-08-12T20: 17: 46.384Z"

আমি মনে করি পার্সিংয়ের জন্য আমার সরলডেটফর্ম্যাট ব্যবহার করা উচিত , তবে প্রথমে আমাকে ফর্ম্যাটটির স্ট্রিংটি জানতে হবে। এখনও পর্যন্ত yyyy-MM-ddআমার যা কিছু আছে তা হ'ল কারণ আমি জানি না যে Tএই স্ট্রিংয়ের অর্থ কী - সময় অঞ্চল সম্পর্কিত কিছু? এই তারিখের স্ট্রিংটি ফাইলের সিএমআইএস ডাউনলোড ইতিহাসের মিডিয়া প্রকারেlcmis:downloadedOn প্রদর্শিত ট্যাগ থেকে আসছে ।



3
@ টমাসজ নুরকিউইজ, এটি নয়। ISO8601 এর শেষে Z নেই।
t1gor

4
ISO8601 doe শেষে একটি জেড অনুমতি দেয়। উপরের লিঙ্কটি দেখুন, ইউটিসির সন্ধান করুন।
জনাথন রোজেন

2
@ t1gor শেষেটি Zসংক্ষিপ্ত Zuluএবং এর অর্থ ইউটিসি । এই বিন্যাস অবশ্যই হয় অংশ আইএসও 8601 মান তারিখ পাঠ্য ফরম্যাটের সংগ্রহ। যাইহোক, এই মানক ফর্ম্যাটগুলি জাভা.টাইম ক্লাসে ডিফল্টরূপে ব্যবহৃত হয় ।
বেসিল বোর্কে

3
অবগতির জন্য, যেমন বিরক্তিজনক পুরাতন তারিখ-সময় শ্রেণীর java.util.Date, java.util.Calendarএবং java.text.SimpleDateFormatএখন উত্তরাধিকার দ্বারা supplanted java.time জাভা 8 & জাভা 9. দেখুন পাতাটা শ্রেণীর ওরাকল দ্বারা টিউটোরিয়াল
বেসিল বাউরক

উত্তর:


511

টি সময় থেকে তারিখ আলাদা করার জন্য কেবল আক্ষরিক, এবং জেডটির অর্থ "শূন্য ঘন্টা অফসেট" "জুলু সময়" (ইউটিসি) নামেও পরিচিত। যদি আপনার স্ট্রিংগুলিতে সর্বদা একটি "জেড" থাকে আপনি ব্যবহার করতে পারেন:

SimpleDateFormat format = new SimpleDateFormat(
    "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
format.setTimeZone(TimeZone.getTimeZone("UTC"));

বা জোদা সময় ব্যবহার করে , আপনি ব্যবহার করতে পারেন ISODateTimeFormat.dateTime()


7
আমাদের চারপাশে Tএবং কেন একক উদ্ধৃতি দরকার Z?
মারউন

7
@ মারাউনমারুন: মূলত আমরা সেই আক্ষরিক চরিত্রগুলি চাই। এটির জন্য প্রয়োজনীয় নাও হতে পারে T(সিম্পলডেটফর্ম্যাট কীভাবে অজানা নির্দিষ্টকরণকারীদের পরিচালনা করে তা আমি মনে করতে পারি না) তবে Zআমরা এটি "একটি ইউটিসি অফসেট মান" (যেমন "00") এর চেয়ে 'জেড' অক্ষর হিসাবে রাখতে চাই।
জন স্কিটি

2
@ স্নেডিডিকে: উইকিপিডিয়া পৃষ্ঠায় আপনি লিঙ্ক করেছেন, এটি ইউটিসির জন্য "জুলু সময় অঞ্চল" দেখায়। আমি নিশ্চিত না আপনি কী বিশ্বাস করেন আপনি সংশোধন করছেন।
জন স্কিটি

9
@ জোনস্কিট: এটি একটি অপ্রয়োজনীয় বিতর্ক সৃষ্টি করতে পারে; আপনার উত্তর বিরোধপূর্ণ কিন্তু দৃষ্টি আকর্ষণ করার উদ্দেশ্যে নয় জেড যা থেকে "শূন্য UTC অফসেট" তার চিঠি প্রাথমিক পেয়েছিলাম। লেটার জেডকে ন্যাটো ফোনেটিক বর্ণমালায় "জুলু" হিসাবে উল্লেখ করা হয় । পরিবর্তে, শূন্য ইউটিসি অফসেটটি উল্লেখ করার জন্য সামরিক পদ্ধতিটি জেড চিঠিতে নোঙ্গর করা থাকে যা তারা জুলু হিসাবে চিহ্নিত করে, এটি তাদের কোডড নাম অর্জন করে: জুলু সময় অঞ্চল zone এটি লক্ষণীয় গুরুত্বপূর্ণ যে জেড এর অর্থ হারাতে পারেনি এবং এখনও শূন্য ইউটিসি-র অফসেটের জোন ডিজাইনার হিসাবে জুলু টাইম অঞ্চল (জেড থেকে) এটি উল্লেখ করার জন্য কেবল উত্তরাধিকারসূত্রে কোডেড ভাষা।
নিবেদিতিকে

2
@ স্নেডিডিকে: আমি এখনও অন্য যে কেউ আমার উত্তরের রেফারেন্সের সাথে এই পার্থক্যের বিষয়ে যত্নশীল কিনা তা নিয়ে আমি এখনও দ্বিমত পোষণ করি না, তবে আমি এটি আপডেট করেছি। আমি যদিও সমস্ত বিবরণে যেতে যাচ্ছি না, কারণ ইতিহাস উত্তরটির সাথে বিস্তৃতভাবে অপ্রাসঙ্গিক।
জন স্কিটি

86

TL; ড

স্ট্যান্ডার্ড আইএসও 8601 ফর্ম্যাটটি আপনার ইনপুট স্ট্রিং দ্বারা ব্যবহৃত হয়।

Instant.parse ( "2011-08-12T20:17:46.384Z" ) 

আইএসও 8601

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

Tসময় অফ দিন অংশ থেকে তারিখ অংশ আলাদা করে। Zপ্রান্তে মানে ইউটিসি (যে, একটি অফসেট-ইউটিসি থেকে শূন্য ঘণ্টা-মিনিট-সেকেন্ড)। Zহয় "জুলু" উচ্চারিত

java.time

জাভার প্রাথমিক সংস্করণগুলির সাথে বান্ডিল হওয়া পুরানো তারিখ-কালীন ক্লাসগুলি খারাপভাবে নকশাকৃত, বিভ্রান্তিকর এবং সমস্যাযুক্ত হিসাবে প্রমাণিত হয়েছে। এগুলি এড়িয়ে চলুন।

পরিবর্তে, জাভা 8 এবং তার পরে জাভা.টাইম ফ্রেমওয়ার্কটি ব্যবহার করুন । জাভা.টাইম ক্লাসগুলি পুরানো তারিখের সময় ক্লাস এবং অত্যন্ত সফল জোদা-টাইম লাইব্রেরি উভয়কে সরবরাহ করে।

জাভা.টাইম ক্লাসগুলি তারিখ-সময়ের মানগুলির পাঠ্য উপস্থাপনা পার্স / তৈরি করার সময় ডিফল্টরূপে আইএসও 8601 ব্যবহার করে।

Instantক্লাসে টাইমলাইনে একটি মুহূর্ত প্রতিনিধিত্ব করে ইউটিসি একটি রেজোলিউশনে ন্যানোসেকেন্ড । এই শ্রেণিটি কোনও ফর্ম্যাটিং প্যাটার্ন সংজ্ঞায়িত করে বিরত না করে সরাসরি আপনার ইনপুট স্ট্রিংটিকে পার্স করতে পারে।

Instant instant = Instant.parse ( "2011-08-12T20:17:46.384Z" ) ;

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


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

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

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

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

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

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

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


3
@ স্টার "জুলু" সামরিক ও বিমানচালনার traditionতিহ্য থেকে এসেছে যেখানে বর্ণমালা AZ এর 25 টি অক্ষর ("জে" নেই), প্রতিটি বর্ণের একটি উচ্চারণযোগ্য নাম রয়েছে, তাদের সময় অঞ্চলগুলির সংস্করণ উপস্থাপন করে । "জুলু" অঞ্চলটি ইউটিসি থেকে শূন্য ঘন্টা অফসেট। দেখুন এই এবং এই
বাসিল বাউরক

27

জাভা পার্সিং সম্পর্কে নিশ্চিত নয়, তবে এটি আইএসও 8601: http://en.wikedia.org/wiki/ISO_8601


এটি কি "2016-01-27T17: 44: 55UTC", আইএসও 8601?
ব্যবহারকারী 1997292

আমি বিশ্বাস করি না। এটি কাছাকাছি হলেও ইউটিসির প্রত্যয় হিসাবে অনুমোদিত নয় এটি জেড বা টাইম জোন অফসেট হতে হবে, যেমন, +0100। জেড এবং ইউটিসি, যদিও, একই অর্থ নেই, তাই পরিবর্তন ইউটিসি থেকে জেড বৈধ ISO 8601. উত্পাদ হবে
smparkes

9

প্রথম উত্তরের পরিবর্তে এটি বিশ্লেষণের অন্যান্য উপায় রয়েছে। এটির বিশ্লেষণ করতে:

(1) আপনি যদি তারিখ এবং সময় সম্পর্কে তথ্য দখল করতে চান তবে আপনি এটি ZonedDatetime( জাভা 8 ) বা Date(পুরানো) অবজেক্টটিতে পার্স করতে পারেন :

// ZonedDateTime's default format requires a zone ID(like [Australia/Sydney]) in the end.
// Here, we provide a format which can parse the string correctly.
DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE_TIME;
ZonedDateTime zdt = ZonedDateTime.parse("2011-08-12T20:17:46.384Z", dtf);

অথবা

// 'T' is a literal.
// 'X' is ISO Zone Offset[like +01, -08]; For UTC, it is interpreted as 'Z'(Zero) literal.
String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX";

// since no built-in format, we provides pattern directly.
DateFormat df = new SimpleDateFormat(pattern);

Date myDate = df.parse("2011-08-12T20:17:46.384Z");

(২) যদি আপনি তারিখ এবং সময়কে যত্ন না করেন এবং কেবল ন্যানোসেকেন্ডে তথ্যটিকে মুহুর্ত হিসাবে বিবেচনা করতে চান তবে আপনি ব্যবহার করতে পারেন Instant:

// The ISO format without zone ID is Instant's default.
// There is no need to pass any format.
Instant ins = Instant.parse("2011-08-12T20:17:46.384Z");

1

যদি আপনি ছেলেরা অ্যান্ড্রয়েডের জন্য কোনও সমাধান খুঁজছেন, আপনি টাইমস্ট্যাম্প স্ট্রিং থেকে পর্ব সেকেন্ড পেতে নিম্নলিখিত কোডটি ব্যবহার করতে পারেন।

public static long timestampToEpochSeconds(String srcTimestamp) {
    long epoch = 0;

    try {
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            Instant instant = Instant.parse(srcTimestamp);
            epoch = instant.getEpochSecond();
        } else {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSSSS'Z'", Locale.getDefault());
            sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
            Date date = sdf.parse(srcTimestamp);
            if (date != null) {
                epoch = date.getTime() / 1000;
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    return epoch;
}

নমুনা ইনপুট: 2019-10-15T05: 51: 31.537979Z

নমুনা আউটপুট: 1571128673


0

আপনি নিম্নলিখিত উদাহরণ ব্যবহার করতে পারেন।

    String date = "2011-08-12T20:17:46.384Z";

    String inputPattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";

    String outputPattern = "yyyy-MM-dd HH:mm:ss";

    LocalDateTime inputDate = null;
    String outputDate = null;


    DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern(inputPattern, Locale.ENGLISH);
    DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern(outputPattern, Locale.ENGLISH);

    inputDate = LocalDateTime.parse(date, inputFormatter);
    outputDate = outputFormatter.format(inputDate);

    System.out.println("inputDate: " + inputDate);
    System.out.println("outputDate: " + outputDate);

আপনি কাছাকাছি এস্ট্রোফেস স্থাপন করা উচিত নয় Z। তার মানে আশা করা কিন্তু সেই চিঠিটিকে উপেক্ষা করা। তবে সেই চিঠিটি এড়ানো উচিত নয়। এই চিঠিটি মূল্যবান তথ্য সরবরাহ করে, সত্য যে স্ট্রিংটি ইউটিসি-র জন্য ছিল, এটি শূন্যের অফসেট। আপনার ফর্ম্যাটটি এই গুরুত্বপূর্ণ সত্যটিকে ত্যাগ করছে। তদুপরি, এই ফর্ম্যাটিং প্যাটার্নটি সংজ্ঞায়িত করারও দরকার নেই। এই প্যাটার্ন জন্য একটি ফরম্যাটার সালে নির্মিত হয়।
বেসিল Bourque

-1

এই কৌশলটি java.util. তারিখটিকে ইউটিসি ফর্ম্যাটে (বা অন্য কোনও) অনুবাদ করে আবার ফিরে আসে।

এর মতো ক্লাস সংজ্ঞায়িত করুন:

import java.util.Date;

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class UtcUtility {

public static DateTimeFormatter UTC = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").withZoneUTC();


public static Date parse(DateTimeFormatter dateTimeFormatter, String date) {
    return dateTimeFormatter.parseDateTime(date).toDate();
}

public static String format(DateTimeFormatter dateTimeFormatter, Date date) {
    return format(dateTimeFormatter, date.getTime());
}

private static String format(DateTimeFormatter dateTimeFormatter, long timeInMillis) {
    DateTime dateTime = new DateTime(timeInMillis);
    String formattedString = dateTimeFormatter.print(dateTime);
    return formattedString;
}

}

তারপরে এটি ব্যবহার করুন:

Date date = format(UTC, "2020-04-19T00:30:07.000Z")

অথবা

String date = parse(UTC, new Date())

আপনার প্রয়োজন হলে অন্যান্য তারিখের ফর্ম্যাটগুলিও সংজ্ঞায়িত করতে পারেন (কেবল ইউটিসি নয়)


উভয় java.util.Dateএবং Joda-টাইম প্রকল্পের আধুনিক দ্বারা বছর পূর্বে supplanted হয়েছে java.time JSR 310. পরামর্শ এখানে দীর্ঘ পুরানো সংজ্ঞায়িত ক্লাস।
বাসিল বাউর্ক

জাভা.টাইম জাভা ৮ এ প্রবর্তিত হয়েছিল। এই প্রশ্নটি জাভা ১.৪ এর উল্লেখ করে এবং তাই আমি ইচ্ছাকৃতভাবে নতুন ক্লাসের ব্যবহার এড়িয়ে চলেছি। এই সমাধানটি পুরানো কোড ঘাঁটিগুলির জন্য পরিবেশন করে। আমি মনে করি লেখক তার কোডবেসটি জাভা 8 এ সরিয়ে নিতে পারছেন তবে এটি সর্বদা সহজ, দক্ষ বা প্রয়োজনীয় নয়।
গ্যাপমিস্টার 66

-1

@ জন-স্কিটি আমাকে এ সম্পর্কে আমার নিজের ইস্যুটি ঠিক করার জন্য ক্লু দিয়েছে। একজন তরুণ প্রোগ্রামার হিসাবে এই ছোট সমস্যাটি সহজেই মিস করা এবং নির্ণয় করা শক্ত। তাই আমি আশা করি এটি ভাগ করে নিলে এটি কারও সহায়ক হবে।

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

সুতরাং নিম্নলিখিতটি দেওয়া হয়েছে (প্যাটার্নের স্ট্রিং প্যারামিটারের দিকে মনোযোগ দিন ();

String str = "20190927T182730.000Z"

LocalDateTime fin;
fin = LocalDateTime.parse( str, DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss.SSSZ") );

ত্রুটি:

Exception in thread "main" java.time.format.DateTimeParseException: Text 
'20190927T182730.000Z' could not be parsed at index 19

সমস্যাটি? প্যাটার্নের শেষে থাকা জেডটি 'টি' এর মতো 'জেড' এ আবৃত হওয়া দরকার। পরিবর্তন "yyyyMMdd'T'HHmmss.SSSZ"করুন "yyyyMMdd'T'HHmmss.SSS'Z'"এবং এটি কাজ করে।

সম্পূর্ণরূপে জেডটি সরিয়ে ফেলার ফলেও ত্রুটি হয়েছিল।

সত্যি বলতে কী, আমি কোনও জাভা ক্লাসের প্রত্যাশা করতাম।


1
এটি ইতিমধ্যে এখানে এবং এখানে জিজ্ঞাসা করা হয়েছে এবং উত্তর দেওয়া হয়েছে । এবং আপনার সমাধানটি ভুল। যদিও Tএটি একটি আক্ষরিক এবং উদ্ধৃত করা দরকার, Zএটি একটি অফসেট (শূন্যের) এবং যেমনটি বিশ্লেষণ করা দরকার, অথবা আপনি ভুল ফলাফল পাবেন। আমি জানি না আপনি কী বোঝাতে চেয়েছিলেন এটি অনুমান করা হয়নি, আমি বিশ্বাস করি এটি রয়েছে।
ওলে ভিভি

1
না, না, না, এটিকে উপেক্ষা করবেন না Z। আপনি মূল্যবান তথ্য ত্যাগ করছেন। সময় অঞ্চল বা অফসেট-থেকে-ইউটিসি উপেক্ষা করার সময় একটি তারিখ-সময়ের মান প্রক্রিয়াজাতকরণ মুদ্রা উপেক্ষা করার সময় প্রচুর অর্থ প্রক্রিয়াকরণের মতো!
বাসিল বাউরক

1
কেবল Tসময়ের অংশ থেকে কেবল তারিখের অংশটি পৃথক করে এবং কোনও অর্থ যোগ করে না। Zঅন্যদিকে স্পষ্টভাবে অর্থ যোগ করে।
বেসিল Bourque

ওলে, লিঙ্কগুলির জন্য ধন্যবাদ। আমি অবশ্যই সেগুলি পড়ি। এবং আমি স্বীকার করি যে আমি অবশ্যই একজন তরুণ হিসাবে ভুল হতে পারি। সমস্ত আমি বলছি যে প্যাটার্নে চরের মতো একক উদ্ধৃতিতে জেডটি মোড়ানো ত্রুটির সমাধান করে। আমার সমালোচনাটি হ'ল যে যে কেউ ক্লাসের "প্যাটার্ন" অংশটি ডিজাইন করেছেন সে 'জেড' (বা একটি আলাদা টাইম অঞ্চল?) এবং 'টি' এর মধ্যে আবৃত হওয়া বা থাকা উচিত নয় বা উপস্থিতির অস্তিত্ব বা কোডের কাছাকাছি থাকতে পারে। কারণ তারা এর অনন্য বৈশিষ্ট্য রাখেনি। ইমের সাথে কাজ করা ফর্ম্যাটটি JSON থেকে আসে একটি বাণিজ্যিক এপিআই একটি স্ট্রিংকে পার্স করা। তবে এগুলিকে আরও দরকারী করে তোলার জন্য আমাকে এগুলি তারিখের সময় ক্যালেন্ডারে ইত্যাদির বিশ্লেষণ করতে হবে।
স্পেনসেম্বি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.