कनवर्ट करें java.util.Date स्ट्रिंग के लिए


407

मैं एक java.util.Dateऑब्जेक्ट को Stringजावा में बदलना चाहता हूं ।

प्रारूप है 2010-05-30 22:15:52


2
इसी तरह के सवाल: stackoverflow.com/questions/4772425/format-date-in-java
Vadzim

@harschware FYI करें, जोडा-टाइम परियोजना अब रखरखाव मोड में है , जिसमें टीम । जावा कक्षाओं के लिए प्रवासन की सलाह दे रही है । ओरेकल द्वारा ट्यूटोरियल देखें ।
बासिल बॉर्क

1
मेरा सुझाव है कि आप उपयोग न करें और Date2019 में। यह वर्ग खराब डिजाइन और लंबे समय से पुराना है। इसके बजाय java.time से आधुनिक जावा तिथि और समय एपीआई का उपयोग Instantया अन्य वर्ग ।
ओले वीवी

जवाबों:


757

कन्वर्ट एक तिथि एक करने के लिए स्ट्रिंग का उपयोग कर DateFormat#formatविधि:

String pattern = "MM/dd/yyyy HH:mm:ss";

// Create an instance of SimpleDateFormat used for formatting 
// the string representation of date according to the chosen pattern
DateFormat df = new SimpleDateFormat(pattern);

// Get the today date using Calendar object.
Date today = Calendar.getInstance().getTime();        
// Using DateFormat format method we can create a string 
// representation of a date with the defined format.
String todayAsString = df.format(today);

// Print the result!
System.out.println("Today is: " + todayAsString);

से http://www.kodejava.org/examples/86.html


25
Calendarसादे के बजाय क्यों उपयोग करें new Date()? क्या अंतर है?
अलेक्जेंडर मालाखोव

10
खबरदार: SimpleDateFormat धागा सुरक्षित नहीं है। stackoverflow.com/questions/6840803/…
ज़ैग्स

23
कैलेंडर एक सार वर्ग है, तिथि ठोस है। दिनांक का टाइमजोन, लोकेल या उस अच्छे सामान के बारे में कोई विचार नहीं है जिसका हम सभी कभी उपयोग नहीं करते हैं।
nckbrz

30
MM/dd/yyyyप्रारूप बेवकूफ और टूटी हुई है। इसका प्रयोग न करें। हमेशा उपयोग dd/MM/yyyyया yyyy-MM-dd
SystemParadox

13
@SystemParadox - यह बेवकूफ है, लेकिन यह इसे व्यर्थ नहीं बनाता है। मुझे विशेष रूप से इसका उपयोग करने के लिए कहा गया है क्योंकि यह मेल खाता है कि लोग रिपोर्ट पर क्या उम्मीद करते हैं। (मैं yyyy-MM-ddहर जगह पसंद करता हूं , लेकिन आप क्या कर सकते हैं?)।
शरद ऋतु लियोनार्ड


63

कॉमन्स-लैंग DateFormatUtils अच्छाई से भरा हुआ है (यदि आपके कॉमपोनार में कॉमन्स-लैंग है

//Formats a date/time into a specific pattern
 DateFormatUtils.format(yourDate, "yyyy-MM-dd HH:mm:SS");

एक अतिरिक्त nullजाँच की आवश्यकता है।
फारुख चिश्ती

23

tl; डॉ

myUtilDate.toInstant()  // Convert `java.util.Date` to `Instant`.
          .atOffset( ZoneOffset.UTC )  // Transform `Instant` to `OffsetDateTime`.
          .format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )  // Generate a String.
          .replace( "T" , " " )  // Put a SPACE in the middle.

2014-11-14 14:05:09

java.time

आधुनिक तरीका java.time वर्गों के साथ है जो अब पुरानी पुरानी विरासत तारीख-समय की कक्षाओं को दबा देते हैं।

सबसे पहले अपने कन्वर्ट java.util.Dateएक करने के लिए InstantInstantकक्षा में समय रेखा पर एक पल का प्रतिनिधित्व करता यूटीसी के एक संकल्प के साथ नैनोसेकंड (नौ (9) एक दशमलव भिन्न के अंकों के लिए)।

Java.time से / से बातचीत पुरानी कक्षाओं में जोड़े गए नए तरीकों द्वारा की जाती है।

Instant instant = myUtilDate.toInstant();

दोनों अपने java.util.Dateऔर java.time.Instantमें हैं यूटीसी । यदि आप UTC के रूप में दिनांक और समय देखना चाहते हैं, तो ऐसा ही हो। toStringमानक ISO 8601 प्रारूप में एक स्ट्रिंग उत्पन्न करने के लिए कॉल करें ।

String output = instant.toString();  

2014-11-14T14: 05: 09Z

अन्य प्रारूपों के लिए, आपको अपने Instantऔर अधिक लचीले में बदलने की जरूरत है OffsetDateTime

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );

odt.toString (): 2020-05-01T21: 25: 35.957Z

उस कोड को IdeOne.com पर लाइव देखें ।

अपने इच्छित प्रारूप में स्ट्रिंग प्राप्त करने के लिए, एक निर्दिष्ट करें DateTimeFormatter। आप एक कस्टम प्रारूप निर्दिष्ट कर सकते हैं। लेकिन मैं पूर्वनिर्धारित फॉर्मेटर्स ( ISO_LOCAL_DATE_TIME) में से एक का उपयोग करता हूं , और Tइसके आउटपुट को स्पेस के साथ बदल देता हूं ।

String output = odt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
                   .replace( "T" , " " );

2014-11-14 14:05:09

वैसे मैं इस तरह के प्रारूप की अनुशंसा नहीं करता हूं जहां आप जानबूझकर ऑफसेट-यूटीसी या समय क्षेत्र की जानकारी खो देते हैं। उस स्ट्रिंग की तिथि-समय मान के अर्थ के अनुसार अस्पष्टता बनाता है।

डेटा हानि से भी सावधान रहें, क्योंकि आपके स्ट्रिंग के दिनांक-समय मान का प्रतिनिधित्व करने में किसी भी भिन्न द्वितीय को अनदेखा किया जा रहा है (प्रभावी रूप से छोटा)।

किसी विशेष क्षेत्र की दीवार-घड़ी के समय के लेंस के माध्यम से उसी क्षण को देखने के लिए , ए ZoneIdको प्राप्त करने के लिए आवेदन करें ZonedDateTime

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

zdt.toString (): 2014-11-14T14: 05: 09-05: 00 [अमेरिका / मॉन्ट्रियल]

एक स्वरूपित स्ट्रिंग उत्पन्न करने के लिए, ऊपर जैसा ही करें लेकिन odtसाथ बदलें zdt

String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
                   .replace( "T" , " " );

2014-11-14 14:05:09

यदि इस कोड को बहुत बड़ी संख्या में निष्पादित किया जाता है, तो आप थोड़ा अधिक कुशल होना चाहते हैं और कॉल से बच सकते हैं String::replace। उस कॉल को छोड़ने से आपका कोड छोटा हो जाता है। यदि वांछित है, तो अपने स्वयं के DateTimeFormatterऑब्जेक्ट में अपने स्वयं के स्वरूपण पैटर्न निर्दिष्ट करें । इस उदाहरण को पुन: उपयोग के लिए एक स्थिर या सदस्य के रूप में कैश करें।

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" );  // Data-loss: Dropping any fractional second.

उदाहरण प्रस्तुत करके उस फ़ॉर्मेटर को लागू करें।

String output = zdt.format( f );

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

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

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

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

Java.time कार्यक्षमता की ज्यादातर में जावा 6 और 7 के लिए वापस भेजा जाता है ThreeTen-backport और आगे के लिए अनुकूलित एंड्रॉयड में ThreeTenABP (देखें कैसे उपयोग करने के लिए ... )।

ThreeTen-अतिरिक्त परियोजना अतिरिक्त कक्षाओं के साथ java.time फैली हुई है। यह परियोजना java.time के लिए भविष्य के संभावित अतिरिक्त के लिए एक साबित जमीन है।


यहाँ जावा 8 टाइम एपीआई के साथ प्रारूपण के कोड उदाहरण दिए गए हैं: stackoverflow.com/a/43457343/603516
वाडज़िम

यह कोड OffsetDateTime odt = Instant.atOffset (ZoneOffset.UTC) पर काम नहीं करता है; odt.toString (): 2014-11-14T14: 05: 09 + 00: 00 समान प्रारूप 2014-11-14T14: 05: 09 + 00: 00 का नया जावा 8 कोड है? धन्यवाद
बॉब बोल्डेन

@BusBolden आप सही हैं, डिफ़ॉल्ट रूप से Zइसके बजाय उपयोग किया जाता है +00:00। मैंने जवाब तय किया, धन्यवाद। FYI करें, जिनका मतलब समान है: Z"ज़ुलु" का उच्चारण शून्य घंटे-मिनट-सेकंड की एक ऑफसेट के रूप में होता है, जैसा कि +00:00आईएसओ 8601 मानक दोनों शैलियों का समर्थन करता है।
तुलसी बोर्क

@BasilBourque क्षमा करें, यह अस्पष्ट है। मेरे पास जावा 8 है और तत्काल कोई नहीं है। क्या आप सलाह दे सकते हैं कि जावा 8 के लिए सही कोड क्या होना चाहिए, इसका प्रारूप 2014-11-14T14: 05: 09 + 00: 00 बिना Instant.atOffset () के है? मैं थोड़ा खो गया हूँ :(
बॉब बोल्डेन

@BusBolden वास्तव में जावा 8 में कक्षा atOffsetपर एक विधि है। जावदोक Instantदेखें Instant::atOffset:। जावा 8 में, कॉल कॉल Instant.now().atOffset( ZoneOffset.UTC ).toString()चलेगी। अपने importबयानों की जाँच करें । सत्यापित करें कि आपका IDE / प्रोजेक्ट जावा के पुराने संस्करण के बजाय Java 8 या बाद में चलाने के लिए सेट है। कोड रन को IdeOne.com पर देखें: ideone.com/2Vm2O5
बेसिल

19

सादे-पुराने जावा में अल्टनेटिव वन-लाइनर्स:

String.format("The date: %tY-%tm-%td", date, date, date);

String.format("The date: %1$tY-%1$tm-%1$td", date);

String.format("Time with tz: %tY-%<tm-%<td %<tH:%<tM:%<tS.%<tL%<tz", date);

String.format("The date and time in ISO format: %tF %<tT", date);

यह फ़ॉर्मैटर और सापेक्ष अनुक्रमण का उपयोग करता है SimpleDateFormatजिसके बजाय थ्रेड-सुरक्षित , btw नहीं है।

थोड़ा और दोहराव लेकिन सिर्फ एक बयान की जरूरत है। यह कुछ मामलों में उपयोगी हो सकता है।


1
यह (इन) जीनियस है। विवश वातावरण के लिए बहुत बेहतर प्रदर्शन
रुस्लान

9

आप Joda (org.joda.time.DateTime) का उपयोग क्यों नहीं करते? यह मूल रूप से वन-लाइनर है।

Date currentDate = GregorianCalendar.getInstance().getTime();
String output = new DateTime( currentDate ).toString("yyyy-MM-dd HH:mm:ss");

// output: 2014-11-14 14:05:09

मेरा सुझाव है कि जेवीएम के वर्तमान डिफ़ॉल्ट समय क्षेत्र को DateTimeऑब्जेक्ट पर असाइन करने के बजाय डेटाइम ज़ोन को भी पास करें । new DateTime( currentDate , DateTimeZone.forID( "America/Montreal" ) )
बेसिल बोर्के

7

ऐसा लगता है कि आप SimpleDateFormat की तलाश कर रहे हैं ।

स्वरूप: yyyy-MM-dd kk: मिमी: ss


क्या "केके" कुछ खास करता है? मुझे लगता है कि एरिक इसे 24 घंटे के समय में चाहता है।
चार्ली साल्ट्स

2
हां, दिन में घंटे (1-24), लेकिन यह ओपी की जरूरत नहीं है। HH(0-23) अधिक सामान्य है।
बालूसी

1
@Cahrlie साल्ट्स kk 1-24 से जाता है, जहाँ HH 0-23 से जाता है, और यह शायद मेरे लिए थोड़ा संभ्रांत था कि वह 1-24 @BalusC चाहता था DateFormat वस्तु दोनों पर्स और प्रारूप।
पिकपग

मुझे आपकी अंतिम टिप्पणी की प्रासंगिकता समझ में नहीं आती है। मेरी टिप्पणी चार्ली को थी।
BalusC

मैं। नेट प्रारूपों का उपयोग करता हूं, जहां एचएच 24-समय है, और एचएच / पीएम है। इसलिए सिर खुजलाना।
चार्ली साल्ट्स

5

सिंगल शॉट में;)

दिनांक प्राप्त करने के लिए

String date = new SimpleDateFormat("yyyy-MM-dd",   Locale.getDefault()).format(new Date());

समय पाने के लिए

String time = new SimpleDateFormat("hh:mm", Locale.getDefault()).format(new Date());

तारीख और समय पाने के लिए

String dateTime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.getDefaut()).format(new Date());

मुबारक कोडिंग :)


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

4
public static String formateDate(String dateString) {
    Date date;
    String formattedDate = "";
    try {
        date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss",Locale.getDefault()).parse(dateString);
        formattedDate = new SimpleDateFormat("dd/MM/yyyy",Locale.getDefault()).format(date);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return formattedDate;
}

4

इसका उपयोग करने का सबसे आसान तरीका निम्नलिखित है:

currentISODate = new Date().parse("yyyy-MM-dd'T'HH:mm:ss", "2013-04-14T16:11:48.000");

जहाँ "yyyy-MM-dd'T'HH: mm: ss" पढ़ने की तारीख का प्रारूप है

आउटपुट: सूर्य अप्रैल १४ 16:११:४ 2013 २०१३

नोट: HH बनाम hh - HH 24h समय प्रारूप को संदर्भित करता है - hh 12h समय प्रारूप को संदर्भित करता है


सवाल विपरीत रूपांतरण के बारे में है।
वडज़िम

4

यदि आपको केवल दिनांक से समय की आवश्यकता है, तो आप स्ट्रिंग की सुविधा का उपयोग कर सकते हैं।

Date test = new Date();
String dayString = test.toString();
String timeString = dayString.substring( 11 , 19 );

यह स्वचालित रूप से स्ट्रिंग के समय भाग को काट देगा और इसे अंदर से बचाएगा timeString


यह अलग-अलग लोकेल के साथ टूट सकता है।
वडज़िम

4

विरासत का प्रारूप बनाने के लिए नए जावा 8 टाइम एपीआई का उपयोग करने के उदाहरण इस प्रकार हैं : java.util.Date

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS Z")
        .withZone(ZoneOffset.UTC);
    String utcFormatted = formatter.format(date.toInstant()); 

    ZonedDateTime utcDatetime = date.toInstant().atZone(ZoneOffset.UTC);
    String utcFormatted2 = utcDatetime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS Z"));
    // gives the same as above

    ZonedDateTime localDatetime = date.toInstant().atZone(ZoneId.systemDefault());
    String localFormatted = localDatetime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME);
    // 2011-12-03T10:15:30+01:00[Europe/Paris]

    String nowFormatted = LocalDateTime.now().toString(); // 2007-12-03T10:15:30.123

यह इस बारे में अच्छा है DateTimeFormatterकि इसे कुशलतापूर्वक कैश किया जा सकता है क्योंकि यह थ्रेड-सुरक्षित (विपरीत SimpleDateFormat) है।

पूर्वनिर्धारित fomatters और पैटर्न संकेतन संदर्भ की सूची

क्रेडिट:

LocalDateTime के साथ दिनांक / स्वरूप कैसे पार्स करें? (जावा 8)

Java8 java.util। Java.time.ZonedDateTime में रूपांतरण

स्ट्रिंग के लिए तुरंत प्रारूप

Java 8 ZonedDateTime और OffsetDateTime में क्या अंतर है?


2

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

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class Date
{
    public static void main(String[] args) 
    {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String strDate = "2013-05-14 17:07:21";
        try
        {
           java.util.Date dt = sdf.parse(strDate);         
           System.out.println(sdf.format(dt));
        }
        catch (ParseException pe)
        {
            pe.printStackTrace();
        }
    }
}

आउटपुट:

2013-05-14 17:07:21

जावा में दिनांक और समय के अधिक स्वरूपण के लिए नीचे दिए गए लिंक देखें

ओरेकल सहायता केंद्र

जावा में दिनांक समय उदाहरण


1
public static void main(String[] args) 
{
    Date d = new Date();
    SimpleDateFormat form = new SimpleDateFormat("dd-mm-yyyy hh:mm:ss");
    System.out.println(form.format(d));
    String str = form.format(d); // or if you want to save it in String str
    System.out.println(str); // and print after that
}

1

चलो यह करके देखें

public static void main(String args[]) {

    Calendar cal = GregorianCalendar.getInstance();
    Date today = cal.getTime();
    DateFormat df7 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    try {           
        String str7 = df7.format(today);
        System.out.println("String in yyyy-MM-dd format is: " + str7);          
    } catch (Exception ex) {
      ex.printStackTrace();
    }
}

या एक उपयोगिता समारोह

public String convertDateToString(Date date, String format) {
    String dateStr = null;
    DateFormat df = new SimpleDateFormat(format);

    try {
        dateStr = df.format(date);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return dateStr;
}

से जावा में स्ट्रिंग के लिए Convert तिथि


1
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String date = "2010-05-30 22:15:52";
    java.util.Date formatedDate = sdf.parse(date); // returns a String when it is parsed
    System.out.println(sdf.format(formatedDate)); // the use of format function returns a String


1

एक पंक्ति विकल्प

इस विकल्प को वास्तविक तारीख लिखने के लिए एक आसान एक-लाइन मिलती है।

कृपया ध्यान दें कि यह उपयोग कर रहा है Calendar.classऔर SimpleDateFormat, और फिर इसे Java8 के तहत उपयोग करना तर्कसंगत नहीं है।

yourstringdate =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime());

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

1
(१) उत्तर गलत है (मुझे अभी पता चला है 2019-20-23 09:20:22 - महीना 20 ??) (2) मैं यह नहीं देख सकता कि उत्तर कुछ भी प्रदान करता है जो पहले से ही अन्य उत्तरों में शामिल नहीं है। (३) कृपया युवाओं को लंबे समय से पुराने और कुख्यात परेशान करने वाले SimpleDateFormatवर्ग का उपयोग करने की शिक्षा न दें । कम से कम पहले विकल्प के रूप में नहीं। और बिना किसी आरक्षण के नहीं। आज हमारे पास java.timeआधुनिक जावा तिथि और समय एपीआई, और इसके बहुत बेहतर हैं DateTimeFormatter
ओले वीवी

हाँ .... मैंने एक गलती की और इसे सुधारना भूल गया। मैंने इसे जल्दी से जोड़ा, और याद नहीं था .. माफ करना !! और आपकी टिप्पणियों के लिए धन्यवाद दोस्तों
एलेजांद्रो टेइसीरा मुनोज़

@ OleV.V। हर किसी के पास आधुनिक जावा डेटा और समय एपी तक पहुंच नहीं है ...... इसलिए ... यह भी इस जवाब को मान्य करता है ...
एलेजांद्रो टेक्सेरा मुनोज़

1
आपके कमेंट के लिए धन्यवाद। यदि आप जावा 5, या जावा 6 और 7 के लिए कोई बाहरी निर्भरता के बिना, बहुत ही बढ़िया जवाब देना चाहते हैं, तो यह स्वागत योग्य है, कृपया केवल यह स्पष्ट करें कि आप क्या कर रहे हैं। और आपका जवाब अभी भी गलत है, आपको नए साल के आसपास आश्चर्य मिलेगा।
ओले वीवी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.