Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> प्रोग्रामिंग

मास्टर जावा दिनांक फ़ॉर्मेटिंग:SimpleDateFormat और DateFormat की व्याख्या

परिचय

<पी> SimpleDateFormat प्रारूप और पार्स java.util.Date कस्टम पैटर्न स्ट्रिंग्स का उपयोग करके मान, और DateFormat स्थानीय-जागरूक दिनांक और समय स्वरूपण के लिए सार आधार एपीआई प्रदान करता है। जब आप लीगेसी जावा कोड बनाए रखते हैं जो अभी भी java.util.Date पर निर्भर करता है तो इन एपीआई का उपयोग करें; नए कोड के लिए, DateTimeFormatter को प्राथमिकता दें जावा 8+ दिनांक/समय एपीआई से क्योंकि SimpleDateFormat थ्रेड-सुरक्षित नहीं है.

<पी> यह ट्यूटोरियल दिखाता है कि DateFormat का उपयोग कैसे करें और SimpleDateFormat फ़ॉर्मेटिंग, पार्सिंग, टाइमज़ोन रूपांतरण और स्थानीय-विशिष्ट आउटपुट के लिए। इसमें setLenient(false) के साथ सख्त सत्यापन भी शामिल है , थ्रेड सुरक्षा समाधान, और DateTimeFormatter के लिए एक व्यावहारिक माइग्रेशन पथ .

मुख्य बातें

  • DateFormat सार स्वरूपण एपीआई है, और SimpleDateFormat पैटर्न-आधारित फ़ॉर्मेटिंग और पार्सिंग के लिए ठोस कार्यान्वयन है
  • SimpleDateFormat वर्षों, महीनों, दिनों, समय क्षेत्रों और समयक्षेत्र आउटपुट के लिए समृद्ध पैटर्न टोकन का समर्थन करता है
  • एक साझा SimpleDateFormat मल्टीथ्रेडेड कोड में इंस्टेंस असुरक्षित है क्योंकि इसकी आंतरिक स्थिति परिवर्तनशील है
  • ThreadLocal<SimpleDateFormat> जब लीगेसी कोड तुरंत माइग्रेट नहीं हो सकता है तो प्रति थ्रेड फ़ॉर्मेटर इंस्टेंस को अलग करता है
  • DateTimeFormatter अपरिवर्तनीय और थ्रेड-सुरक्षित है, इसलिए यह नए जावा कोड के लिए पसंदीदा प्रतिस्थापन है
  • .parse() ParseException फेंक सकते हैं , इसलिए पार्सिंग कोड को ट्राई-कैच और उपयोगी त्रुटि संदेशों का उपयोग करना चाहिए
  • setLenient(false) 2024-13-45 जैसी अमान्य तिथियों को चुपचाप समायोजित होने से रोकता है
  • हमेशा एक स्पष्ट Locale पास करें सर्वर परिनियोजन में पर्यावरण-निर्भर आउटपुट से बचने के लिए

Java में SimpleDateFormat क्या है?

<पी> SimpleDateFormat DateFormat है उपवर्ग जो आपको जावा में फ़ॉर्मेटिंग और पार्सिंग के लिए स्पष्ट दिनांक/समय पैटर्न परिभाषित करने देता है।

<पी> DateFormat का प्रयोग करें जब आप फ़ैक्टरी विधियों के माध्यम से शैली-आधारित, स्थानीय-जागरूक आउटपुट चाहते हैं, और SimpleDateFormat का उपयोग करें जब आपको सटीक पैटर्न नियंत्रण की आवश्यकता हो जैसे "dd-MM-yyyy" या "yyyy-MM-dd'T'HH:mm:ssZ" . DateFormat शैली स्थिरांक (SHORT , MEDIUM , LONG , FULL ) आपको सटीक क्षेत्रीय दिनांक क्रम जानने की आवश्यकता के बिना स्थानीय-उपयुक्त आउटपुट उत्पन्न करता है, जो उपयोगकर्ता-सामना वाले डिस्प्ले स्ट्रिंग्स के लिए उपयोगी है जहां प्रारूप को उपयोगकर्ता के स्थानीय सम्मेलनों का पालन करना चाहिए। SimpleDateFormat का प्रयोग करें जब आउटपुट स्वरूप किसी बाहरी आवश्यकता जैसे कि एपीआई अनुबंध, लॉग प्रारूप, या फ़ाइल नामकरण परंपरा द्वारा तय किया जाता है, क्योंकि उन मामलों में स्थान की परवाह किए बिना एक सटीक पैटर्न की आवश्यकता होती है।

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
Locale locale = Locale.US;
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, locale);
String styleBased = dateFormat.format(new Date());
SimpleDateFormat patternBased = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss", locale);
String patternOutput = patternBased.format(new Date());
System.out.println(styleBased);
System.out.println(patternOutput);
Jan 5, 2026
05-01-2026 14:30:22
<पी> new Locale(String, String) जावा 19 के रूप में पदावनत किया गया है। Locale.Builder का उपयोग करें इसके बजाय.

Locale locale = new Locale.Builder()
 .setLanguage("en")
 .setRegion("US")
 .build();
<पी> दिनांक के बजाय समय को प्रारूपित करने के लिए, DateFormat.getTimeInstance() का उपयोग करें समान स्थान और शैली मापदंडों के साथ।

Locale locale = Locale.US;
DateFormat timeFormat = DateFormat.getTimeInstance(DateFormat.MEDIUM, locale);
System.out.println(timeFormat.format(new Date()));
Output depends on the current time and timezone, for example:
2:30:45 PM
<पी> आधुनिक जावा दिनांक/समय एपीआई के व्यापक अवलोकन के लिए, उदाहरण के साथ जावा 8 दिनांक, लोकलडेट, लोकलडेटटाइम, इंस्टेंट और जावा 8 सुविधाएँ देखें।

SimpleDateFormat पैटर्न सिंटैक्स संदर्भ

<पी> SimpleDateFormat पैटर्न अक्षर सीधे दिनांक/समय घटकों पर मैप करते हैं, और सही पैटर्न चयन आउटपुट प्रारूप और पार्स व्यवहार दोनों को नियंत्रित करता है।

प्रतीक अर्थ उदाहरण पैटर्न उदाहरण आउटपुट G युग अभिकल्पकर्ताG AD y वर्षyyyy 2026 M वर्ष में महीनाMMMM January w वर्ष में सप्ताहw 3 W महीने में सप्ताहW 1 D वर्ष में दिनD 15 d महीने में दिनdd 05 F महीने में सप्ताह का दिनF 1 E सप्ताह में दिन का नामEEE Mon u सप्ताह में दिन संख्या (1 = Monday )u 1 a AM/PM मार्करa PM H दिन में घंटा (0-23 )HH 14 k दिन में घंटा (1-24 )k 14 K सुबह/दोपहर का समय (0-11 )K 2 h सुबह/दोपहर का समय (1-12 )hh 02 m घंटे में मिनटmm 30 s मिनट में दूसरा ss 45 S मिलीसेकंडSSS 123 z सामान्य समयक्षेत्रz IST Z आरएफसी 822 समयक्षेत्र ऑफसेटZ +0530 X आईएसओ 8601 समयक्षेत्र ऑफसेटXXX +05:30

पैटर्न दोहराव और आउटपुट चौड़ाई

<पी> दोहराए गए पैटर्न अक्षर चौड़ाई, संख्यात्मक पैडिंग, या पाठ शैली बदलते हैं।

फ़ील्ड पैटर्न उदाहरण आउटपुट महीनाM 1 महीनाMM 01 माहMMM Jan माहMMMM January महीने का दिनd 5 महीने का दिनdd 05 घंटा (0-23 )H 7 घंटा (0-23 )HH 07 वर्षyy 26 वर्षyyyy 2026

अपेक्षित आउटपुट के साथ सामान्य पैटर्न के उदाहरण

<पी> ये सामान्य पैटर्न लॉग, एपीआई और उपयोगकर्ता-सामना वाली तिथियों के लिए उपयोगी हैं।

पैटर्न उदाहरण आउटपुट MM/dd/yyyy 01/05/2026 dd-M-yyyy hh:mm:ss 05-1-2026 02:30:45 dd MMMM yyyy 05 January 2026 dd MMMM yyyy zzzz 05 January 2026 India Standard Time E, dd MMM yyyy HH:mm:ss z Mon, 05 Jan 2026 14:30:45 IST

SimpleDateFormat का उपयोग करके दिनांक को कैसे प्रारूपित करें

<पी> Date को फ़ॉर्मेट करने के लिए , एक SimpleDateFormat बनाएं एक पैटर्न के साथ और .format(date) पर कॉल करें .

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
Date now = new Date();
SimpleDateFormat basic = new SimpleDateFormat("MM-dd-yyyy", Locale.US);
SimpleDateFormat withTime = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss", Locale.US);
SimpleDateFormat isoLike = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.US);
System.out.println(basic.format(now));
System.out.println(withTime.format(now));
System.out.println(isoLike.format(now));
01-05-2026
05-01-2026 14:30:45
2026-01-05T14:30:45+0000
<पी> SimpleDateFormat फ़ॉर्मेटर उदाहरण से समयक्षेत्र और स्थानीय नियम लागू होता है, इसलिए उन मानों को स्पष्ट रूप से सेट करें जब आउटपुट सुसंगत होना चाहिए।

SimpleDateFormat का उपयोग करके किसी स्ट्रिंग को दिनांक तक कैसे पार्स करें

<पी> एक स्ट्रिंग को Date में पार्स करने के लिए , सटीक इनपुट पैटर्न के साथ एक फ़ॉर्मेटर बनाएं और .parse(input) पर कॉल करें .

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
try {
 SimpleDateFormat dateParser = new SimpleDateFormat("dd-MM-yyyy", Locale.US);
 Date parsedDate = dateParser.parse("05-01-2026");
 System.out.println(parsedDate);
 SimpleDateFormat timeParser = new SimpleDateFormat("HH:mm:ss", Locale.US);
 Date parsedTime = timeParser.parse("22:15:09");
 System.out.println(parsedTime);
} catch (ParseException e) {
 e.printStackTrace();
}
Mon Jan 05 00:00:00 UTC 2026
Thu Jan 01 22:15:09 UTC 1970
<पी> यदि केवल समय प्रदान किया गया है, तो जावा युग दिनांक को दिनांक भाग के रूप में उपयोग करता है।

ParseException को सही ढंग से संभालना

<पी> parse() ParseException फेंकता है जब इनपुट कॉन्फ़िगर किए गए पैटर्न से मेल नहीं खाता है, तो उत्पादन कोड को इसे पकड़ना चाहिए और कच्चे इनपुट और अपेक्षित पैटर्न दोनों को लॉग करना चाहिए।

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Locale;
String input = "31/01/2026";
String pattern = "dd-MM-yyyy";
SimpleDateFormat parser = new SimpleDateFormat(pattern, Locale.US);
try {
 parser.parse(input);
 System.out.println("Parsed successfully");
} catch (ParseException e) {
 // Include both the input value and pattern for easier debugging.
 System.err.println("Failed to parse date string: " + input);
 System.err.println("Expected pattern: " + pattern);
 System.err.println("Parser error: " + e.getMessage());
}
Failed to parse date string: 31/01/2026
Expected pattern: dd-MM-yyyy
Parser error: Unparseable date: "31/01/2026"
<पी> अपवाद हैंडलिंग पैटर्न के लिए आप सभी सेवाओं में पुन:उपयोग कर सकते हैं, जावा और जावा में अपवाद हैंडलिंग 8 दिनांक, लोकलडेट, लोकलडेटटाइम, इंस्टेंट देखें।

विश्लेषण से पहले दिनांक स्ट्रिंग को मान्य करना

<पी> SimpleDateFormat डिफ़ॉल्ट रूप से उदार है, इसलिए अमान्य मान विफल होने के बजाय आगे बढ़ सकते हैं; setLenient(false) पर कॉल करें सख्त सत्यापन लागू करने के लिए।

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Locale;
String invalid = "2024-13-45";
SimpleDateFormat lenientParser = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
SimpleDateFormat strictParser = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
strictParser.setLenient(false);
System.out.println("Lenient parse result:");
try {
 // Lenient mode silently rolls over invalid values instead of throwing.
 System.out.println(lenientParser.parse(invalid));
} catch (ParseException e) {
 System.out.println("ParseException: " + e.getMessage());
}
System.out.println("Strict parse result:");
try {
 System.out.println(strictParser.parse(invalid));
} catch (ParseException e) {
 System.out.println("ParseException: " + e.getMessage());
}
Lenient parse result:
Fri Feb 14 00:00:00 UTC 2025
Strict parse result:
ParseException: Unparseable date: "2024-13-45"

SimpleDateFormat में टाइमज़ोन प्रबंधन

<पी> SimpleDateFormat वही Date प्रस्तुत कर सकता है आउटपुट से पहले फ़ॉर्मेटर पर एक टाइमज़ोन सेट करके अलग-अलग टाइमज़ोन में। ए Date ऑब्जेक्ट केवल यूटीसी मिलीसेकंड गिनती संग्रहीत करता है और उसका अपना कोई समय क्षेत्र नहीं होता है। टाइमज़ोन एक फ़ॉर्मेटिंग चिंता का विषय है, भंडारण संबंधी चिंता का विषय नहीं; वही Date मान अलग-अलग मानव-पठनीय आउटपुट उत्पन्न करता है, जो इस बात पर निर्भर करता है कि फ़ॉर्मेटर किस समय क्षेत्र पर लागू होता है। इसका मतलब है setTimeZone() format() से पहले फ़ॉर्मेटर पर कॉल किया जाना चाहिए कहा जाता है; इसे बाद में सेट करने से पहले से उत्पादित आउटपुट पर कोई प्रभाव नहीं पड़ता है।

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
Date timestamp = new Date(1700000000000L); // Fixed instant for repeatable output
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z", Locale.US);
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println("UTC: " + formatter.format(timestamp));
formatter.setTimeZone(TimeZone.getTimeZone("America/New_York"));
System.out.println("New York: " + formatter.format(timestamp));
formatter.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));
System.out.println("Kolkata: " + formatter.format(timestamp));
UTC: 2023-11-14 22:13:20 +0000
New York: 2023-11-14 17:13:20 -0500
Kolkata: 2023-11-15 03:43:20 +0530
<पी> गहन समयक्षेत्र रूपांतरण पैटर्न के लिए जावा दिनांक को विशिष्ट समयक्षेत्र प्रारूप में कैसे परिवर्तित करें देखें।

सामान्य समयक्षेत्र गलतियाँ और उनसे कैसे बचें

<पी> टाइमज़ोन बग अक्सर स्थानीय समय के साथ संग्रहित इंस्टेंट को भ्रमित करने से आते हैं।

  • Date UTC मिलीसेकंड को संग्रहीत करता है, और टाइमज़ोन केवल फ़ॉर्मेट करते समय लागू होता है
  • कॉलिंग setTimeZone() मल्टीथ्रेडेडएनवायरमेंट में एक साझा फ़ॉर्मेटर इंस्टेंस पर किसी अन्य थ्रेड के इन-फ़्लाइट कॉल के लिए टाइमज़ोन मध्य-ऑपरेशन को बदल सकता है, बिना किसी अपवाद के गलत टाइमज़ोन में आउटपुट उत्पन्न कर सकता है
  • एकल SimpleDateFormat का पुन:उपयोग करना एसर्वलेट या स्प्रिंग कंट्रोलर में HTTP अनुरोधों का उदाहरण एक अनुरोध के setTimeZone() का कारण बन सकता है किसी अन्य अनुरोध के आउटपुट को प्रभावित करने के लिए कॉल करें; प्रति अनुरोध एक नया उदाहरण बनाएं या ThreadLocal<SimpleDateFormat> का उपयोग करें राज्य को अलग करना
  • TimeZone.getTimeZone("Invalid/Zone") चुपचाप GMT पर वापस आ जाता है क्योंकि विधि अनुबंध अपवाद को फेंकने के बजाय गैर-मान्यता प्राप्त आईडी के लिए GMT को डिफ़ॉल्ट के रूप में निर्दिष्ट करता है
  • ज़ोन आईडी को ZoneId.of() से मान्य करें java.time से उन्हें TimeZone.getTimeZone() पर भेजने से पहले; ZoneId.of() ZoneRulesException फेंकता है एक अमान्य आईडी पर, जो समस्या को स्पष्ट करता है

स्थानीय-जागरूक दिनांक स्वरूपण

<पी> स्थान-विशिष्ट दिनांक आउटपुट, जैसे फ़्रेंच महीने के नाम या जर्मन दिन के नाम, उत्पन्न करने के लिए, Locale पास करें SimpleDateFormat तक निर्माता. अंतर्निहित स्थिरांक, Locale.US का उपयोग करें , Locale.UK , Locale.FRENCH , Locale.GERMAN , सामान्य क्षेत्रों के लिए, या Locale.Builder के साथ एक कस्टम लोकेल बनाएं जब आपको ऐसे क्षेत्र की आवश्यकता हो जो स्थिरांकों द्वारा कवर न किया गया हो। Locale यह नियंत्रित करता है कि महीने के नाम, दिन के नाम और AM/PM मार्कर जैसे टेक्स्ट फ़ील्ड के लिए किस भाषा का उपयोग किया जाता है।

SimpleDateFormat कंस्ट्रक्टर में लोकेल निर्दिष्ट करना

<पी> Locale पास करें दूसरे कंस्ट्रक्टर तर्क के रूप में। यदि आप इसे छोड़ देते हैं, तो SimpleDateFormat Locale.getDefault() पर कॉल करता है आंतरिक रूप से, जो फ़ॉर्मेटर को जेवीएम के रनटाइम लोकेल से बांधता है, एक मान जो डेवलपर मशीनों, सीआई वातावरण और विभिन्न ओएस लोकेल कॉन्फ़िगरेशन के तहत चल रहे उत्पादन सर्वर के बीच भिन्न होता है।
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
Date sample = new Date(1700000000000L);
String pattern = "EEEE, dd MMMM yyyy";
SimpleDateFormat usFormatter = new SimpleDateFormat(pattern, Locale.US);
SimpleDateFormat frFormatter = new SimpleDateFormat(pattern, Locale.FRENCH);
String usDate = usFormatter.format(sample);
String frDate = frFormatter.format(sample);
System.out.println("US: " + usDate);
System.out.println("French: " + frDate);
US: Tuesday, 14 November 2023
French: mardi, 14 novembre 2023

क्षेत्र के अनुसार महीने और दिन के नामों का प्रारूपण

<पी> एक ही पैटर्न लोकेल के अनुसार अलग-अलग टेक्स्ट आउटपुट उत्पन्न करता है।

स्थान पैटर्न आउटपुट Locale.US EEEE, dd MMMM yyyy Tuesday, 14 November 2023 Locale.FRENCH EEEE, dd MMMM yyyy mardi, 14 novembre 2023 Locale.GERMAN EEEE, dd MMMM yyyy Dienstag, 14 November 2023 <पी> Locale.getDefault() पर भरोसा करते हुए सर्वर वातावरण में चलने वाले JVM में असंगत आउटपुट उत्पन्न हो सकता है क्योंकि OS लोकेल सेटिंग्स सभी होस्टों में भिन्न होती हैं। हमेशा एक स्पष्ट Locale पास करें .

SimpleDateFormat के साथ थ्रेड सुरक्षा समस्याएं

SimpleDateFormat थ्रेड-सुरक्षित क्यों नहीं है

<पी> SimpleDateFormat आंतरिक Calendar को परिवर्तित करता है और NumberFormat पार्स/प्रारूप संचालन के दौरान राज्य। यदि एकाधिक थ्रेड एक उदाहरण का उपयोग करते हैं, तो इन परिवर्तनीय फ़ील्ड को मध्य-ऑपरेशन में अधिलेखित किया जा सकता है, जो दौड़ की स्थिति और अप्रत्याशित आउटपुट का कारण बनता है। व्यवहार में यह एक थ्रेड से दूसरे थ्रेड के परिणाम में दिखाई देने वाली तारीखों के रूप में सामने आता है, .parse() बिना किसी अपवाद के पूरी तरह से गलत तारीख लौटाना, या ArrayIndexOutOfBoundsException फ़ॉर्मेटर के अंदर से ही फेंक दिया गया। ये विफलताएँ रुक-रुक कर और लोड-निर्भर होती हैं, जिससे उन्हें एकल-थ्रेडेड परीक्षण वातावरण में पुन:उत्पन्न करना मुश्किल हो जाता है।

<पी> जब आपको लीगेसी कोड में समवर्ती-सुरक्षित स्वरूपण की आवश्यकता हो, तो थ्रेड या अनुरोध दायरे के आधार पर उदाहरणों को अलग करें। जावा थ्रेडिंग व्यवहार की पृष्ठभूमि के लिए, जावा थ्रेड उदाहरण देखें।

SimpleDateFormat उदाहरणों को अलग करने के लिए ThreadLocal का उपयोग करना

<पी> ThreadLocal<SimpleDateFormat> प्रत्येक थ्रेड को अपना स्वयं का फ़ॉर्मेटर उदाहरण देता है और साझा परिवर्तनशील स्थिति से बचता है। सर्वलेट कंटेनर और स्प्रिंग अनुप्रयोगों जैसे थ्रेड-पूल वातावरण में, थ्रेड को अनुरोधों में पुन:उपयोग किया जाता है और कभी भी समाप्त नहीं किया जाता है, जिसका अर्थ है ThreadLocal मान कभी भी स्वचालित रूप से नहीं हटाए जाते हैं. हमेशा FORMATTER.remove() पर कॉल करें ऑपरेशन पूरा होने के बाद, या फ़ॉर्मेटर इंस्टेंस थ्रेड के जीवनकाल तक बना रहेगा और निरंतर लोड के तहत मेमोरी लीक के रूप में जमा होता रहेगा।

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class ThreadSafeLegacyFormatter {
 // Each thread gets one dedicated formatter instance.
 private static final ThreadLocal<SimpleDateFormat> FORMATTER =
 ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US));
 public static String format(Date date) {
 try {
 // No cross-thread mutation because each thread reads its own formatter.
 return FORMATTER.get().format(date);
 } finally {
 // Remove the instance after use to prevent memory leaks in thread pools.
 FORMATTER.remove();
 }
 }
}

थ्रेड-सुरक्षित विकल्प के रूप में DateTimeFormatter पर स्विच करना

<पी> DateTimeFormatter अपरिवर्तनीय और थ्रेड-सुरक्षित है, इसलिए एक साझा स्थैतिक उदाहरण सुरक्षित है।

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Locale;
// Not thread-safe when shared across threads
SimpleDateFormat unsafe = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
System.out.println(unsafe.format(new Date()));
// Thread-safe: DateTimeFormatter is immutable and can be stored as a static field
DateTimeFormatter safe = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.US);
System.out.println(safe.format(LocalDateTime.now()));
2026-01-05 14:30:22
2026-01-05 14:30:22

SimpleDateFormat से DateTimeFormatter पर माइग्रेट करना

<पी> DateTimeFormatter में स्थानांतरण थ्रेड-सुरक्षा जोखिमों को हटाता है, ThreadLocal को समाप्त करता है वर्कअराउंड, और java.time के साथ स्पष्ट रूप से एकीकृत होता है प्रकार. अधिकांश कोडबेस के लिए माइग्रेशन यांत्रिक है:पैटर्न सिंटैक्स लगभग समान है, दो एपीआई वृद्धिशील रोलआउट के दौरान सह-अस्तित्व में हो सकते हैं, और आपको एक ही बार में सब कुछ परिवर्तित करने की आवश्यकता नहीं है। मुख्य जोखिम u है प्रतीक, जिसका अर्थ है SimpleDateFormat में सप्ताह का दिन और वर्ष DateTimeFormatter में; इसकी जांच किए बिना एपीआई के बीच सीधे कॉपी किए गए पैटर्न चुपचाप गलत आउटपुट देंगे।

साथ-साथ कोड तुलना

<पी> यह साइड-बाय-साइड स्निपेट विरासत और आधुनिक एपीआई में समतुल्य स्वरूपण और पार्सिंग व्यवहार दिखाता है।

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Locale;
String pattern = "yyyy-MM-dd";
String input = "2026-01-05";
// SimpleDateFormat (legacy java.util.Date API)
SimpleDateFormat legacyFormatter = new SimpleDateFormat(pattern, Locale.US);
Date legacyParsed = legacyFormatter.parse(input);
String legacyFormatted = legacyFormatter.format(new Date());
// DateTimeFormatter (modern java.time API)
DateTimeFormatter modernFormatter = DateTimeFormatter.ofPattern(pattern, Locale.US);
LocalDate modernParsed = LocalDate.parse(input, modernFormatter);
String modernFormatted = modernFormatter.format(LocalDate.now());
System.out.println(legacyParsed);
System.out.println(legacyFormatted);
System.out.println(modernParsed);
System.out.println(modernFormatted);
Mon Jan 05 00:00:00 UTC 2026
2026-01-05
2026-01-05
2026-01-05

दो एपीआई के बीच पैटर्न सिंटैक्स अंतर

<पी> अधिकांश पैटर्न अक्षर समान होते हैं, लेकिन कुछ प्रतीक भिन्न होते हैं और यदि सीधे कॉपी किए जाएं तो माइग्रेशन टूट सकता है।

कार्य SimpleDateFormat पैटर्न DateTimeFormatter पैटर्न नोट वर्षyyyy uuuu या yyyy uuuu को प्राथमिकता दें java.time में प्रोलेप्टिक वर्ष संगति के लिएटाइमज़ोन ऑफ़सेट/नामz , Z , X z , Z , x , X java.time अधिक ऑफसेट वेरिएंट (x) को अलग करता है और X )शाब्दिक पाठ'T' 'T' दोनों एपीआई शाब्दिकu के लिए सिंगल कोट्स का उपयोग करते हैं प्रतीक-सप्ताह का दिन संख्यावर्ष ज्ञात गोचा:u एपीआई के बीच अर्थ बदलता है

चरण-दर-चरण माइग्रेशन चेकलिस्ट

<पी> मौजूदा कोडबेस में एक समय में एक फ़ॉर्मेटर को परिवर्तित करने के लिए इस चेकलिस्ट का उपयोग करें।

  1. बदलें import java.text.SimpleDateFormat; import java.time.format.DateTimeFormatter; के साथ
  2. बदलें new SimpleDateFormat("yyyy-MM-dd") DateTimeFormatter.ofPattern("yyyy-MM-dd") के साथ
  3. बदलें .parse() LocalDate.parse() के साथ या LocalDateTime.parse() इनपुट परिशुद्धता
  4. के आधार पर
  5. बदलें .format(date) formatter.format(localDate) के साथ या formatter.format(localDateTime)
  6. निकालें new Date() जहां संभव हो और LocalDate.now() का उपयोग करें या Instant.now()
<पी> DateTimeFormatter विशेष रूप से java.time के साथ काम करता है प्रकार (LocalDate , LocalDateTime , ZonedDateTime , Instant ). यह java.util.Date को स्वीकार नहीं करता है सीधे. यदि आपके पास कोड है जो अभी भी java.util.Date उत्पन्न करता है मान, उदाहरण के लिए लीगेसी ORM या JDBC ड्राइवर से, पहले date.toInstant() के साथ कनवर्ट करें DateTimeFormatter पर जाने से पहले . वृद्धिशील माइग्रेशन के दौरान दो एपीआई एक ही कोडबेस में सह-अस्तित्व में रह सकते हैं; आपको एक ही बार में सब कुछ परिवर्तित करने की आवश्यकता नहीं है. DateTimeFormatter ParseException को भी प्रतिस्थापित करता है java.time.format.DateTimeParseException के साथ , जो एक अनियंत्रित अपवाद है, इसलिए ट्राई-कैच ब्लॉक वैकल्पिक हो जाते हैं लेकिन उत्पादन पार्सिंग कोड में अभी भी अनुशंसित हैं।

<पी> माइग्रेशन संदर्भ और प्रकार विकल्पों के लिए, जावा 8 दिनांक, लोकलडेट, लोकलडेटटाइम, इंस्टेंट देखें।

अक्सर पूछे जाने वाले प्रश्न

Java में SimpleDateFormat और DateFormat के बीच क्या अंतर है?

<पी> DateFormat एक अमूर्त वर्ग है जो दिनांक/समय स्वरूपण के लिए अनुबंध को परिभाषित करता है। SimpleDateFormat इसका ठोस उपवर्ग है जो कस्टम पैटर्न-आधारित स्वरूपण की अनुमति देता है। आप SimpleDateFormat का उपयोग करें सीधे कोड में; आप DateFormat का उपयोग करें जब आप किसी कार्यान्वयन को स्वीकार करना चाहते हैं तो संदर्भ प्रकार के रूप में।

क्या SimpleDateFormat थ्रेड-सुरक्षित है?

<पी> क्रमांक SimpleDateFormat उदाहरण थ्रेड-सुरक्षित नहीं हैं। सिंक्रनाइज़ेशन के बिना थ्रेड्स में एक ही उदाहरण साझा करने से अप्रत्याशित पार्स और प्रारूप परिणाम होते हैं। ThreadLocal<SimpleDateFormat> का प्रयोग करें या इसे java.time.format.DateTimeFormatter से बदलें , जो अपरिवर्तनीय और थ्रेड-सुरक्षित है।

मैं SimpleDateFormat का उपयोग करके dd-MM-yyyy प्रारूप में दिनांक स्ट्रिंग को कैसे पार्स कर सकता हूं?

<पी> SimpleDateFormat को त्वरित करें पैटर्न "dd-MM-yyyy" के साथ , फिर .parse(yourString) पर कॉल करें . ParseException के लिए कॉल को ट्राई-कैच ब्लॉक में लपेटें . सुनिश्चित करें कि इनपुट स्ट्रिंग विभाजक वर्णों सहित, पैटर्न से सटीक रूप से मेल खाती है।

मैं SimpleDateFormat का उपयोग करके किसी दिनांक को भिन्न समयक्षेत्र में कैसे परिवर्तित करूं?

<पी> .setTimeZone(TimeZone.getTimeZone("America/New_York")) पर कॉल करें आपके SimpleDateFormat पर .format(date) पर कॉल करने से पहले उदाहरण . अंतर्निहित Date ऑब्जेक्ट UTC मिलीसेकंड रखता है; फ़ॉर्मेटर आउटपुट के दौरान टाइमज़ोन ऑफसेट लागू करता है।

"yyyy-MM-dd'T'HH:mm:ssZ" पैटर्न क्या उत्पन्न करता है?

<पी> यह आईएसओ 8601-संगत टाइमस्टैम्प तैयार करता है, उदाहरण के लिए 2024-06-15T14:30:00+0530 . T सिंगल कोट्स में लिपटा हुआ एक शाब्दिक चरित्र है। Z RFC 822 टाइमज़ोन ऑफसेट का प्रतिनिधित्व करता है।

मैं SimpleDateFormat से DateTimeFormatter पर कैसे स्थानांतरित करूं?

<पी> new SimpleDateFormat("yyyy-MM-dd") बदलें DateTimeFormatter.ofPattern("yyyy-MM-dd") के साथ . .parse() बदलें LocalDate.parse() के साथ कॉल करता है या LocalDateTime.parse() . .format(date) बदलें formatter.format(localDate) के साथ कॉल करता है . ध्यान दें कि DateTimeFormatter u का उपयोग करता है y के बजाय कुछ संदर्भों में वर्ष के लिए .

SimpleDateFormat बिना किसी अपवाद के अमान्य दिनांक को पार्स क्यों करता है?

<पी> डिफ़ॉल्ट रूप से, SimpleDateFormat उदार पार्सिंग मोड का उपयोग करता है, जो सीमा से बाहर के मूल्यों को अस्वीकार करने के बजाय समायोजित करता है। .setLenient(false) पर कॉल करें सख्त सत्यापन लागू करने के लिए पार्सिंग से पहले और ParseException को फेंक दें अमान्य इनपुट पर.

मैं SimpleDateFormat का उपयोग करके किसी विशिष्ट स्थान के साथ दिनांक को कैसे प्रारूपित करूं?

<पी> Locale पास करें कंस्ट्रक्टर के लिए दूसरे तर्क के रूप में:new SimpleDateFormat("dd MMMM yyyy", Locale.FRENCH) . यह निर्दिष्ट भाषा में महीने और दिन के नाम प्रस्तुत करता है, जो कई क्षेत्रों में सेवा देने वाले अनुप्रयोगों के लिए महत्वपूर्ण है।

निष्कर्ष

<पी> इस गाइड में DateFormat को शामिल किया गया है और SimpleDateFormat बुनियादी बातें, पैटर्न सिंटैक्स, फ़ॉर्मेटिंग और पार्सिंग वर्कफ़्लो, टाइमज़ोन व्यवहार, स्थानीय-जागरूक रेंडरिंग, थ्रेड सुरक्षा मुद्दे और DateTimeFormatter पर माइग्रेशन .

<पी> अब आप विरासत और आधुनिक कोड के लिए सही फ़ॉर्मेटर चुन सकते हैं, सख्त सत्यापन के साथ रक्षात्मक रूप से इनपुट को पार्स कर सकते हैं, सर्वर वातावरण में स्थानीय और समयक्षेत्र बहाव से बच सकते हैं, और साझा दिनांक फ़ॉर्मेटर्स से समवर्ती जोखिमों को हटा सकते हैं।

<पी> अगले चरणों के लिए, जावा 8 दिनांक, लोकलडेट, लोकलडेटटाइम, इंस्टेंट, उदाहरणों के साथ जावा 8 सुविधाओं, जावा में अपवाद हैंडलिंग, और जावा अनुप्रयोगों में दिनांक/समय प्रबंधन को आधुनिक बनाने के लिए जावा दिनांक को विशिष्ट टाइमज़ोन प्रारूप में कैसे परिवर्तित करें, की समीक्षा करें।

<पी> संदर्भ:
  • SimpleDateFormat API दस्तावेज़
  • DateFormat API Doc
  • DateTimeFormatter API दस्तावेज़
<पी> मास्टर जावा दिनांक फ़ॉर्मेटिंग:SimpleDateFormat और DateFormat की व्याख्या यह कार्य क्रिएटिव कॉमन्स एट्रिब्यूशन-नॉन-कमर्शियल- के तहत लाइसेंस प्राप्त है शेयरअलाइक 4.0 अंतर्राष्ट्रीय लाइसेंस।
  1. Matplotlib में X-अक्ष लेबल के लिए स्थान बढ़ाना Matplotlib में X-अक्ष लेबल के लिए स्थान बढ़ाना

    Matplotlib में X-अक्ष लेबल के लिए स्थान बढ़ाने के लिए, हम subplots_adjust() में रिक्ति चर का उपयोग कर सकते हैं विधि का तर्क। कदम फिगर साइज सेट करें और सबप्लॉट्स के बीच और आसपास पैडिंग को एडजस्ट करें। figure() . का उपयोग करके एक नया आंकड़ा बनाएं या मौजूदा आंकड़ा सक्रिय करें विधि। numpy का उप

  1. एंड्रॉइड में मोबाइल सपोर्ट एसएमएस या नहीं के बारे में जानकारी कैसे प्राप्त करें? एंड्रॉइड में मोबाइल सपोर्ट एसएमएस या नहीं के बारे में जानकारी कैसे प्राप्त करें?

    यह उदाहरण इस बारे में प्रदर्शित करता है कि एंड्रॉइड में मोबाइल समर्थन एसएमएस के बारे में जानकारी कैसे प्राप्त करें या नहीं। चरण 1 - एंड्रॉइड स्टूडियो में एक नया प्रोजेक्ट बनाएं, फाइल ⇒ न्यू प्रोजेक्ट पर जाएं और एक नया प्रोजेक्ट बनाने के लिए सभी आवश्यक विवरण भरें। चरण 2 - निम्न कोड को res/layout/

  1. लिंक्ड सूची के अंतिम k नोड्स को C भाषा में रिवर्स ऑर्डर रिकर्सिव अप्रोच में प्रिंट करें लिंक्ड सूची के अंतिम k नोड्स को C भाषा में रिवर्स ऑर्डर रिकर्सिव अप्रोच में प्रिंट करें

    कार्य रिकर्सिव दृष्टिकोण का उपयोग करके लिंक की गई सूची के अंत से शुरू होने वाले k नोड्स को प्रिंट करना है। पुनरावर्ती दृष्टिकोण वह है जिसमें फ़ंक्शन कॉल किए जाने तक बार-बार कॉल करता है और इसलिए परिणाम संग्रहीत करता है। मान लीजिए, सूची में 29, 34, 43, 56 और 88 नोड हैं और k का मान 2 है, जो आउटपुट से