java - मैं जावा में उम्र की गणना कैसे सही ढंग से जन्म तिथि की गणना कर सकता हूं




android date calendar compareto (5)

यह एक कोड है जिसका उपयोग मैं समझता हूं कि कितना पुराना है

Long time= currentDate.getTime / 1000 - birthdate.getTime / 1000

int years = Math.round(time) / 31536000;
int months = Math.round(time - years * 31536000) / 2628000; 

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

क्लैरिफ़िकेशन के लिए संपादित करें जिसका मतलब है कि 2015-1993 या तो 22 साल का हो या 21 साल का हो सकता है यदि उनका जन्मदिन पहले से ही पारित हो चुका है। मैं यह सुनिश्चित करना चाहता हूं कि मुझे इसके साथ सही उम्र मिल जाए

public class ShowAgeActivity extends AppCompatActivity {

private TextView usersAge;

private static long daysBetween(Date one, Date two)
{
    long difference = (one.getTime()-two.getTime())/86400000; return Math.abs(difference);
}

private Date getCurrentForBirthday()
{
    Date birthday = (Date) this.getIntent().getExtras().get("TheBirthDay");
    int birthdayYear = birthday.getYear() + 1900;
    Calendar cal = Calendar.getInstance();
    cal.set(birthdayYear, Calendar.MONTH, Calendar.DAY_OF_MONTH);
    Date current = cal.getTime();
    return current;
}


protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_show_age);


    Date birthday = (Date) this.getIntent().getExtras().get("TheBirthDay");
      Date currentDay = Calendar.getInstance().getTime();

      long age = daysBetween(birthday,currentDay)/365;

      usersAge =(TextView)findViewById(R.id.ageTextView);

    if (birthday.compareTo(getCurrentForBirthday()) == 0 )
    {
        usersAge.setText("It is your birthday, and your Age is " + String.valueOf(age));
    }

    usersAge.setText("Your Age is " + String.valueOf(age));


    }

}


नीचे एक व्यक्ति की उम्र की गणना करने का एक उदाहरण है, यदि आज उसका जन्मदिन है, साथ ही साथ अपने जन्मदिन तक कितने दिन बचे हैं, यदि आज उनका जन्मदिन नए जावा के उपयोग से नहीं होता है। टाइम पैकेज कक्षाएं जो एक भाग के रूप में शामिल थीं जावा 8

  LocalDate today             = LocalDate.now();
  LocalDate birthday          = LocalDate.of(1982, 9, 26);
  LocalDate thisYearsBirthday = birthday.with(Year.now());

  long age = ChronoUnit.YEARS.between(birthday, today);

  if (thisYearsBirthday.equals(today))
  {
     System.out.println("It is your birthday, and your Age is " + age);
  }
  else
  {
     long daysUntilBirthday = ChronoUnit.DAYS.between(today, thisYearsBirthday);
     System.out.println("Your age is " + age + ". " + daysUntilBirthday + " more days until your birthday!");
  }

यह मेरे लिए काम करता है

Calendar currentDate = Calendar.getInstance();

SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd");

Date birthdate = null;

try {
     birthdate = myFormat.parse(yourDate);
} catch (ParseException e) {
     e.printStackTrace();
}

Long time= currentDate.getTime().getTime() / 1000 - birthdate.getTime() / 1000;

int years = Math.round(time) / 31536000;
int months = Math.round(time - years * 31536000) / 2628000;

नैट द्वारा जवाब अच्छा है लेकिन यह समय क्षेत्र के मुद्दे की उपेक्षा करता है और एक और स्पष्ट दृष्टिकोण संभव है

समय क्षेत्र

तिथि का निर्धारण करने में समय क्षेत्र महत्वपूर्ण है उदाहरण के लिए, मॉन्ट्रियल की तुलना में एक नया दिन पहले पेरिस में उठेगा

अगर छोड़े गए, तो जेवीएम का मौजूदा डिफ़ॉल्ट समय क्षेत्र निहित रूप से लागू होता है। मैं आपको सुझाव देता हूं कि इसके बजाय आप उस समय क्षेत्र को स्पष्ट कर लें जो आप की अपेक्षा करते हैं / इच्छा करते हैं

एक उचित समय क्षेत्र का नाम , महाद्वीप / शहर शैली का उपयोग करें कभी भी "ईएसटी" या "आईएसटी" जैसे 3-4 अक्षर कोड का उपयोग न करें

java.time

Java.time ढांचा ( ट्यूटोरियल ) जावा 8 में बनाया गया है और बाद में समय की Period को एक संयुक्त संख्या, महीनों की संख्या, और दिनों की संख्या के रूप में प्रतिनिधित्व करने के लिए Period वर्ग शामिल है।

आप उन तीन घटकों में से प्रत्येक को निकालने के लिए एक Period पूछ सकते हैं।

डिफ़ॉल्ट रूप से अवधि के toString विधि आईएसओ 8601 द्वारा परिभाषित प्रारूप में एक स्ट्रिंग उत्पन्न करती है, जहां P शुरुआती अंक और तीन बार पत्र के अनुसार चिह्नित करता है। उदाहरण के लिए, डेढ़ साल: P1Y6M

ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId );
LocalDate birthdate = LocalDate.of( 1960 , 2 , 17 );
Period p = Period.between( birthdate , today );
String output = p.toString();
Integer age = p.getYears();
Boolean isTodayBirthday = ( (p.getMonths() == 0 )  && ( p.getDays() == 0 ) );

एक अन्य तरीका एक महीने के बिना एक महीने के दिन प्रतिनिधित्व करने के लिए MonthDay वर्ग का उपयोग करता है।

Boolean isBirthdayToday = 
    MonthDay.from( birthdate )
            .equals( MonthDay.from( today ) ) ;

एंड्रॉयड

एंड्रॉइड के लिए, आपके पास जावा 8 टेक्नोलॉजी नहीं है जैसे कि java.time

आप कुछ परियोजनाओं की खोज कर सकते हैं जो बैकपोर्ट जावा। टाइम कक्षाएं मुझे नहीं पता कि वे कितने सफल हैं।

साथ ही, आप Joda-Time, एक तीसरे पक्षीय लाइब्रेरी का उपयोग कर सकते हैं जो java.time फ्रेमवर्क (जेएसआर 310) को प्रेरित करती है। जोडा-टाइम कोड ऊपर के समान होना चाहिए। सिवाय इसके कि पीरियड क्लास के पास एक बेहतर रिज़ॉल्यूशन है, जो घंटों, मिनटों और सेकंड में जा रहा है। उस अतिरिक्त डेटा को छोटा करने के लिए, withTimeAtStartOfDay विधि को कॉल करें


int foo=Integer.parseInt("1234");

सुनिश्चित करें कि स्ट्रिंग में कोई गैर-संख्यात्मक डेटा नहीं है।







java android date calendar compareto