java - जावा में कैलेंडर ऑब्जेक्ट में स्ट्रिंग कनवर्ट करें




date datetime calendar simpledateformat (8)

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

दूसरी तरफ, व्यक्तिगत रूप से मैं Calendar और Date से पूरी तरह से बचने का सुझाव दूंगा यदि आप कर सकते हैं और इसके बजाय जोडा टाइम का उपयोग कर रहे हैं, उतनी ही बेहतर डिज़ाइन तिथि और समय API के रूप में। उदाहरण के लिए, आपको यह पता होना चाहिए कि SimpleDateFormat थ्रेड-सुरक्षित नहीं है, इसलिए आपको या तो जब भी आप इसका उपयोग करते हैं तो थ्रेड-लोकल, सिंक्रनाइज़ेशन या एक नया उदाहरण चाहिए। जोडा पार्सर्स और फॉर्मेटर्स थ्रेड-सुरक्षित हैं।

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

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

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

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

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

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

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


सरल विधि:

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;
}

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 सेट करें

यह भी देखें


टाइमज़ोन के साथ एक समय पार्स, पैटर्न में 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:ss जैसे पैटर्न में सेट नहीं करते हैं। SimpleDateFormat उस समय क्षेत्र का उपयोग करेगा जो Setting में Setting


tl; डॉ

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

विरासत दिनांक-समय कक्षाओं से बचें

आधुनिक तरीका जावा.टाइम कक्षाओं के साथ है। 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 );

आप साल और महीने में रुचि रखते हैं। जावा.टाइम कक्षाओं में उस उद्देश्य के लिए 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 );

इनपुट: सोम मार्च 14 16:02:37 जीएमटी 2011

zdt: 2011-03-14T16: 02: 37Z [जीएमटी]

वाईएम: 2011-03

लाइव कोड

IdeOne.com में यह कोड चल रहा है

रूपांतरण

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

GregorianCalendar gc = GregorianCalendar.from( zdt );

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

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

Joda-Time प्रोजेक्ट, अब रखरखाव मोड में , जावा.टाइम में माइग्रेशन की सलाह देता है।

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

जावा.टाइम कक्षाएं कहां प्राप्त करें?

  • जावा एसई 8 और एसई 9 और बाद में
    • निर्मित।
    • एक बंडल कार्यान्वयन के साथ मानक जावा एपीआई का हिस्सा।
    • जावा 9 कुछ मामूली विशेषताओं और फिक्सेस जोड़ता है।
  • जावा एसई 6 और एसई 7
    • जावाटाइम की अधिकांश कार्यक्षमता को ThreeTen-Backport में जावा 6 और 7 में बैक-पोर्ट किया गया है।
  • Android
    • ThreeTenABP प्रोजेक्ट विशेष रूप से एंड्रॉइड के लिए थ्रीटेन-बैकपोर्ट (ऊपर उल्लिखित) को अनुकूलित करता है।
    • देखें कि कैसे उपयोग करें ...।

ThreeTen-Extra प्रोजेक्ट अतिरिक्त कक्षाओं के साथ जावा.टाइम बढ़ाता है। यह परियोजना java.time के संभावित भविष्य के जोड़ों के लिए एक सिद्ध भूमि है। आपको यहां कुछ उपयोगी कक्षाएं मिल सकती हैं जैसे Interval , YearWeek , YearQuarter , more


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


कोई नया कैलेंडर नहीं बनाया जाना चाहिए, 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();

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


यदि आप अपनी खुद की उपयोगिता लिखना नहीं चाहते हैं तो Google की guava लाइब्रेरी का उपयोग करें:

Enums.getIfPresent(Blah.class, "A")

जावा फंक्शन में निर्मित के विपरीत यह आपको जांचता है कि ए ब्ला में मौजूद है या नहीं और अपवाद फेंकता है।





java date datetime calendar simpledateformat