जावा स्ट्रिंग में दिनांक स्वरूप बदलें


465

मैंने Stringएक तिथि का प्रतिनिधित्व किया है ।

String date_s = "2011-01-18 00:00:00.0";

मैं इसे एक में बदलना चाहता हूं Dateऔर इसे YYYY-MM-DDप्रारूप में आउटपुट करता हूं ।

2011-01-18

इसे कैसे प्राप्त किया जा सकता है?


ठीक है, नीचे दिए गए उत्तरों के आधार पर, मैंने यहाँ कुछ कोशिश की है:

String date_s = " 2011-01-18 00:00:00.0"; 
SimpleDateFormat dt = new SimpleDateFormat("yyyyy-mm-dd hh:mm:ss"); 
Date date = dt.parse(date_s); 
SimpleDateFormat dt1 = new SimpleDateFormat("yyyyy-mm-dd");
System.out.println(dt1.format(date));

लेकिन यह 02011-00-1वांछित के बजाय आउटपुट देता है 2011-01-18। मैं क्या गलत कर रहा हूं?


163
yyyyy yyyy के समान नहीं है। :)
इल

2
एक बूमरैंग सवाल। आपका उपयोग मामला क्या है? क्योंकि यह संभव है कि आपको अंतर्निहित पैटर्न (DateFormat.getDateTimeInstance ()) का उपयोग करना चाहिए।
पावेल डिडा

11
महीने को प्रारूप स्ट्रिंग में एमएम के साथ दर्शाया गया है, ऊपर के उदाहरणों की तरह मिमी के साथ नहीं। मिमी का मतलब है मिनट।
माइक

3
मैंने yyyy-mm-dd को yyyy-MM-dd में बदल दिया, क्योंकि प्रारंभिक संस्करण काम नहीं करता था
Pavlo Zvarych

जवाबों:


506

एक निश्चित पैटर्न में a को पार्स करने के लिए LocalDateTime#parse()(या ZonedDateTime#parse()यदि टाइम टाइम ज़ोन का हिस्सा होने के लिए स्ट्रिंग होता है) का उपयोग करें ।StringLocalDateTime

String oldstring = "2011-01-18 00:00:00.0";
LocalDateTime datetime = LocalDateTime.parse(oldstring, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S"));

एक निश्चित पैटर्न में एक में प्रारूप करने के लिए LocalDateTime#format()(या ZonedDateTime#format()) का उपयोग करें ।LocalDateTimeString

String newstring = datetime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
System.out.println(newstring); // 2011-01-18

या , जब आप जावा 8 पर अभी तक नहीं हैं, तो एक निश्चित पैटर्न में ए SimpleDateFormat#parse()को पार्स करने के लिए उपयोग करें ।StringDate

String oldstring = "2011-01-18 00:00:00.0";
Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S").parse(oldstring);

एक निश्चित पैटर्न में एक में SimpleDateFormat#format()प्रारूप करने के लिए उपयोग करें ।DateString

String newstring = new SimpleDateFormat("yyyy-MM-dd").format(date);
System.out.println(newstring); // 2011-01-18

यह सभी देखें:


अपडेट : आपके असफल प्रयास के अनुसार: पैटर्न केस सेंसिटिव हैं । क्या व्यक्तिगत भागों के लिए खड़ा है java.text.SimpleDateFormatjavadoc पढ़ें । इसलिए Mमहीनों और mमिनटों के लिए उदाहरण के लिए खड़ा है । इसके अलावा, साल चार अंकों के होते हैं yyyy, पाँच नहीं yyyyy। कोड स्निपेट देखें जो मैंने यहां ऊपर पोस्ट किए हैं।


यदि आप चाहते हैं कि तारीख "सोमवार 1 सितंबर 2012" की तरह दिखे?
crmepham

11
@crm: बस javadoc लिंक पर क्लिक करें, वहां आवश्यक पैटर्न वर्णों को समझें और तदनुसार पैटर्न को बदल दें।
BalusC

जब आप अभी तक जावा 8 पर नहीं हैं, तो बैकपोर्ट, थ्रीटेन बैकपोर्ट का उपयोग करने पर विचार करें , और फिर उत्तर से पहले उदाहरण देखें। या एपीआई स्तर 26 के नीचे एंड्रॉइड के लिए, थ्रीटेनबप
ओले वीवी

157

फ़ॉर्मेटिंग CASE-SENSITIVE है इसलिए USE MM महीने के लिए नहीं मिमी (यह मिनट के लिए है) और yyyy संदर्भ के लिए आप निम्नलिखित cheatsheet का उपयोग कर सकते हैं।

G   Era designator  Text    AD
y   Year    Year    1996; 96
Y   Week year   Year    2009; 09
M   Month in year   Month   July; Jul; 07
w   Week in year    Number  27
W   Week in month   Number  2
D   Day in year Number  189
d   Day in month    Number  10
F   Day of week in month    Number  2
E   Day name in week    Text    Tuesday; Tue
u   Day number of week (1 = Monday, ..., 7 = Sunday)    Number  1
a   Am/pm marker    Text    PM
H   Hour in day (0-23)  Number  0
k   Hour in day (1-24)  Number  24
K   Hour in am/pm (0-11)    Number  0
h   Hour in am/pm (1-12)    Number  12
m   Minute in hour  Number  30
s   Second in minute    Number  55
S   Millisecond Number  978
z   Time zone   General time zone   Pacific Standard Time; PST; GMT-08:00
Z   Time zone   RFC 822 time zone   -0800
X   Time zone   ISO 8601 time zone  -08; -0800; -08:00

उदाहरण:

"yyyy.MM.dd G 'at' HH:mm:ss z"  2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy"  Wed, Jul 4, '01
"h:mm a"    12:08 PM
"hh 'o''clock' a, zzzz" 12 o'clock PM, Pacific Daylight Time
"K:mm a, z" 0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa"  02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z"    Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ" 010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"   2001-07-04T12:08:56.235-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSXXX"   2001-07-04T12:08:56.235-07:00
"YYYY-'W'ww-u"  2001-W27-3

1
"yyyy-MM-dd'T'HH: mm: ss.SSSZ" होना चाहिए "yyyy-MM-dd'T'HH: mm: ss.SSS'Z '"
एक उचित

2
नहीं, यदि आप एकल उद्धरण में Z डालते हैं तो यह Z को आउटपुट के रूप में देगा लेकिन इसके बिना यह Timezone देगा। जैसे। 2014-08-14T01: 24: 57.236Z और इसके बिना 2014-08-14T01: 24: 57.236-0530 -> मैंने jdk1.7 पर कोशिश की
देव

1
"yyyyy.MMMMM.dd GGG hh: mm aaa" 02001.July.04 AD 12:08 PM महीने में अतिरिक्त एम नोट करें। चार नहीं पाँच!
स्टेफानो माटांगू

यदि यह 4 अक्षर या अधिक है, तो पूर्ण रूप का उपयोग किया जाता है। तो आप 4 गुना m या 5 बार m उसी का उपयोग कर सकते हैं
देव

यह डॉक्स का कॉपी-पेस्ट बहुत ज्यादा है। कोई अतिरिक्त स्पष्टीकरण नहीं दिया जा रहा है, और डॉक्स के लिए कोई लिंक नहीं है जहां जरूरत पड़ने पर अधिक जानकारी हासिल की जा सकती है। -1। ( यहां लिंक btw है )
XenoRo

108

इसका जवाब बेशक एक SimpleDateFormat ऑब्जेक्ट बनाना और स्ट्रिंग्स को दिनांक के लिए पार्स करना और डेट्स टू स्ट्रिंग्स को प्रारूपित करना है। यदि आपने SimpleDateFormat की कोशिश की है और यह काम नहीं किया है, तो कृपया अपना कोड और कोई भी त्रुटि प्राप्त करें।

परिशिष्ट: "मिमी" प्रारूप में स्ट्रिंग "एमएम" के समान नहीं है। महीनों के लिए MM और मिनटों के लिए मिमी का उपयोग करें। इसके अलावा, yyyyy yyyy के समान नहीं है। जैसे ,:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class FormateDate {

    public static void main(String[] args) throws ParseException {
        String date_s = "2011-01-18 00:00:00.0";

        // *** note that it's "yyyy-MM-dd hh:mm:ss" not "yyyy-mm-dd hh:mm:ss"  
        SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        Date date = dt.parse(date_s);

        // *** same for the format String below
        SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println(dt1.format(date));
    }

}

आयात java.text.ParseException; आयात java.text.SimpleDateFormat; आयात java.util.Date; सार्वजनिक वर्ग फ़ॉर्मेटडेट {/ ** * @param args * @throws ParseException * / सार्वजनिक स्थैतिक शून्य मुख्य (स्ट्रिंग [] args) ParseException को फेंकता है {// TODO ऑटो-जनरेटेड विधि stub String_s = "2011-01-18 00:00 : 00.0 "; SimpleDateFormat dt = new SimpleDateFormat ("yyyyy-mm-dd hh: mm: ss"); तारीख तारीख = dt.parse (date_s); SimpleDateFormat dt1 = new SimpleDateFormat ("yyyyy-mm-dd"); System.out.println (dt1.format (date)); }} मैं चाहता हूं कि पुट "2011-01-18" होना चाहिए, लेकिन आउट पुट 02011-00-1 है
amit4444

आपके पास मूल प्रश्न (इंडेंट फोर स्पेस) के अतिरिक्त किसी भी कोड को पोस्ट करें। इस तरह यह अपने प्रारूपण को बनाए रखेगा और हम इसे पढ़ सकते हैं।
ईल का पूरा होवरक्राफ्ट

1
ऊपर मेरे जवाब के लिए संपादित देखें। आप अपने प्रारूप में "मिमी" का उपयोग कर रहे हैं स्ट्रिंग जहां आप "एमएम" का उपयोग कर रहे होंगे
ईल का पूरा होवरकैन

hhआपको 1-12 की सीमा में घंटा देगा, आपको aप्रिंट / पार्स AMया के अलावा उपयोग करने की आवश्यकता होगी PM। 0-23 की रेंज में घंटे को प्रिंट / पार्स करने के लिए, उपयोग करें HH
आंद्रे होल्ज़नर

22

क्यों नहीं बस इस का उपयोग करें

Date convertToDate(String receivedDate) throws ParseException{
        SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
        Date date = formatter.parse(receivedDate);
        return date;
    }

इसके अलावा, यह दूसरा तरीका है:

DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
String requiredDate = df.format(new Date()).toString();

या

Date requiredDate = df.format(new Date());

चीयर्स!


2
इसका उपयोग क्यों नहीं करते? क्योंकि (ए) यह समय क्षेत्र के मुद्दे की अनदेखी करता है। तिथि का निर्धारण समय क्षेत्र पर निर्भर करता है। यह कोड JVM के डिफ़ॉल्ट समय क्षेत्र पर निर्भर करता है। इसलिए, परिणाम अनजाने में भिन्न हो सकते हैं। और (बी) क्योंकि java.util.Date और SimpleDateFormat कक्षाएं कुख्यात परेशान हैं और इससे बचा जाना चाहिए।
बेसिल बोर्क

2
हमेशा वापस लौटें, दिनांक आवश्यक = df.format (नई तिथि ());
delive

15

java.timeजावा 8 और बाद में पैकेज का उपयोग करना :

String date = "2011-01-18 00:00:00.0";
TemporalAccessor temporal = DateTimeFormatter
    .ofPattern("yyyy-MM-dd HH:mm:ss.S")
    .parse(date); // use parse(date, LocalDateTime::from) to get LocalDateTime
String output = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(temporal);

9

[BalusC के सुधार को शामिल करने के लिए संपादित किया गया] SimpleDateFormat वर्ग को यह करना चाहिए:

String pattern = "yyyy-MM-dd HH:mm:ss.S";
SimpleDateFormat format = new SimpleDateFormat(pattern);
try {
  Date date = format.parse("2011-01-18 00:00:00.0");
  System.out.println(date);
} catch (ParseException e) {
  e.printStackTrace();
}

DD"वर्ष में दिन" के लिए खड़ा है, "महीने में दिन" नहीं। hh"घंटे में सुबह / दोपहर (1-12)" के लिए खड़ा है, "दिन में घंटे (0-23)" नहीं।
बालुसक

9

अन्य उत्तर सही हैं, मूल रूप से आपके पैटर्न में "y" वर्णों की गलत संख्या थी।

समय क्षेत्र

हालांकि एक और समस्या ... आपने समय क्षेत्र को संबोधित नहीं किया। यदि आपने यूटीसी का इरादा किया है , तो आपको ऐसा कहना चाहिए था। यदि नहीं, तो उत्तर पूर्ण नहीं हैं। यदि आप चाहते हैं कि समय के बिना तारीख का हिस्सा है, तो कोई मुद्दा नहीं है। लेकिन अगर आप आगे का काम करते हैं जिसमें समय शामिल हो सकता है, तो आपको एक समय क्षेत्र निर्दिष्ट करना चाहिए।

Joda समय

यहाँ एक ही तरह का कोड है, लेकिन थर्ड-पार्टी ओपन-सोर्स Joda-Time 2.3 लाइब्रेरी का उपयोग करना

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.

String date_s = "2011-01-18 00:00:00.0";

org.joda.time.format.DateTimeFormatter formatter = org.joda.time.format.DateTimeFormat.forPattern( "yyyy-MM-dd' 'HH:mm:ss.SSS" );
// By the way, if your date-time string conformed strictly to ISO 8601 including a 'T' rather than a SPACE ' ', you could
// use a formatter built into Joda-Time rather than specify your own: ISODateTimeFormat.dateHourMinuteSecondFraction().
// Like this:
//org.joda.time.DateTime dateTimeInUTC = org.joda.time.format.ISODateTimeFormat.dateHourMinuteSecondFraction().withZoneUTC().parseDateTime( date_s );

// Assuming the date-time string was meant to be in UTC (no time zone offset).
org.joda.time.DateTime dateTimeInUTC = formatter.withZoneUTC().parseDateTime( date_s );
System.out.println( "dateTimeInUTC: " + dateTimeInUTC );
System.out.println( "dateTimeInUTC (date only): " + org.joda.time.format.ISODateTimeFormat.date().print( dateTimeInUTC ) );
System.out.println( "" ); // blank line.

// Assuming the date-time string was meant to be in Kolkata time zone (formerly known as Calcutta). Offset is +5:30 from UTC (note the half-hour).
org.joda.time.DateTimeZone kolkataTimeZone = org.joda.time.DateTimeZone.forID( "Asia/Kolkata" );
org.joda.time.DateTime dateTimeInKolkata = formatter.withZone( kolkataTimeZone ).parseDateTime( date_s );
System.out.println( "dateTimeInKolkata: " + dateTimeInKolkata );
System.out.println( "dateTimeInKolkata (date only): " + org.joda.time.format.ISODateTimeFormat.date().print( dateTimeInKolkata ) );
// This date-time in Kolkata is a different point in the time line of the Universe than the dateTimeInUTC instance created above. The date is even different.
System.out.println( "dateTimeInKolkata adjusted to UTC: " + dateTimeInKolkata.toDateTime( org.joda.time.DateTimeZone.UTC ) );

जब चला…

dateTimeInUTC: 2011-01-18T00:00:00.000Z
dateTimeInUTC (date only): 2011-01-18

dateTimeInKolkata: 2011-01-18T00:00:00.000+05:30
dateTimeInKolkata (date only): 2011-01-18
dateTimeInKolkata adjusted to UTC: 2011-01-17T18:30:00.000Z

9

कृपया यहां "दिनांक और समय पैटर्न" देखें। http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

import java.text.SimpleDateFormat;
import java.util.Date;
import java.text.ParseException;

public class DateConversionExample{

  public static void main(String arg[]){

    try{

    SimpleDateFormat sourceDateFormat = new SimpleDateFormat("yyyy-MM-DD HH:mm:ss");

    Date date = sourceDateFormat.parse("2011-01-18 00:00:00.0");


    SimpleDateFormat targetDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    System.out.println(targetDateFormat.format(date));

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

}

8
try
 {
    String date_s = "2011-01-18 00:00:00.0";
    SimpleDateFormat simpledateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
    Date tempDate=simpledateformat.parse(date_s);
    SimpleDateFormat outputDateFormat = new SimpleDateFormat("yyyy-MM-dd");           
    System.out.println("Output date is = "+outputDateFormat.format(tempDate));
  } catch (ParseException ex) 
  {
        System.out.println("Parse Exception");
  }

7
public class SystemDateTest {

    String stringDate;

    public static void main(String[] args) {
        SystemDateTest systemDateTest = new SystemDateTest();
        // format date into String
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
        systemDateTest.setStringDate(simpleDateFormat.format(systemDateTest.getDate()));
        System.out.println(systemDateTest.getStringDate());
    }

    public Date getDate() {
        return new Date();
    }

    public String getStringDate() {
        return stringDate;
    }

    public void setStringDate(String stringDate) {
        this.stringDate = stringDate;
    }
}

3
अपना कोड समझाने के लिए कृपया अपने उत्तर में कुछ जानकारी जोड़ें।
कुरसाद गुलेवेन

एक विधि का नाम getDate () है जिसके द्वारा u साधारण तिथि लागू कर सकते हैं उसके बाद SimpleDateFormat लागू करें ताकि आप अपने प्रारूप के अनुसार दिनांक को परिवर्तित कर सकें जो कि SimpleDateFormat कंस्ट्रक्टर में परिभाषित है और StringDate में सेट है जिसे आप इसे कैश कर सकते हैं
नीरज गहलावत

6
   String str = "2000-12-12";
   Date dt = null;
   SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

    try 
    {
         dt = formatter.parse(str);
    }
    catch (Exception e)
    {
    }

    JOptionPane.showMessageDialog(null, formatter.format(dt));

6

आप बस उपयोग कर सकते हैं:

Date yourDate = new Date();

SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
String date = DATE_FORMAT.format(yourDate);

यह पूरी तरह से काम करता है!


5

आप प्रतिस्थापन () का भी उपयोग कर सकते हैं

String date_s = "2011-01-18 00:00:00.0";
date_s.substring(0,10);

यदि आप तिथि के सामने स्थान चाहते हैं, तो उपयोग करें

String date_s = " 2011-01-18 00:00:00.0";
date_s.substring(1,11);

5

आप जावा 8 नए प्रयास dateकर सकते हैं, ओरेकल प्रलेखन पर अधिक जानकारी मिल सकती है

या आप पुराने को आजमा सकते हैं

public static Date getDateFromString(String format, String dateStr) {

    DateFormat formatter = new SimpleDateFormat(format);
    Date date = null;
    try {
        date = (Date) formatter.parse(dateStr);
    } catch (ParseException e) {
        e.printStackTrace();
    }

    return date;
}

public static String getDate(Date date, String dateFormat) {
    DateFormat formatter = new SimpleDateFormat(dateFormat);
    return formatter.format(date);
}

4
private SimpleDateFormat dataFormat = new SimpleDateFormat("dd/MM/yyyy");

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    if(value instanceof Date) {
        value = dataFormat.format(value);
    }
    return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
};

3

निकालें एक y रूप SimpleDateFormat dt1 = new SimpleDateFormat("yyyyy-mm-dd");होना चाहिएSimpleDateFormat dt1 = new SimpleDateFormat("yyyy-mm-dd");


बिल्कुल नहीं। आपको सही मामले की भी आवश्यकता है (कोई बात नहीं यदि आप आधुनिक का उपयोग करते हैं DateTimeFormatterया पुराने के साथ चिपके हुए हैं SimpleDateFormat)।
ओले वीवी

0

SimpleDateFormat dt1 = new SimpleDateFormat ("yyyy-mm-dd");


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

गलत आपके फॉर्मेटिंग कोड यहां गलत हैं। hhघंटे के लिए है।
बेसिल बॉर्कल जूल

आमतौर पर हम कुछ चर्चा या स्पष्टीकरण की उम्मीद करते हैं। स्टैक ओवरफ्लो का मतलब एक स्निपेट लाइब्रेरी से अधिक है।
तुलसी बॉर्क

0

कहते हैं कि आप 2019-12-20 10:50 पूर्वाह्न GMT + 6: 00 से 2019-12-20 10:50 AM बदलना चाहते हैं, सबसे पहले आपको तिथि प्रारूप को समझना होगा कि पहले एक तारीख का प्रारूप yyyy-MM-dd hh है : mm a zzz और दूसरा वन डेट फॉर्मेट yyyy-MM-dd hh: mm a होगा

जैसे इस फ़ंक्शन से एक स्ट्रिंग लौटें।

public String convertToOnlyDate(String currentDate) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm a ");
    Date date;
    String dateString = "";
    try {
        date = dateFormat.parse(currentDate);
        System.out.println(date.toString()); 

        dateString = dateFormat.format(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return dateString;
}

यह फ़ंक्शन आपकी इच्छा का उत्तर देगा। यदि आप और अधिक बस अनुकूलित करना चाहते हैं या दिनांक प्रारूप से घटक निकालें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.