मैं जावा में ग्रेगोरियन कैलेंडर तिथि के साथ तुलना करने के लिए जावा तिथि से वर्ष, महीना, दिन आदि प्राप्त करना चाहता हूं। क्या यह संभव है?


231

मेरे पास जावा में एक दिनांक ऑब्जेक्ट है जो जावा की तिथि प्रकार के रूप में संग्रहीत है।

मेरे पास एक ग्रेगोरियन कैलेंडर निर्मित तिथि भी है। ग्रेगोरियन कैलेंडर की तिथि का कोई मापदण्ड नहीं है और इसलिए आज की तारीख (और समय?) का एक उदाहरण है।

जावा तिथि के साथ, मैं जावा तिथि प्रकार से वर्ष, माह, दिन, घंटा, मिनट और सेकंड प्राप्त करना चाहता हूं और gregoriancalendar दिनांक की तुलना करना चाहता हूं।

मैंने देखा कि फिलहाल जावा की तारीख को एक लंबे समय के रूप में संग्रहीत किया जाता है और उपलब्ध केवल विधियां एक स्वरूपित तारीख स्ट्रिंग के रूप में लंबे लिखने के लिए लगती हैं। क्या वर्ष, माह, दिन, आदि को एक्सेस करने का कोई तरीका है?

मैंने देखा है कि getYear(), getMonth()के लिए, आदि तरीकों Dateवर्ग पदावनत किया गया है। मैं सोच रहा था कि मेरे पास GregorianCalendarतारीख के साथ जावा तिथि उदाहरण का उपयोग करने के लिए सबसे अच्छा अभ्यास क्या है ।

मेरा अंतिम लक्ष्य एक तारीख की गणना करना है ताकि मैं यह जांच कर सकूं कि जावा तिथि आज की तारीख और समय के इतने घंटे, मिनट आदि के भीतर है।

मैं अभी भी जावा के लिए नौसिखिया हूँ और इससे थोड़ा हैरान हूँ।


1
अरे जो भी आप उपयोग करते हैं वह उपयोग नहीं करता है Date.getYear()। यह समस्याओं से ग्रस्त है (जो मुझे नहीं पता)। Date.getYear()एक बार मेरी तिथि 30/06/2017 दर्ज कर ली गई और यह मेरा वर्ष 117 के रूप में वापस आ गया। देखें कि यह दो हजार साल पहले कहां उतरा था। लेकिन जब मैं बस दिनांक वस्तु, उत्पादन ठीक था प्रिंट Date.getYear();। लेकिन नहीं था ।
सीनिवासन

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

जवाबों:


545

कुछ का उपयोग करें:

Date date; // your date
// Choose time zone in which you want to interpret your Date
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Europe/Paris"));
cal.setTime(date);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
// etc.

खबरदार, महीने 0 से शुरू होते हैं, 1 से नहीं।

संपादित करें : जावा 8 के बाद से java.util.Calendar के बजाय java.time.ocalDate का उपयोग करना बेहतर है । यह कैसे करना है के लिए यह उत्तर देखें ।


4
आप cal.add(Calendar.DAY_OF_MONTH, -48)कैलेंडर ऑब्जेक्ट पर दिन अंकगणित करने के लिए उपयोग कर सकते हैं । और आप दो कैलेंडर ऑब्जेक्ट्स का उपयोग करके तुलना कर सकते हैं cal.compareTo(anotherCal)
फ्लोरेंट गिलियूम

1
शानदार, चीयर्स फ्लोरेंट! क्या इसका मतलब यह है कि कैलेंडर वर्ष और दिन, सेकंड, मिनट और सेकंड अपडेट करेगा जब कैलेंडर के तरीकों का उपयोग किया जाता है? डेव
daveb

11
ध्यान दें कि महीना 0 से शुरू होता है न कि 1 (यानी जनवरी = 0) से। docs.oracle.com/javase/6/docs/api/java/util/Calendar.html#MONTH
स्टीव कू

10
जावा इतना असुविधाजनक क्यों है?
किम्ची मैन

3
क्योंकि तारीख और कैलेंडर पुराने और बुरी तरह से डिज़ाइन किए गए हैं। Java 8 में बहुत बेहतर डेटा / समय ऑब्जेक्ट हैं, oracle.com/technetwork/articles/java/…
Florent Guillaume

88

जावा 8 और बाद में, आप दिनांक ऑब्जेक्ट को लोकलडेट ऑब्जेक्ट में बदल सकते हैं और फिर आसानी से वर्ष, माह और दिन प्राप्त कर सकते हैं।

Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int year  = localDate.getYear();
int month = localDate.getMonthValue();
int day   = localDate.getDayOfMonth();

ध्यान दें कि getMonthValue()1 से 12 तक एक अंतर मान लौटाता है।


10
अब 2016 है, मेरा मानना ​​है कि LocalDateजावा 8 का उपयोग करना सबसे अच्छा समाधान है जो आपके समय की बचत करता है, दूसरे समाधान का उपयोग करना Calendarऔर Dateपरेशानी से भरा है।
एनीफ्रॉमटाइवन

2
शानदार उत्तर - java.time का उपयोग करने के लिए निश्चित रूप से सबसे अच्छा है और पुरानी पुरानी समय की कक्षाओं से बचने के लिए। यह भी ध्यान दें कि यह उत्तर कैसे समझदारी से समय क्षेत्र के मुद्दे को संबोधित करता है। किसी भी क्षण के लिए, तिथि समय क्षेत्र के अनुसार दुनिया भर में बदलती रहती है।
१il:

1
दुर्भाग्य से Android के लिए एपीआई स्तर 26+।
विकिटोर कलिनोवस्की

14

आप ऐसा कुछ कर सकते हैं, यह बताएगा कि Dateकक्षा कैसे काम करती है।

String currentDateString = "02/27/2012 17:00:00";
SimpleDateFormat sd = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
Date currentDate = sd.parse(currentDateString);

String yourDateString = "02/28/2012 15:00:00";
SimpleDateFormat yourDateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");

Date yourDate = yourDateFormat.parse(yourDateString);

if (yourDate.after(currentDate)) {
    System.out.println("After");
} else if(yourDate.equals(currentDate)) {
    System.out.println("Same");
} else {
    System.out.println("Before");
}

हाय JavaCity, इसके लिए धन्यवाद। यह बहुत उपयोगी है। फिलहाल मैं डेट स्ट्रिंग से पार्स करने से कतरा रहा हूं। मुझे यह पार्सिंग बाद में करने की आवश्यकता होगी, जब मुझे अपने आवेदन के उपयोगकर्ताओं को वर्ष, दिन और महीने निर्धारित करने के लिए मिलेगा। मैं SimpleDateFormat में पार्स करने के लिए एक स्ट्रिंग बनाने जा रहा था। कार्रवाई में यह देखने के लिए उपरोक्त बहुत उपयोगी है। मेरे जावा की तारीख एक दिन पहले इसकी तात्कालिकता से एक तारीख और समय के रूप में बनाई गई थी। मैं अब उस gregoriancalendar तारीख की तुलना करना चाह रहा हूँ जिसे आज तत्काल किया गया है। ईमानदारी से धन्यवाद
daveb

8
कृपया कोड ठीक करें ... लोअरकेस mmमिनट को इंगित करता है, अपरकेस का MMमतलब है महीने का साल।
योयो

12
    Date date = new Date();

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEEE");

    System.out.println("DAY "+simpleDateFormat.format(date).toUpperCase());

    simpleDateFormat = new SimpleDateFormat("MMMM");
    System.out.println("MONTH "+simpleDateFormat.format(date).toUpperCase());

    simpleDateFormat = new SimpleDateFormat("YYYY");
    System.out.println("YEAR "+simpleDateFormat.format(date).toUpperCase());

संपादित करें: date= के लिए आउटपुट Fri Jun 15 09:20:21 CEST 2018है:

DAY FRIDAY
MONTH JUNE
YEAR 2018

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

6
private boolean isSameDay(Date date1, Date date2) {
    Calendar calendar1 = Calendar.getInstance();
    calendar1.setTime(date1);
    Calendar calendar2 = Calendar.getInstance();
    calendar2.setTime(date2);
    boolean sameYear = calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR);
    boolean sameMonth = calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH);
    boolean sameDay = calendar1.get(Calendar.DAY_OF_MONTH) == calendar2.get(Calendar.DAY_OF_MONTH);
    return (sameDay && sameMonth && sameYear);
}

3
    Date queueDate = new SimpleDateFormat("yyyy-MM-dd").parse(inputDtStr);
    Calendar queueDateCal = Calendar.getInstance();
    queueDateCal.setTime(queueDate);
    if(queueDateCal.get(Calendar.DAY_OF_YEAR)==Calendar.getInstance().get(Calendar.DAY_OF_YEAR))
{
    "same day of the year!";
 }

1
स्टैक ओवरफ्लो के उत्तर में कुछ चर्चा और स्पष्टीकरण होने की उम्मीद है, न कि केवल कोड स्निपेट्स। और आपका कोड निश्चित रूप से कुछ स्पष्टीकरण का उपयोग कर सकता है।
बेसिल बॉर्क

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

2
@Test
public void testDate() throws ParseException {
    long start = System.currentTimeMillis();
    long round = 100000l;
    for (int i = 0; i < round; i++) {
        StringUtil.getYearMonthDay(new Date());
    }
    long mid = System.currentTimeMillis();
    for (int i = 0; i < round; i++) {
        StringUtil.getYearMonthDay2(new Date());
    }
    long end = System.currentTimeMillis();
    System.out.println(mid - start);
    System.out.println(end - mid);
}

public static Date getYearMonthDay(Date date) throws ParseException {
    SimpleDateFormat f = new SimpleDateFormat("yyyyyMMdd");
    String dateStr = f.format(date);
    return f.parse(dateStr);
}

public static Date getYearMonthDay2(Date date) throws ParseException {
    Calendar c = Calendar.getInstance();
    c.setTime(date);
    c.set(Calendar.SECOND, 0);
    c.set(Calendar.MINUTE, 0);
    c.set(Calendar.HOUR_OF_DAY, 0);
    return c.getTime();
}
public static int compare(Date today, Date future, Date past) {
    Date today1 = StringUtil.getYearMonthDay2(today);
    Date future1 = StringUtil.getYearMonthDay2(future);
    Date past1 = StringUtil.getYearMonthDay2(past);
    return today.compare // or today.after or today.before
}

getYearMonthDay2 (कैलेंडर समाधान) दस गुना तेज है। अब आपके पास yyyy MM dd 00 00 00 है, और उसके बाद date.compare का उपयोग करें


2

यह आसान हो सकता है

     Date date1 = new Date("31-May-2017");
OR
    java.sql.Date date1 = new java.sql.Date((new Date()).getTime());

    SimpleDateFormat formatNowDay = new SimpleDateFormat("dd");
    SimpleDateFormat formatNowMonth = new SimpleDateFormat("MM");
    SimpleDateFormat formatNowYear = new SimpleDateFormat("YYYY");

    String currentDay = formatNowDay.format(date1);
    String currentMonth = formatNowMonth.format(date1);
    String currentYear = formatNowYear.format(date1);

-2

ध्यान से 0 नहीं 1 से शुरू माउंट करें। और साथ ही कैलेंडर का उपयोग पीएम भी कर रहे हैं ताकि घंटे एन्स मिनट का उपयोग करते समय बहुत सावधानी से रहें।

Date your_date;
Calendar cal = Calendar.getInstance(); 
cal.setTime(your_date);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MINUTE);


1
आधुनिक java.time का उपयोग करने के लिए बेहतर है कि इन कष्टप्रद पुरानी विरासत वर्गों को यहां दिखाया गया है। सही उत्तर
तुलसी बोर्ल

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