जावा में स्ट्रिंग ऑब्जेक्ट को कैलेंडर ऑब्जेक्ट में बदलें


174

मैं जावा में नया हूं, आमतौर पर PHP के साथ काम करता हूं।

मैं इस स्ट्रिंग को बदलने की कोशिश कर रहा हूं:

सोम मार 14 16:02:37 जीएमटी 2011

एक कैलेंडर ऑब्जेक्ट में ताकि मैं इस तरह से वर्ष और महीने को आसानी से खींच सकूं:

String yearAndMonth = cal.get(Calendar.YEAR)+cal.get(Calendar.MONTH);

क्या इसे मैन्युअल रूप से पार्स करना एक बुरा विचार होगा? एक विकल्प विधि का उपयोग?

कोई सलाह धन्यवाद मदद मिलेगी!


जवाबों:


396
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
cal.setTime(sdf.parse("Mon Mar 14 16:02:37 GMT 2011"));// all done

नोट: Localeअपने वातावरण / आवश्यकता के अनुसार सेट करें


यह सभी देखें


onlineconversion.com/unix_time.htm । यह ऑनलाइन टाइमस्टैम्प कनवर्टर है। मूल्य जो जावा कोड द्वारा गणना की जाती है और यह ऑनलाइन रूपांतरित होती है। क्यों?? क्या आप इसे देख सकते हैं? धन्यवाद :)
सचिन जे

6
ध्यान दें कि यह समयक्षेत्र की जानकारी खो देता है। कैलेंडर ऑब्जेक्ट में सिस्टम डिफ़ॉल्ट टाइमज़ोन होगा जिसे पार्स नहीं किया गया है।
बजे क्रिस्टियन व्राबी

यह सबसे ऊपर / स्वीकृत उत्तर नहीं होना चाहिए। चूंकि जावा 8 4 साल से अधिक समय से पहले से ही बाहर है, इसलिए उत्तर का उल्लेख करने के लिए अद्यतन किया जाना चाहिए java.time। यह Q / A Google पर काफी प्रमुख है।
स्कोलिटस

18

tl; डॉ

आधुनिक दृष्टिकोण java.time कक्षाओं का उपयोग करता है ।

YearMonth.from(
    ZonedDateTime.parse( 
        "Mon Mar 14 16:02:37 GMT 2011" , 
        DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" )
     )
).toString()

2011-03

विरासत की तारीखों की कक्षाओं से बचें

आधुनिक तरीका java.time कक्षाओं के साथ है। पुराने समय-समय की कक्षाएं जैसे Calendarखराब-डिज़ाइन, भ्रमित और परेशानी पैदा करने वाली साबित हुई हैं।

अपने स्ट्रिंग इनपुट से मिलान करने के लिए एक कस्टम फ़ॉर्मेटर को परिभाषित करें।

String input = "Mon Mar 14 16:02:37 GMT 2011";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" );

पार्स ए के रूप में ZonedDateTime

ZonedDateTime zdt = ZonedDateTime.parse( input , f );

आप वर्ष और महीने में रुचि रखते हैं। Java.time कक्षाओं में YearMonthउस उद्देश्य के लिए कक्षा शामिल है ।

YearMonth ym = YearMonth.from( zdt );

जरूरत पड़ने पर आप साल और महीने के नंबर के लिए पूछताछ कर सकते हैं।

int year = ym.getYear();
int month = ym.getMonthValue();

लेकिन toStringविधि मानक आईएसओ 8601 प्रारूप में एक स्ट्रिंग उत्पन्न करता है।

String output = ym.toString();

यह सब एक साथ रखो।

String input = "Mon Mar 14 16:02:37 GMT 2011";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
YearMonth ym = YearMonth.from( zdt );
int year = ym.getYear();
int month = ym.getMonthValue();

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

System.out.println( "input: " + input );
System.out.println( "zdt: " + zdt );
System.out.println( "ym: " + ym );

इनपुट: सोम मार १४ १६:० 16:३T जीएमटी २०११

zdt: 2011-03-14T16: 02: 37Z [GMT]

ym: 2011-03

लाइव कोड

देखें इस कोड IdeOne.com में चल रहा

रूपांतरण

यदि आपके पास कोई ऑब्जेक्ट होना चाहिएCalendar , तो आप GregorianCalendarपुरानी कक्षाओं में जोड़े गए नए तरीकों का उपयोग करके परिवर्तित कर सकते हैं।

GregorianCalendar gc = GregorianCalendar.from( zdt );

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

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

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

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

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

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


14

खैर, मुझे लगता है कि कोड को दोहराने के लिए यह एक बुरा विचार होगा जो पहले से ही जैसी कक्षाओं में मौजूद है SimpleDateFormat

दूसरी ओर, व्यक्तिगत रूप से मैं टालने का सुझाव दूंगा Calendarऔर Dateपूरी तरह से यदि आप कर सकते हैं, और जोडा टाइम का उपयोग कर सकते हैं, तो एक बेहतर डिज़ाइन की गई तारीख और समय एपीआई के रूप में। उदाहरण के लिए, आप जानते हैं कि होने की जरूरत SimpleDateFormatहै नहीं , थ्रेड-सुरक्षित तो आप या तो जरूरत धागे की स्थानीय लोगों, समन्वयन, या एक नया उदाहरण हर बार जब आप इसका इस्तेमाल करते हैं। Joda पारसर्स और formatters हैं धागा सुरक्षित।


आपके इनपुट के लिए धन्यवाद, मैं निश्चित रूप से भविष्य में जोडा का उपयोग करूंगा, ऐसा लगता है कि यह बहुत उपयोगी हो सकता है
डॉग मोलिनक्स

@Jon Skeet Joda एंड्रॉइड में डिसेर्बलाइज नहीं होगा। जब तक आपको तिथियों और समय को बचाने की कोई आवश्यकता नहीं है, तब तक जोडा कम है।
फ्रैंक ज़प्पा

@FrankZappa: मैं इससे सहमत नहीं हूँ - आप अपनी सभी तारीखों / समय गणनाओं को Joda Time में कर सकते हैं , लेकिन फिर क्रमिक प्रयोजनों के लिए अन्य प्रकारों (शायद सरलता के लिए तार) में परिवर्तित कर सकते हैं।
जॉन स्कीट

क्षमा करें, नीचे करना पड़ा, उत्तर बहुत पुराना है, यह सर्वोच्च रैंकिंग उत्तर होने के लिए पुराना है। आज java.timeजाने का रास्ता है, बेसिल बोर्क ने एक उत्कृष्ट उत्तर प्रदान किया।
स्कोलिटस

2
@ स्कोलिटस: शीर्ष (और स्वीकार किए गए) उत्तर में इस पर 10 की तुलना में 332 वोट हैं। मुझे लगता है कि यदि आप हर 7 +-पुराने उत्तर को डाउनवोट करते हुए चलते हैं, जिसका अब बेहतर समाधान है, तो आप डाउनवोट से बाहर निकल जाएंगे ... (मैं मानता हूं कि बेसिल का उत्तर अच्छा है, और मैंने इसे उखाड़ दिया है।)
जॉन स्कीट

10

कोई नया कैलेंडर बनाने की आवश्यकता नहीं है, SimpleDateFormat पहले से ही एक कैलेंडर का उपयोग करता है।

SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.EN_US);
Date date = sdf.parse("Mon Mar 14 16:02:37 GMT 2011"));// all done
Calendar cal = sdf.getCalendar();

(मैं अभी तक टिप्पणी नहीं कर सकता, यही कारण है कि मैंने एक नया उत्तर बनाया है)


1
आपका समाधान सुरुचिपूर्ण दिखता है, लेकिन इसके दो नुकसान हैं: 1. JavaDoc यह गारंटी नहीं देता कि व्यवहार अपेक्षित है। 2. कम से कम जावा 6 के लिए आपको लाइन 1353 पर एक रास्ता मिलता है जहाँ कैलेंडर-ऑब्जेक्ट को क्लोन किया जाता है। तो फिर! Date.equals (cal.getTime ())।
नील्स

5

SimpleDateFormatमहान है, बस ध्यान दें जो घंटों के साथ काम करते समय HHअलग है hhHH24 घंटे आधारित घंटे लौटाएगा और hh 12 घंटे आधारित घंटे लौटाएगा।

उदाहरण के लिए, निम्नलिखित 12 घंटे का समय लौटाएगा:

SimpleDateFormat sdf = new SimpleDateFormat("hh:mm aa");

जबकि यह 24 घंटे का समय लौटाएगा:

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");

4

समय क्षेत्र के साथ एक समय पार्स करें, Zपैटर्न समय क्षेत्र के लिए है

String aTime = "2017-10-25T11:39:00+09:00";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.getDefault());
try {
    Calendar cal = Calendar.getInstance();
    cal.setTime(sdf.parse(aTime));
    Log.i(TAG, "time = " + cal.getTimeInMillis()); 
} catch (ParseException e) {
    e.printStackTrace();
}

आउटपुट: यह यूटीसी समय लौटाएगा

1508899140000

यहां छवि विवरण दर्ज करें

अगर हम पैटर्न की तरह समय क्षेत्र निर्धारित नहीं करते हैं yyyy-MM-dd'T'HH:mm:ssSimpleDateFormatमें निर्धारित समय क्षेत्र का उपयोग करेगाSetting


3

हां, इसे खुद को पार्स करना बुरा होगा। SimpleDateFormat पर एक नज़र डालें , यह स्ट्रिंग को दिनांक में बदल देगा और आप दिनांक को कैलेंडर उदाहरण में सेट कर सकते हैं।


1

सरल विधि:

public Calendar stringToCalendar(String date, String pattern) throws ParseException {
    String DEFAULT_LOCALE_NAME = "pt";
    String DEFAULT_COUNTRY = "BR";
    Locale DEFAULT_LOCALE = new Locale(DEFAULT_LOCALE_NAME, DEFAULT_COUNTRY);
    SimpleDateFormat format = new SimpleDateFormat(pattern, LocaleUtils.DEFAULT_LOCALE);
    Date d = format.parse(date);
    Calendar c = getCalendar();
    c.setTime(d);
    return c;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.