Parse String to Date in Java अलग प्रारूप के साथ


91

मैं परिवर्तित करना चाहते Stringकरने के लिए Dateविभिन्न स्वरूपों में।

उदाहरण के लिए,

मुझे उपयोगकर्ता से मिल रहा है,

String fromDate = "19/05/2009"; // i.e. (dd/MM/yyyy) format

मैं इसे प्रारूप fromDateकी दिनांक वस्तु के रूप में परिवर्तित करना चाहता हूं"yyyy-MM-dd"

मैं यह कैसे कर सकता हूँ?


2
किसी दिनांक ऑब्जेक्ट का कोई स्वरूप नहीं है, यह केवल दिनांक का प्रतिनिधित्व करने वाली संख्या है। तारीख का प्रतिनिधित्व एक स्ट्रिंग द्वारा "yyyy-MM-dd" के प्रारूप के साथ किया जा सकता है।
user85421

जवाबों:


181

देख लेना SimpleDateFormat। कोड कुछ इस प्रकार है:

SimpleDateFormat fromUser = new SimpleDateFormat("dd/MM/yyyy");
SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd");

try {

    String reformattedStr = myFormat.format(fromUser.parse(inputString));
} catch (ParseException e) {
    e.printStackTrace();
}

1
स्ट्रिंग प्रारूप प्राप्त करने के बजाय, क्या मैं Dateप्रारूप में आउटपुट प्राप्त कर सकता हूं ?
राहेल

4
@ राचेल: यकीन है, बस का उपयोग करें parseऔर पर मत जाओ formatparseएक तारीख को एक स्ट्रिंग पार्स।
माइकल मायर्स

3
लेकिन parseमुझे इस date formatरूप में देता है, Fri Jan 06 00:01:00 EST 2012लेकिन यह 2012-01-06दिनांक प्रारूप में आवश्यक है
राहेल

1
@Rachel ऐसा इसलिए है क्योंकि जब आप System.out.println(anyDateObject)डिफॉल्ट toString () विधि को कॉल करते हैं, जिसे उस प्रारूप में प्रिंट करने के लिए कहा गया है Fri Jan 06 00:01:00 EST 2012। आपको अपनी आवश्यकताओं के अनुरूप इसे ओवरराइड करने की आवश्यकता है।
KNU

3
FYI करें, जैसे परेशानी पुराने तिथि-समय कक्षाएं java.util.Date, java.util.Calendarऔर java.text.SimpleDateFormatअब कर रहे हैं विरासत , द्वारा का स्थान ले लिया java.time जावा 8 और जावा 9. देखें में बनाया गया वर्गों ट्यूटोरियल ओरेकल द्वारा
बेसिल बोर्के

13

tl; डॉ

LocalDate.parse( 
    "19/05/2009" , 
    DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) 
)

विवरण

के साथ अन्य जवाब java.util.Date, java.sql.Dateहै, और SimpleDateFormatअब पुराने हो गए हैं।

LocalDate

विशेष रूप से तिथि-समय करने का आधुनिक तरीका java.time कक्षाओं के साथ काम करना है LocalDateLocalDateवर्ग समय के दिन और समय क्षेत्र के बिना बिना एक दिनांक-केवल मूल्य का प्रतिनिधित्व करता।

DateTimeFormatter

पार्स करने के लिए, या उत्पन्न करने के लिए, एक स्ट्रिंग जो दिनांक-समय मान का प्रतिनिधित्व करता है, DateTimeFormatterकक्षा का उपयोग करें ।

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" );
LocalDate ld = LocalDate.parse( "19/05/2009" , f );

एक स्ट्रिंग के साथ दिनांक-समय ऑब्जेक्ट को उसके मूल्य का प्रतिनिधित्व करने के लिए भ्रमित न करें। एक तिथि-समय ऑब्जेक्ट का कोई प्रारूप नहीं है , जबकि एक स्ट्रिंग करता है। एक दिनांक-समय ऑब्जेक्ट, जैसे LocalDate, अपने आंतरिक मान का प्रतिनिधित्व करने के लिए एक स्ट्रिंग उत्पन्न कर सकता है , लेकिन दिनांक-समय ऑब्जेक्ट और स्ट्रिंग अलग-अलग ऑब्जेक्ट हैं।

स्ट्रिंग उत्पन्न करने के लिए आप कोई भी कस्टम प्रारूप निर्दिष्ट कर सकते हैं। या java.time को स्वचालित रूप से स्थानीयकरण का कार्य करने दें।

DateTimeFormatter f = 
    DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL )
                     .withLocale( Locale.CANADA_FRENCH ) ;
String output = ld.format( f );

सांत्वना देना।

System.out.println( "ld: " + ld + " | output: " + output );

ld: 2009-05-19 | आउटपुट: मार्डी १ ९ माई २०० ९

IdeOne.com में कार्रवाई देखें


जावा के बारे में

Java.time ढांचे जावा 8 और बाद में बनाया गया है। इन कक्षाओं परेशानी वर्ष प्रतिस्थापित विरासत जैसे तिथि-समय कक्षाएं java.util.Date, Calendar, और SimpleDateFormat

Joda समय परियोजना, अब में रखरखाव मोड , प्रवास करने की सलाह देता java.time कक्षाएं।

अधिक जानने के लिए, Oracle ट्यूटोरियल देखें । और कई उदाहरणों और स्पष्टीकरणों के लिए ढेर अतिप्रवाह खोजें। विशिष्टता JSR 310 है

आप अपने डेटाबेस से सीधे java.time वस्तुओं का आदान-प्रदान कर सकते हैं । JDBC 4.2 या उसके बाद के JDBC ड्राइवर का अनुपालन करें । तार की कोई जरूरत नहीं, कक्षाओं की कोई जरूरत नहीं ।java.sql.*

Java.time कक्षाएं कहाँ से प्राप्त करें?

ThreeTen-अतिरिक्त परियोजना अतिरिक्त कक्षाओं के साथ java.time फैली हुई है। यह परियोजना java.time के संभावित भविष्य के अतिरिक्त के लिए एक साबित जमीन है। आप यहाँ कुछ उपयोगी वर्गों जैसे मिल सकता है Interval, YearWeek, YearQuarter, और अधिक


12

SimpleDateFormatकक्षा का उपयोग करें :

private Date parseDate(String date, String format) throws ParseException
{
    SimpleDateFormat formatter = new SimpleDateFormat(format);
    return formatter.parse(date);
}

उपयोग:

Date date = parseDate("19/05/2009", "dd/MM/yyyy");

दक्षता के लिए, आप अपने फ़ॉर्मेटर्स को हैशमैप में संग्रहीत करना चाहेंगे। हैशमैप आपके उपयोग वर्ग का एक स्थिर सदस्य है।

private static Map<String, SimpleDateFormat> hashFormatters = new HashMap<String, SimpleDateFormat>();

public static Date parseDate(String date, String format) throws ParseException
{
    SimpleDateFormat formatter = hashFormatters.get(format);

    if (formatter == null)
    {
        formatter = new SimpleDateFormat(format);
        hashFormatters.put(format, formatter);
    }

    return formatter.parse(date);
}

9
चेतावनी!! विचार अच्छा है, लेकिन कार्यान्वयन नहीं है। DateFormats को सांख्यिकीय रूप से संग्रहीत नहीं किया जाना चाहिए, क्योंकि वे थ्रेड-सुरक्षित नहीं हैं! यदि उनका उपयोग एक से अधिक धागे से किया जाता है (और यह स्टैटिक्स के साथ हमेशा जोखिम भरा होता है)। फाइंडबग्स में इसके लिए एक डिटेक्टर होता है (जो कि मुझे काटने के बाद शुरू में योगदान करने के लिए हुआ था। देखें dschneller.blogspot.com/2007/04/… :-))
डैनियल

आपका ब्लॉग प्रविष्टि एक दिलचस्प पढ़ा है :-) क्या होगा अगर parseDate-method खुद को मैंने सिंक्रनाइज़ किया है? हालांकि समस्या यह है कि यह शायद कोड को धीमा कर देगा ...
अगोरा

1
जब तक पार्सडेट विधि केवल मानचित्र तक पहुंचने का एकमात्र तरीका था, तब तक इसे सिंक्रनाइज़ करना काम करेगा। हालाँकि, यह - जैसा कि आप कहते हैं - एक अड़चन पेश करें।
डैनियल श्नाइलर

8

एक स्ट्रिंग दिनांक को java.sql.Date में बदलें

String fromDate = "19/05/2009";
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
java.util.Date dtt = df.parse(fromDate);
java.sql.Date ds = new java.sql.Date(dtt.getTime());
System.out.println(ds);//Mon Jul 05 00:00:00 IST 2010


3

जबकि SimpleDateFormatवास्तव में आपकी आवश्यकताओं के लिए काम करेंगे, इसके अतिरिक्त आप जोडा टाइम की जांच करना चाहते हैं , जो जाहिरा तौर पर जावा 7 में रीडोन डेट लाइब्रेरी के लिए आधार है। जबकि मैंने इसका बहुत उपयोग नहीं किया है, लेकिन मैंने अच्छी चीजों के अलावा कुछ भी नहीं सुना है। इसके बारे में और अगर आपकी परियोजनाओं में बड़े पैमाने पर हेरफेर हो रही है तो शायद यह देखने लायक होगा।


1

दिनांक को प्रारूपित करने और स्ट्रिंग में परिवर्तित करने का सरल तरीका

    Date date= new Date();

    String dateStr=String.format("%td/%tm/%tY", date,date,date);

    System.out.println("Date with format of dd/mm/dd: "+dateStr);

आउटपुट: dd / mm / dd के प्रारूप के साथ दिनांक: २१/१०/२०१५


1

किसी Dateऑब्जेक्ट का कोई प्रारूप नहीं है , यह एक प्रतिनिधित्व है। दिनांक को आपके द्वारा पसंद किए जाने Stringवाले प्रारूप के साथ प्रस्तुत किया जा सकता है ।

जैसे " yyyy-MM-dd", " yy-MMM-dd", " dd-MMM-yy" और आदि।

इसे हासिल करने के लिए आप इसका उपयोग कर सकते हैं SimpleDateFormat

इसे इस्तेमाल करे,

        String inputString = "19/05/2009"; // i.e. (dd/MM/yyyy) format

        SimpleDateFormat fromUser = new SimpleDateFormat("dd/MM/yyyy"); 
        SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd");

        try {
            Date dateFromUser = fromUser.parse(inputString); // Parse it to the exisitng date pattern and return Date type
            String dateMyFormat = myFormat.format(dateFromUser); // format it to the date pattern you prefer
            System.out.println(dateMyFormat); // outputs : 2009-05-19

        } catch (ParseException e) {
            e.printStackTrace();
        }

यह आउटपुट: 2009-05-19


1

मान लीजिए कि आपके पास इस तरह से एक स्ट्रिंग है:

String mDate="2019-09-17T10:56:07.827088"

अब हम इस Stringप्रारूप को जावा और कोटलिन में अलग-अलग तारीख और समय में बदलना चाहते हैं ।

जावा:

हमारे पास निकालने की तारीख के लिए एक विधि है :

public String getDate() {
    try {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US);
        Date date = dateFormat.parse(mDate);
        dateFormat = new SimpleDateFormat("MM/dd/yyyy", Locale.US);
        return dateFormat.format(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return null;
}

Return यह है: 09/17/2019

और हमारे पास निकालने का समय है :

public String getTime() {

    try {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US);
        Date date = dateFormat.parse(mCreatedAt);
        dateFormat = new SimpleDateFormat("h:mm a", Locale.US);
        return dateFormat.format(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return null;
}

Returnयह है: 10:56 पूर्वाह्न

KOTLIN:

हमारे पास निकालने की तारीख के लिए एक समारोह है :

fun getDate(): String? {

    var dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US)
    val date = dateFormat.parse(mDate!!)
    dateFormat = SimpleDateFormat("MM/dd/yyyy", Locale.US)
    return dateFormat.format(date!!)
}

Return यह है: 09/17/2019

और हमारे पास निकालने का समय है :

fun getTime(): String {

    var dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US)
    val time = dateFormat.parse(mDate!!)
    dateFormat = SimpleDateFormat("h:mm a", Locale.US)
    return dateFormat.format(time!!)
}

Returnयह है: 10:56 पूर्वाह्न


कृपया लंबे पुराने और कुख्यात परेशान करने वाले SimpleDateFormatवर्ग का उपयोग करने के लिए युवाओं को न सिखाएं । कम से कम पहले विकल्प के रूप में नहीं। और बिना किसी आरक्षण के नहीं। आज हमारे पास java.timeआधुनिक जावा तिथि और समय एपीआई और इसके बहुत बेहतर हैं DateTimeFormatter। इसके अलावा SimpleDateFormatसेकंड (microseconds) पर 6 दशमलव को सही ढंग से पार्स नहीं कर सकते।
ओले वीवी

जब मैं आपका दूसरा स्निपेट चलाता हूं, तो मुझे 10:56 AMवैसा नहीं मिलता जैसा आप कहते हैं कि मुझे चाहिए, बल्कि इसके बजाय 11:09 AM(Oracle jdk-11.0.3 पर परीक्षण किया गया)।
ओले वीवी

@ OleV.V। , यदि एक विधि लंबे समय तक पुरानी हो, तो यह एक संकेत के रूप में उस पर एक रेखा के साथ पदावनत हो जाएगा, अगर कोई विधि या वर्ग नहीं निकाला जाता है तो हम इसका उपयोग कर सकते हैं, मैं नहीं कहता कि यह सबसे अच्छा तरीका है, शायद हमारे पास एक बेहतर तरीका है लेकिन इस तरह से सरल और समझने योग्य है, यदि कोई तरीका या वर्ग पुराना था, तो कोई कारण नहीं है कि यह परेशानी भरा है और इसके उपयोग के DateTimeFormatterलिए minsdk 26या उससे अधिक की आवश्यकता है तो इसकी अच्छी बात नहीं है
दूध सलाद

@ OleV.V। लेकिन आपकी टिप्पणी के लिए धन्यवाद और आपकी दूसरी टिप्पणी के बारे में मैं कह सकता हूं कि मैं इसे कई बार दो ऐपेटॉन में जांचता हूं और यह वापस लौटता है10:56 AM
दूध सलाद

1
@ OleV.V। , ठीक है, लेकिन मैं एक पुस्तकालय का उपयोग करता हूं जब मेरे पास कोई रास्ता नहीं होता है या वह एपीआई (पुस्तकालय) मेरे कोड से बहुत बेहतर होता है, क्योंकि जब आप एक पुस्तकालय जोड़ते हैं तो आप अपनी परियोजना में कुछ कोड जोड़ते हैं जो उपयोग नहीं किया जा सकता है और यह आपके लिए अधिभार है परियोजना, यह मेरा दृष्टिकोण है और आपका दृष्टिकोण मेरे लिए सम्मानजनक है।
दूध सलाद
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.