java - कैसे एक तारीख ऑब्जेक्ट कल बराबर है यह जांचने के लिए कैसे?




date calendar (6)

अभी मैं इस कोड का उपयोग कर रहा हूँ

Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE) - 1, 12, 0, 0); //Sets Calendar to "yeserday, 12am"
if(sdf.format(getDateFromLine(line)).equals(sdf.format(cal.getTime())))                         //getDateFromLine() returns a Date Object that is always at 12pm
{...CODE

यह पता लगाने के लिए एक आसान तरीका होना चाहिए कि GetdateFromLine () द्वारा लौटाई गई तारीख कल की तारीख है या नहीं। केवल तारीख मायने रखती है, समय नहीं। यही कारण है कि मैंने SimpleDateFormat का उपयोग किया। आपकी सहायता के लिए अग्रिम धन्यवाद!


Java.util से बचें। दिनांक और कैलेंडर

स्वीकृत उत्तर तकनीकी रूप से सही है लेकिन इष्टतम से कम है। Java.util.Date और .Calendar कक्षा कुख्यात परेशानी हैं। उनसे बचें। या तो Joda-Time या नया जावा.टाइम पैकेज (जावा 8 में) का प्रयोग करें।

समय क्षेत्र

समय क्षेत्र में समय क्षेत्र महत्वपूर्ण है। यदि आप इस मुद्दे को अनदेखा करते हैं, तो JVM का डिफ़ॉल्ट समय क्षेत्र लागू किया जाएगा। एक बेहतर अभ्यास हमेशा डिफ़ॉल्ट पर भरोसा करने के बजाय निर्दिष्ट करना है। यहां तक ​​कि जब आप डिफ़ॉल्ट चाहते हैं, तो स्पष्ट रूप से getDefault कॉल करें।

दिन की शुरुआत समय क्षेत्र द्वारा परिभाषित की जाती है। मॉन्ट्रियल की तुलना में बर्लिन में एक नया दिन पहले आया था। तो "आज" और "कल" ​​की परिभाषा एक समय क्षेत्र की आवश्यकता है।

Joda समय

जोडा-टाइम 2.3 में उदाहरण कोड।

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Berlin" );
DateTime today = DateTime.now( timeZone ); 

कल निर्धारित करने का एक तरीका स्थानीयडेट ऑब्जेक्ट्स में कनवर्ट करना है। यहां दिखाया गया एक और तरीका, "कल" ​​को समय की अवधि के रूप में प्रस्तुत करना है। हम उस अवधि को कल के पहले पल से जाने के रूप में परिभाषित करते हैं, लेकिन आज के पहले पल सहित नहीं । इस दृष्टिकोण को "आधे खुले" कहा जाता है जहां शुरुआत समावेशी है और अंत अनन्य है

कल (या दिन पहले) पाने के लिए एक दिन घटाएं।

DateTime yesterdayStartOfDay = today.minusDays( 1 ).withTimeAtStartOfDay();
Interval yesterdayInterval = new Interval( yesterdayStartOfDay, today.withTimeAtStartOfDay() );

अपने लक्ष्य java.util.Date ऑब्जेक्ट को जोडा-टाइम डेटटाइम ऑब्जेक्ट में कनवर्ट करें। JVM के डिफ़ॉल्ट समय क्षेत्र को लागू करने पर भरोसा करने के बजाय, उस नई ऑब्जेक्ट पर एक समय क्षेत्र लागू करें। तकनीकी रूप से इस मामले में समय क्षेत्र अप्रासंगिक है, लेकिन समय क्षेत्र समेत एक अच्छी आदत है।

DateTime target = new DateTime( myJUDate, timeZone );

परीक्षण करें कि लक्ष्य कल के अंतराल के भीतर भूमि है।

boolean isYesterday = yesterdayInterval.contains( target );

स्पष्ट रूप से समय के आधे खुले अवधि के साथ यह दृष्टिकोण "कल" ​​से अधिक के साथ काम करता है, जैसे "इस सप्ताह", "पिछले महीने", और इसी तरह।

अपडेटेडः जोडा-टाइम प्रोजेक्ट अब रखरखाव मोड में है। टीम जावा.टाइम कक्षाओं में माइग्रेशन की सलाह देती है। Przemek द्वारा सही उत्तर में java.time समाधान देखें।


java.time

Java 8 में बनाए गए java.time फ्रेमवर्क का उपयोग करना

LocalDate now = LocalDate.now(); //2015-11-24
LocalDate yesterday = LocalDate.now().minusDays(1); //2015-11-23

yesterday.equals(now); //false
yesterday.equals(yesterday); //true

आधिकारिक ओरेकल LocalDate tutorial राज्यों

बराबर विधि तुलना के लिए इस्तेमाल किया जाना चाहिए।

यदि आप LocalDateTime , ZonedDateTime , या OffsetDateTime ZonedDateTime जैसी ऑब्जेक्ट्स के साथ काम कर रहे हैं, तो आप LocalDate कनवर्ट कर सकते हैं।

LocalDateTime.now().toLocalDate(); # 2015-11-24

कैलेंडर सेट करने के बजाय इसे आजमाएं:

public static void main(String[] args) {
    int DAY_IN_MILLIS = 1000 * 60 * 60 * 24;
    Date date = new Date();
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yy");
    String prevDate = dateFormat.format(date.getTime() - DAY_IN_MILLIS);
    String currDate = dateFormat.format(date.getTime());
    String nextDate = dateFormat.format(date.getTime() + DAY_IN_MILLIS);
    System.out.println("Previous date: " + prevDate);
    System.out.println("Current date: " + currDate);
    System.out.println("Next date: " + nextDate);
  }

इससे आपको कैलेंडर के साथ आगे और पीछे जाने की अनुमति मिलनी चाहिए

फिर आप getDateFromLine (लाइन) को पिछली कीमत या जो चाहें उससे तुलना कर सकते हैं।


जब मैं इस विधि का परीक्षण करने के लिए इस तरह का उपयोग करता हूं तो मुझे थोड़ा उलझन मिल गया है

 Calendar now = new GregorianCalendar(2000, 1, 1);
 now.add(Calendar.DATE, -1);

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

मेरी उम्मीद 1999-12-31 को प्रिंट करना है, लेकिन वास्तविक 2001-1-31 है मुझे लगता है कि कैलेंडर.एड () केवल महीने में दिन के साथ सौदा करता है।

लेकिन वास्तविक त्रुटि जिस तरह से मैं कैलेंडर ऑब्जेक्ट बनाता हूं। कैलेंडर में, महीने 0 से शुरू होता है, परिवर्तनीय अब का मूल्य 2001-2-1 है, मैं इसे प्रिंट करने के लिए इतनी गर्व महसूस नहीं कर रहा था। जब मुझे कुछ गलत लगता था। कैलेंडर बनाने का सही तरीका है:

 Calendar now = new GregorianCalendar(2000, Calendar.JANUARY, 1);

कैलेंडर एक पूर्व सी # प्रोग्रामर के लिए इतना अजीब था :(


मैं एश किम से सहमत हूं कि यदि आप अपनी संवेदना को संरक्षित करना चाहते हैं तो Joda-Time लाइब्रेरी जाने का तरीका है।

import org.joda.time.DateTime;

public static boolean dayIsYesterday(DateTime day) {
    DateTime yesterday = new DateTime().withTimeAtStartOfDay().minusDays(1);
    DateTime inputDay = day.withTimeAtStartOfDay();

    return inputDay.isEqual(yesterday);
}

इस उदाहरण में, यदि डेटटाइम day कल से है तो कल dayIsYesterday(day) true हो जाएगा।


Calendar c1 = Calendar.getInstance(); // today
c1.add(Calendar.DAY_OF_YEAR, -1); // yesterday

Calendar c2 = Calendar.getInstance();
c2.setTime(getDateFromLine(line)); // your date

if (c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR)
  && c1.get(Calendar.DAY_OF_YEAR) == c2.get(Calendar.DAY_OF_YEAR)) {

यह 1 जनवरी जैसी तारीखों के लिए भी काम करेगा।






java-time