আমি জাভাতে কারও বয়স গণনা করব কীভাবে?


147

আমি জাভা পদ্ধতিতে একটি বছর হিসাবে বছর বয়সে ফিরে আসতে চাই। আমার কাছে এখন যা রয়েছে তা নীচে যেখানে getBirthDate () একটি তারিখ অবজেক্ট (জন্ম তারিখ সহ ;-)) প্রদান করে:

public int getAge() {
    long ageInMillis = new Date().getTime() - getBirthDate().getTime();

    Date age = new Date(ageInMillis);

    return age.getYear();
}

তবে যেহেতু getYear () অবচিত হ'ল আমি ভাবছি যে এটি করার আরও ভাল উপায় আছে? আমি নিশ্চিত না যে এটি সঠিকভাবে কাজ করে, যেহেতু আমার কোনও ইউনিট পরীক্ষা নেই (এখনও)।


এ সম্পর্কে আমার মন পরিবর্তন করেছে: অন্য প্রশ্নের মধ্যে কেবল তারিখের মধ্যে বছরের আনুমানিক পরিমাণ রয়েছে, সত্যিকারের সঠিক বয়স নয়।
ক্লিটাস

প্রদত্ত যে তিনি কোন ইনট্রেস ফিরিয়ে দিচ্ছেন, আপনি একটি 'সঠিক' বয়স বলতে কী বোঝাতে চেয়েছেন তা পরিষ্কার করে বলতে পারেন?
ব্রায়ান অগ্নিউ

2
তারিখ বনাম ক্যালেন্ডার হল একটি মৌলিক ধারণা যা জাভা ডকুমেন্টেশন পড়ার মাধ্যমে সংগ্রহ করা যায়। আমি কেন বুঝতে পারি না কেন এটি এত বেশি পরিমাণে আপলোড করা হবে।
ডেমোঙ্গোলেম

@ ডেমোঙ্গোলেম ??? তারিখ এবং ক্যালেন্ডার সহজে বোঝা যায় ?! না কোনভাবেই না. স্ট্যাক ওভারফ্লোতে এখানে বিষয়ে জিলিয়ন প্রশ্ন রয়েছে। জোদা-সময় প্রকল্পটি thoseসব ঝামেলাযুক্ত তারিখের ক্লাসগুলির বিকল্প হিসাবে সর্বাধিক জনপ্রিয় লাইব্রেরি তৈরি করেছিল। পরবর্তীতে সান, ওরাকল এবং জাসিপি সম্প্রদায় জেএসআর 310 ( জাভা.টাইম ) গ্রহণ করেছিল , স্বীকার করে নিয়েছে যে উত্তরাধিকারের শ্রেণিগুলি আশাহতভাবে অপর্যাপ্ত ছিল। আরও তথ্যের জন্য, ওরাকল দ্বারা টিউটোরিয়াল দেখুন ।
বাসিল বাউরক

উত্তর:


159

জেডিকে 8 এটিকে সহজ এবং মার্জিত করে তোলে:

public class AgeCalculator {

    public static int calculateAge(LocalDate birthDate, LocalDate currentDate) {
        if ((birthDate != null) && (currentDate != null)) {
            return Period.between(birthDate, currentDate).getYears();
        } else {
            return 0;
        }
    }
}

এর ব্যবহার প্রদর্শনের জন্য একটি JUnit পরীক্ষা:

public class AgeCalculatorTest {

    @Test
    public void testCalculateAge_Success() {
        // setup
        LocalDate birthDate = LocalDate.of(1961, 5, 17);
        // exercise
        int actual = AgeCalculator.calculateAge(birthDate, LocalDate.of(2016, 7, 12));
        // assert
        Assert.assertEquals(55, actual);
    }
}

সবার এখনই জেডিকে 8 ব্যবহার করা উচিত। পূর্ববর্তী সমস্ত সংস্করণগুলি তাদের সমর্থন জীবনের শেষ পেরিয়ে গেছে।


10
লিপ বছরগুলি নিয়ে কাজ করার সময় DAY_OF_YEAR তুলনা ভুল ফলাফল হতে পারে।
sinuhepop

1
পরিবর্তনশীল তারিখের আগে জন্ম তারিখ অবজেক্ট হতে হবে। আমি জন্ম তারিখের সাথে কীভাবে একটি তারিখ অবজেক্ট তৈরি করতে পারি?
এরিক 21

আমরা 9 ​​বছর বয়সে এবং জাভা 8 ব্যবহারের ক্ষেত্রে, এই ব্যবহারটি সমাধান হওয়া উচিত view
nojevive

জেডিকে 9 বর্তমান উত্পাদন সংস্করণ। আগের চেয়ে সত্য।
duffymo

2
পছন্দ করুন আমি বরং মোটেও গ্রহণ করব না null, পরিবর্তে ব্যবহার করুন Objects.requireNonNull
এমসি সম্রাট

170

জোদা যাচাই করুন , যা তারিখ / সময় গণনা সহজ করে দেয় (জোদা নতুন মানক জাভা তারিখ / সময় এপিআই এর ভিত্তিও তাই আপনি খুব শীঘ্রই মানক এপিআই শিখবেন)।

সম্পাদনা: জাভা 8 এর সাথে খুব একই রকম কিছু রয়েছে এবং এটি পরীক্ষা করে দেখার মতো

যেমন

LocalDate birthdate = new LocalDate (1970, 1, 20);
LocalDate now = new LocalDate();
Years age = Years.yearsBetween(birthdate, now);

যা আপনি চাইতে পারেন হিসাবে সহজ। প্রাক জাভা 8 স্টাফ কিছুটা অপ্রয়োজনীয় (যেমন আপনি চিহ্নিত করেছেন)।


2
@ হোওংলং: জাভাডক্স থেকে: "এই শ্রেণিটি কোনও দিনকে উপস্থাপন করে না, তবে মধ্যরাতে মিলিসেকেন্ড তাত্ক্ষণিকভাবে। যদি আপনার এমন একটি শ্রেণীর প্রয়োজন যা পুরো দিনটি উপস্থাপন করে তবে একটি বিরতি বা লোকালডেট আরও উপযুক্ত হতে পারে।" আমরা সত্যিই এখানে একটি তারিখ প্রতিনিধিত্ব করতে চান না
জন স্কিটি

আপনি যদি @ জনস্কিটের পরামর্শ অনুসারে এটি করতে চান তবে এটি এর মতো: বছর বয়স = বছর.ইয়ার্সবিটুইন (নতুন লোকালডেট (গেটবার্থডেট ()), নতুন স্থানীয় তারিখ ());
ফ্লেচ

কেন আমি ডেটমিডনাইট ব্যবহার করেছি জানি না এবং আমি এখন এটি নষ্ট হয়ে গেছে তা নোট করি। এখন স্থানীয় তারিখ ব্যবহার করতে পরিবর্তন করা হয়েছে
ব্রায়ান


2
@ ইগরগানাপলস্কি প্রকৃতপক্ষে মূল পার্থক্যটি: জোদা-সময় ব্যবহারকারীর ব্যবহারকারীর সময় জাভা--এবং থ্রিটেনবিপি স্থির কারখানার পদ্ধতি ব্যবহার করে। জোদা-সময় যেভাবে বয়সের গণনা করে তার একটি সূক্ষ্ম বাগের জন্য, দয়া করে আমার উত্তরটি দেখুন যেখানে আমি বিভিন্ন লাইব্রেরির আচরণ সম্পর্কে একটি ওভারভিউ দিয়েছি।
মেনো হচসচাইল্ড

43
Calendar now = Calendar.getInstance();
Calendar dob = Calendar.getInstance();
dob.setTime(...);
if (dob.after(now)) {
  throw new IllegalArgumentException("Can't be born in the future");
}
int year1 = now.get(Calendar.YEAR);
int year2 = dob.get(Calendar.YEAR);
int age = year1 - year2;
int month1 = now.get(Calendar.MONTH);
int month2 = dob.get(Calendar.MONTH);
if (month2 > month1) {
  age--;
} else if (month1 == month2) {
  int day1 = now.get(Calendar.DAY_OF_MONTH);
  int day2 = dob.get(Calendar.DAY_OF_MONTH);
  if (day2 > day1) {
    age--;
  }
}
// age is now correct

হ্যাঁ, ক্যালেন্ডার ক্লাসটি ভয়ানক। দুর্ভাগ্যক্রমে, কাজের সময়ে মাঝে মাঝে আমাকে এটি ব্যবহার করতে হয়: /। পোস্ট করার জন্য ক্লেটাসকে ধন্যবাদ
স্টিভ

1
Calendar.DAY_OF_YEAR সঙ্গে Calendar.MONTH এবং Calendar.DAY_OF_MONTH প্রতিস্থাপন এবং এটি অন্তত একটি বিট ক্লিনার হতে হবে
Tobbbe

@ তোব্বে আপনি যদি 1 লা মার্চ একটি লিপ বছরে জন্মগ্রহণ করেন তবে আপনার জন্মদিন পরের বছর 1 লা মার্চ হয়, ২ য় মার্চ নয়। DAY_OF_YEAR কাজ করবে না।
এয়ারসোর্স লিমিটেড

42

আধুনিক উত্তর এবং ওভারভিউ

ক) জাভা -৮ (জাভা.টাইম-প্যাকেজ)

LocalDate start = LocalDate.of(1996, 2, 29);
LocalDate end = LocalDate.of(2014, 2, 28); // use for age-calculation: LocalDate.now()
long years = ChronoUnit.YEARS.between(start, end);
System.out.println(years); // 17

নোট করুন যে অভিব্যক্তিটি স্পষ্টভাবে LocalDate.now()সিস্টেম টাইমজোন সম্পর্কিত (যা ব্যবহারকারীরা প্রায়শই অবহেলিত থাকেন) সম্পর্কিত। স্বচ্ছতার জন্য now(ZoneId.of("Europe/Paris"))একটি স্পষ্ট টাইমজোন (এখানে "ইউরোপ / প্যারিস" উদাহরণ হিসাবে) নির্দিষ্ট করে বোঝা পদ্ধতি ব্যবহার করা সাধারণত ভাল । যদি সিস্টেমের টাইমজোনটির জন্য অনুরোধ করা হয় তবে আমার ব্যক্তিগত পছন্দটি LocalDate.now(ZoneId.systemDefault())সিস্টেমের টাইমজোনকে আরও পরিষ্কার করার জন্য লিখতে হয়। এটি আরও লেখার প্রচেষ্টা তবে পড়া সহজ করে তোলে।

খ) জোদা-সময়

দয়া করে নোট করুন যে প্রস্তাবিত এবং গৃহীত জোদা-সময়-সমাধান উপরোক্ত তারিখগুলির জন্য পৃথক গণনার ফলাফল দেয় (বিরল ক্ষেত্রে), যথা:

LocalDate birthdate = new LocalDate(1996, 2, 29);
LocalDate now = new LocalDate(2014, 2, 28); // test, in real world without args
Years age = Years.yearsBetween(birthdate, now);
System.out.println(age.getYears()); // 18

আমি এটিকে একটি ছোট বাগ হিসাবে বিবেচনা করি তবে জোদা-দলটির এই অদ্ভুত আচরণের বিষয়ে আলাদা ধারণা রয়েছে এবং এটি সংশোধন করতে চায় না (অদ্ভুত কারণ শেষের তারিখের মাসটি শুরু হওয়ার তারিখের চেয়ে ছোট তাই বছরটি হওয়া উচিত এক কম). এই বন্ধ সমস্যাটি দেখুন

c) java.util.Clavender ইত্যাদি

তুলনা করার জন্য অন্যান্য অন্যান্য উত্তর দেখুন। আমি এই পুরানো ক্লাসগুলি মোটেও ব্যবহার করার পরামর্শ দেব না কারণ ফলাফলটি কোডটি এখনও কিছু বহিরাগত ক্ষেত্রে এবং / অথবা মূল প্রশ্নটি এত সহজ বলে মনে হচ্ছে যে খুব জটিলভাবে ত্রুটিযুক্ত। ২০১৫ সালে আমাদের কাছে আরও ভাল গ্রন্থাগার রয়েছে।

d) তারিখ 4 জে সম্পর্কে:

প্রস্তাবিত সমাধানটি সহজ তবে লিপ বছরের ক্ষেত্রে কখনও কখনও ব্যর্থ হয়। কেবল বছরের দিনের মূল্যায়ন নির্ভরযোগ্য নয়।

e) আমার নিজস্ব লাইব্রেরি টাইম 4 জ :

এটি জাভা -8-সলিউশনের অনুরূপ কাজ করে। শুধু LocalDateদ্বারা PlainDateএবং ChronoUnit.YEARSদ্বারা প্রতিস্থাপন CalendarUnit.YEARS। তবে, "আজ" পেতে একটি সুস্পষ্ট টাইমজোন রেফারেন্স প্রয়োজন।

PlainDate start = PlainDate.of(1996, 2, 29);
PlainDate end = PlainDate.of(2014, 2, 28);
// use for age-calculation (today): 
// => end = SystemClock.inZonalView(EUROPE.PARIS).today();
// or in system timezone: end = SystemClock.inLocalView().today();
long years = CalendarUnit.YEARS.between(start, end);
System.out.println(years); // 17

1
জাভা 8 সংস্করণের জন্য আপনাকে ধন্যবাদ! আমাকে কিছু সময় বাঁচিয়েছে: এখন আমি কীভাবে বাকি মাসগুলি নিষ্কাশন করতে হবে তা খুঁজে বের করতে হবে। যেমন 1 বছর 1 মাস। :)
থোমাস 77

2
@ থোমাস 77 জবাবের জন্য ধন্যবাদ, সম্মিলিত বছর এবং মাস (এবং সম্ভবত দিনগুলি) জাভা -8 এ `java.time.Period 'ব্যবহার করে করা যেতে পারে। আপনি যদি ঘন্টার মতো অন্যান্য ইউনিটগুলিও বিবেচনায় নিতে চান তবে জাভা -8 কোনও সমাধান দেয় না।
মেনো হচসচাইল্ড

আপনাকে আবার ধন্যবাদ (এবং দ্রুত প্রতিক্রিয়ার জন্য) :)
থোমাস 77

1
আমি ব্যবহার করার সময় একটি সময় অঞ্চল নির্দিষ্ট করার পরামর্শ দিই LocalDate.now। বাদ দেওয়া হলে জেভিএমের বর্তমান ডিফল্ট সময় অঞ্চলটি সুস্পষ্টভাবে প্রয়োগ করা হয়। এই ডিফল্টটি মেশিন / ওএস / সেটিংসের মধ্যে পরিবর্তন করতে পারে এবং রানটাইম চলাকালীন যে কোনও মুহুর্তে কোনও কোড কলিংয়ের মাধ্যমেও তা পরিবর্তন করতে পারে setDefault। আমি সুনির্দিষ্ট হওয়ার পরামর্শ দিই, যেমনLocalDate.now( ZoneId.for( "America/Montreal" ) )
বেসিল বাউরেক

1
@ গোক্রাফটার_এলপি হ্যাঁ, আপনি যেমন পুরানো অ্যান্ড্রয়েড সংস্করণগুলির জন্য থ্রিটেনএবিপি সিমুলেটিং জাভা -৮, বা জোদা-টাইম-অ্যান্ড্রয়েড (ডি লিউ থেকে) বা আমার লাইব টাইম 4 এ প্রয়োগ করতে পারেন।
মেনো হচসচাইল্ড

17
/**
 * This Method is unit tested properly for very different cases , 
 * taking care of Leap Year days difference in a year, 
 * and date cases month and Year boundary cases (12/31/1980, 01/01/1980 etc)
**/

public static int getAge(Date dateOfBirth) {

    Calendar today = Calendar.getInstance();
    Calendar birthDate = Calendar.getInstance();

    int age = 0;

    birthDate.setTime(dateOfBirth);
    if (birthDate.after(today)) {
        throw new IllegalArgumentException("Can't be born in the future");
    }

    age = today.get(Calendar.YEAR) - birthDate.get(Calendar.YEAR);

    // If birth date is greater than todays date (after 2 days adjustment of leap year) then decrement age one year   
    if ( (birthDate.get(Calendar.DAY_OF_YEAR) - today.get(Calendar.DAY_OF_YEAR) > 3) ||
            (birthDate.get(Calendar.MONTH) > today.get(Calendar.MONTH ))){
        age--;

     // If birth date and todays date are of same month and birth day of month is greater than todays day of month then decrement age
    }else if ((birthDate.get(Calendar.MONTH) == today.get(Calendar.MONTH )) &&
              (birthDate.get(Calendar.DAY_OF_MONTH) > today.get(Calendar.DAY_OF_MONTH ))){
        age--;
    }

    return age;
}

2
চেকের উদ্দেশ্য কী (birthDate.get(Calendar.DAY_OF_YEAR) - today.get(Calendar.DAY_OF_YEAR) > 3)? এটি মাস এবং দিবসটির প্রথম তুলনার অস্তিত্বের সাথে অর্থহীন বলে মনে হয়।
জেদ স্কাফ

13

আমি কেবল আমার সুবিধার জন্য এক বছর ধ্রুবক মানটিতে মিলিসেকেন্ডগুলি ব্যবহার করি:

Date now = new Date();
long timeBetween = now.getTime() - age.getTime();
double yearsBetween = timeBetween / 3.15576e+10;
int age = (int) Math.floor(yearsBetween);

2
এটি সঠিক উত্তর নয় ... বছরটি 3.156e + 10 নয় তবে 3.15576e + 10 (ত্রৈমাসিক দিন!)
মাহের আবুত্রা

1
এটি কাজ করে না, কিছু বছর লিপ ইয়ার এবং একটি আলাদা ম্যাসিক মান রয়েছে
গ্রেগ এনিস

12

আপনি যদি জিডব্লিউটি ব্যবহার করে থাকেন তবে আপনি java.util.Date ব্যবহারের মধ্যে সীমাবদ্ধ থাকবেন, এখানে একটি পদ্ধতি যা তারিখটিকে পূর্ণসংখ্যার হিসাবে গ্রহণ করে তবে এখনও java.util.Date ব্যবহার করে:

public int getAge(int year, int month, int day) {
    Date now = new Date();
    int nowMonth = now.getMonth()+1;
    int nowYear = now.getYear()+1900;
    int result = nowYear - year;

    if (month > nowMonth) {
        result--;
    }
    else if (month == nowMonth) {
        int nowDay = now.getDate();

        if (day > nowDay) {
            result--;
        }
    }
    return result;
}

5

জোডটাইম ব্যবহার করে সঠিক উত্তরটি হ'ল:

public int getAge() {
    Years years = Years.yearsBetween(new LocalDate(getBirthDate()), new LocalDate());
    return years.getYears();
}

আপনি যদি চান তবে এটি একটি লাইনেও সংক্ষিপ্ত করতে পারেন। আমি ব্রায়ান অ্যাগনিউয়ের উত্তর থেকে ধারণাটি অনুলিপি করেছি , তবে আমি বিশ্বাস করি যে আপনি সেখানে দেওয়া মন্তব্যগুলি থেকে এটি দেখতে আরও সঠিক হয় (এবং এটি প্রশ্নের সঠিক উত্তর দেয়)।


4

তারিখ 4 জে লাইব্রেরি সহ:

int age = today.getYear() - birthdate.getYear();
if(today.getDayOfYear() < birthdate.getDayOfYear()){
  age = age - 1; 
}

4

এটি উপরেরটির একটি উন্নত সংস্করণ ... আপনি বয়সকে একটি 'ইনট' হতে চান তা বিবেচনা করে। কারণ কখনও কখনও আপনি আপনার প্রোগ্রামটি একগুচ্ছ লাইব্রেরিতে পূরণ করতে চান না।

public int getAge(Date dateOfBirth) {
    int age = 0;
    Calendar born = Calendar.getInstance();
    Calendar now = Calendar.getInstance();
    if(dateOfBirth!= null) {
        now.setTime(new Date());
        born.setTime(dateOfBirth);  
        if(born.after(now)) {
            throw new IllegalArgumentException("Can't be born in the future");
        }
        age = now.get(Calendar.YEAR) - born.get(Calendar.YEAR);             
        if(now.get(Calendar.DAY_OF_YEAR) < born.get(Calendar.DAY_OF_YEAR))  {
            age-=1;
        }
    }  
    return age;
}

4

এটি সম্ভবত অবাক করে দেওয়ার মতো বিষয় যে আপনার জানা দরকার নেই যে বছরে কত দিন বা মাস রয়েছে বা সেই মাসে কত দিন হয়, একইভাবে, আপনাকে লিপ বছর, লিপ সেকেন্ড, বা অন্য কোনও সম্পর্কে জানতে হবে না এই সহজ, 100% সঠিক পদ্ধতি ব্যবহার করে stuff স্টাফের:

public static int age(Date birthday, Date date) {
    DateFormat formatter = new SimpleDateFormat("yyyyMMdd");
    int d1 = Integer.parseInt(formatter.format(birthday));
    int d2 = Integer.parseInt(formatter.format(date));
    int age = (d2-d1)/10000;
    return age;
}

আমি জাভা 6 এবং 5 এর সমাধান খুঁজছি। এটি সহজ তবে সঠিক।
জেজে তুয়েবো

3

আপনার কোডটিতে এটি অনুলিপি করার চেষ্টা করুন, তারপরে বয়স পেতে পদ্ধতিটি ব্যবহার করুন।

public static int getAge(Date birthday)
{
    GregorianCalendar today = new GregorianCalendar();
    GregorianCalendar bday = new GregorianCalendar();
    GregorianCalendar bdayThisYear = new GregorianCalendar();

    bday.setTime(birthday);
    bdayThisYear.setTime(birthday);
    bdayThisYear.set(Calendar.YEAR, today.get(Calendar.YEAR));

    int age = today.get(Calendar.YEAR) - bday.get(Calendar.YEAR);

    if(today.getTimeInMillis() < bdayThisYear.getTimeInMillis())
        age--;

    return age;
}

কোড কেবল উত্তর নিরুৎসাহিত করা হয়। এই কোডটি কেন ওপি প্রশ্নকে সম্বোধন করতে পারে তা বোঝানো ভাল।
рüффп

এটি আসলে কোনও মস্তিষ্কের নয় .. তবে কেবল আপনার উদ্বেগের সমাধান করার জন্য আপডেট হবে
কেভিন

3

আমি বয়সের গণনার জন্য এই টুকরো কোডটি ব্যবহার করি, আশা করি এটি কোনও .. কোনও লাইব্রেরি ব্যবহৃত হয়নি helps

private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());

public static int calculateAge(String date) {

    int age = 0;
    try {
        Date date1 = dateFormat.parse(date);
        Calendar now = Calendar.getInstance();
        Calendar dob = Calendar.getInstance();
        dob.setTime(date1);
        if (dob.after(now)) {
            throw new IllegalArgumentException("Can't be born in the future");
        }
        int year1 = now.get(Calendar.YEAR);
        int year2 = dob.get(Calendar.YEAR);
        age = year1 - year2;
        int month1 = now.get(Calendar.MONTH);
        int month2 = dob.get(Calendar.MONTH);
        if (month2 > month1) {
            age--;
        } else if (month1 == month2) {
            int day1 = now.get(Calendar.DAY_OF_MONTH);
            int day2 = dob.get(Calendar.DAY_OF_MONTH);
            if (day2 > day1) {
                age--;
            }
        }
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return age ;
}

2

ক্ষেত্রগুলির জন্ম এবং প্রভাব উভয় তারিখের ক্ষেত্র:

Calendar bir = Calendar.getInstance();
bir.setTime(birth);
int birthNm = bir.get(Calendar.DAY_OF_YEAR);
int birthYear = bir.get(Calendar.YEAR);
Calendar eff = Calendar.getInstance();
eff.setTime(effect);

এটি হ'ল অবহিত পদ্ধতি ব্যবহার না করে জন ও এর সমাধানের একটি পরিবর্তন ification তাঁর কোডটি আমার কোডটিতে কাজ করার চেষ্টা করার জন্য আমি যথেষ্ট সময় ব্যয় করেছি। হয়তো এটি সেই সময় অন্যকে বাঁচাতে পারে।


2
আপনি এই কিছুটা ভাল ব্যাখ্যা করতে পারেন? কিভাবে এই বয়স গণনা করা হয়?
জোনাথন এস ফিশার

1

এটা কেমন?

public Integer calculateAge(Date date) {
    if (date == null) {
        return null;
    }
    Calendar cal1 = Calendar.getInstance();
    cal1.setTime(date);
    Calendar cal2 = Calendar.getInstance();
    int i = 0;
    while (cal1.before(cal2)) {
        cal1.add(Calendar.YEAR, 1);
        i += 1;
    }
    return i;
}

এটি একটি সত্যিই সুন্দর পরামর্শ (যখন আপনি জোদা ব্যবহার করছেন না এবং জাভা 8 ব্যবহার করতে পারবেন না) তবে অ্যালগরিদমটি কিছুটা ভুল কারণ প্রথম বছর পুরোটি কেটে যাওয়া পর্যন্ত আপনি 0 নন। সুতরাং আপনি যখন লুপটি শুরু করবেন তার আগে আপনাকে তারিখটিতে একটি বছর যুক্ত করতে হবে।
ডগমার

1

String dateofbirthজন্ম তারিখ আছে এবং ফর্ম্যাট যা যা হয় (নিম্নলিখিত লাইনে সংজ্ঞায়িত):

org.joda.time.format.DateTimeFormatter formatter =  org.joda.time.format.DateTimeFormat.forPattern("mm/dd/yyyy");

এখানে ফর্ম্যাট করতে হয়:

org.joda.time.DateTime birthdateDate = formatter.parseDateTime(dateofbirth );
org.joda.time.DateMidnight birthdate = new         org.joda.time.DateMidnight(birthdateDate.getYear(), birthdateDate.getMonthOfYear(), birthdateDate.getDayOfMonth() );
org.joda.time.DateTime now = new org.joda.time.DateTime();
org.joda.time.Years age = org.joda.time.Years.yearsBetween(birthdate, now);
java.lang.String ageStr = java.lang.String.valueOf (age.getYears());

পরিবর্তনশীল ageStrবছর থাকবে।


1

ইয়ারন রোনেন দ্রবণটির মার্জিত, আপাতদৃষ্টিতে সঠিক , টাইমস্ট্যাম্প পার্থক্য ভিত্তিক বৈকল্পিক।

কখন এবং কেন এটি সঠিক নয় তা প্রমাণ করার জন্য আমি একটি ইউনিট পরীক্ষা অন্তর্ভুক্ত করছি । যেকোন টাইমস্ট্যাম্প পার্থক্যের কারণে (সম্ভবত) বিভিন্ন সংখ্যক লিপ দিবস (এবং সেকেন্ড) কারণে অসম্ভব। এই অ্যালগরিদমের timeDiff / MILLI_SECONDS_YEARজন্য তফাতটি সর্বাধিক +1 -1 দিন (এবং এক সেকেন্ড) হওয়া উচিত, পরীক্ষা 2 () দেখুন, তবে সম্পূর্ণরূপে ধ্রুবক অনুমানের ভিত্তিতে ইয়ারন রোনেন দ্রবণটি 40 বছর বয়সী 10 বছরের জন্য পৃথক হতে পারে, তবুও এই বৈকল্পিকটিও ভুল is

এটি মুশকিল, কারণ সূত্র ব্যবহার করে এই উন্নত রূপটি diffAsCalendar.get(Calendar.YEAR) - 1970বেশিরভাগ সময় সঠিক ফলাফল দেয়, দুটি তারিখের মধ্যে গড়ে একইভাবে লিপ বছরের সংখ্যা হিসাবে।

/**
 * Compute person's age based on timestamp difference between birth date and given date
 * and prove it is INCORRECT approach.
 */
public class AgeUsingTimestamps {

public int getAge(Date today, Date dateOfBirth) {
    long diffAsLong = today.getTime() - dateOfBirth.getTime();
    Calendar diffAsCalendar = Calendar.getInstance();
    diffAsCalendar.setTimeInMillis(diffAsLong);
    return diffAsCalendar.get(Calendar.YEAR) - 1970; // base time where timestamp=0, precisely 1/1/1970 00:00:00 
}

    final static DateFormat df = new SimpleDateFormat("dd.MM.yyy HH:mm:ss");

    @Test
    public void test1() throws Exception {
        Date dateOfBirth = df.parse("10.1.2000 00:00:00");
        assertEquals(87, getAge(df.parse("08.1.2088 23:59:59"), dateOfBirth));
        assertEquals(87, getAge(df.parse("09.1.2088 23:59:59"), dateOfBirth));
        assertEquals(88, getAge(df.parse("10.1.2088 00:00:01"), dateOfBirth));
    }

    @Test
    public void test2() throws Exception {
        // between 2000 and 2021 was 6 leap days
        // but between 1970 (base time) and 1991 there was only 5 leap days
        // therefore age is switched one day earlier
            // See http://www.onlineconversion.com/leapyear.htm
        Date dateOfBirth = df.parse("10.1.2000 00:00:00");
        assertEquals(20, getAge(df.parse("08.1.2021 23:59:59"), dateOfBirth));
        assertEquals(20, getAge(df.parse("09.1.2021 23:59:59"), dateOfBirth)); // ERROR! returns incorrect age=21 here
        assertEquals(21, getAge(df.parse("10.1.2021 00:00:01"), dateOfBirth));
    }
}

1
public class CalculateAge { 

private int age;

private void setAge(int age){

    this.age=age;

}
public void calculateAge(Date date){

    Calendar calendar=Calendar.getInstance();

    Calendar calendarnow=Calendar.getInstance();    

    calendarnow.getTimeZone();

    calendar.setTime(date);

    int getmonth= calendar.get(calendar.MONTH);

    int getyears= calendar.get(calendar.YEAR);

    int currentmonth= calendarnow.get(calendarnow.MONTH);

    int currentyear= calendarnow.get(calendarnow.YEAR);

    int age = ((currentyear*12+currentmonth)-(getyears*12+getmonth))/12;

    setAge(age);
}
public int getAge(){

    return this.age;

}

0
/**
 * Compute from string date in the format of yyyy-MM-dd HH:mm:ss the age of a person.
 * @author Yaron Ronen
 * @date 04/06/2012  
 */
private int computeAge(String sDate)
{
    // Initial variables.
    Date dbDate = null;
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");      

    // Parse sDate.
    try
    {
        dbDate = (Date)dateFormat.parse(sDate);
    }
    catch(ParseException e)
    {
        Log.e("MyApplication","Can not compute age from date:"+sDate,e);
        return ILLEGAL_DATE; // Const = -2
    }

    // Compute age.
    long timeDiff = System.currentTimeMillis() - dbDate.getTime();      
    int age = (int)(timeDiff / MILLI_SECONDS_YEAR);  // MILLI_SECONDS_YEAR = 31558464000L;

    return age; 
}

আপনি সত্যই এটি পরীক্ষা করেছেন কিনা তা নিশ্চিত নন, তবে অন্যদের ক্ষেত্রেও এই পদ্ধতির একটি ত্রুটি রয়েছে। আজ যদি আপনার জন্ম তারিখ একই মাস হয় এবং আজ <জন্মদিন, এটি এখনও প্রকৃত বয়স +1 দেখায়, উদাহরণস্বরূপ, যদি আপনার জন্মদিন 7 সেপ্টেম্বর 1986 এবং আজ 1 সেপ্টেম্বর 2013 হয় তবে এটি আপনাকে পরিবর্তে 27 দেখায় 26.
srahul07

2
এটি সত্য হতে পারে না কারণ এক বছরে মিলি সেকেন্ডের সংখ্যা চুক্তি নয়। লিপ বছরগুলিতে আরও একটি দিন থাকে, এটি অন্যদের চেয়ে অনেক বেশি মিলিসেকেন্ড। 40 বছর বয়সী ব্যক্তির জন্য আপনার অ্যালগরিদম 9 - 10 দিন আগে জন্মদিনের রিপোর্ট করতে পারে তবে এটি সত্যই! লিপ সেকেন্ডও রয়েছে।
এস্পিনোসা

0

বছর, মাস এবং দিনগুলিতে বয়স গণনা করার জন্য এখানে জাভা কোডটি দেওয়া আছে।

public static AgeModel calculateAge(long birthDate) {
    int years = 0;
    int months = 0;
    int days = 0;

    if (birthDate != 0) {
        //create calendar object for birth day
        Calendar birthDay = Calendar.getInstance();
        birthDay.setTimeInMillis(birthDate);

        //create calendar object for current day
        Calendar now = Calendar.getInstance();
        Calendar current = Calendar.getInstance();
        //Get difference between years
        years = now.get(Calendar.YEAR) - birthDay.get(Calendar.YEAR);

        //get months
        int currMonth = now.get(Calendar.MONTH) + 1;
        int birthMonth = birthDay.get(Calendar.MONTH) + 1;

        //Get difference between months
        months = currMonth - birthMonth;

        //if month difference is in negative then reduce years by one and calculate the number of months.
        if (months < 0) {
            years--;
            months = 12 - birthMonth + currMonth;
        } else if (months == 0 && now.get(Calendar.DATE) < birthDay.get(Calendar.DATE)) {
            years--;
            months = 11;
        }

        //Calculate the days
        if (now.get(Calendar.DATE) > birthDay.get(Calendar.DATE))
            days = now.get(Calendar.DATE) - birthDay.get(Calendar.DATE);
        else if (now.get(Calendar.DATE) < birthDay.get(Calendar.DATE)) {
            int today = now.get(Calendar.DAY_OF_MONTH);
            now.add(Calendar.MONTH, -1);
            days = now.getActualMaximum(Calendar.DAY_OF_MONTH) - birthDay.get(Calendar.DAY_OF_MONTH) + today;
        } else {
            days = 0;
            if (months == 12) {
                years++;
                months = 0;
            }
        }
    }

    //Create new Age object
    return new AgeModel(days, months, years);
}

0

কোনও লাইব্রেরি ছাড়াই সহজ উপায়:

    long today = new Date().getTime();
    long diff = today - birth;
    long age = diff / DateUtils.YEAR_IN_MILLIS;

1
এই কোডটি অসুবিধাগুলি পুরানো তারিখের সময় ক্লাসগুলি ব্যবহার করে যা এখন উত্তরাধিকার হিসাবে রয়েছে, জাভা.টাইম ক্লাসগুলি দ্বারা সরবরাহ করা। পরিবর্তে, জাভা পাতাটা আধুনিক শ্রেণীর ব্যবহার করুন: ChronoUnit.YEARS.between( LocalDate.of( 1968 , Month.MARCH , 23 ) , LocalDate.now() )। দেখুন সঠিক উত্তর
বেসিল Bourque

DateUtilsএকটি গ্রন্থাগার
তেরান

0

জাভা 8 দিয়ে, আমরা এক লাইনের কোডের সাথে একজন ব্যক্তির বয়সের গণনা করতে পারি:

public int calCAge(int year, int month,int days){             
    return LocalDate.now().minus(Period.of(year, month, days)).getYear();         
}

বয়স বছর বা মাসে? কিভাবে মাসে মাসে শিশুর সম্পর্কে?
gumuruh

-1
public int getAge(Date dateOfBirth) 
{
    Calendar now = Calendar.getInstance();
    Calendar dob = Calendar.getInstance();

    dob.setTime(dateOfBirth);

    if (dob.after(now)) 
    {
        throw new IllegalArgumentException("Can't be born in the future");
    }

    int age = now.get(Calendar.YEAR) - dob.get(Calendar.YEAR);

    if (now.get(Calendar.DAY_OF_YEAR) < dob.get(Calendar.DAY_OF_YEAR)) 
    {
        age--;
    }

    return age;
}

@ সিনুহেপপ লক্ষ্য করেছেন যে "লিপ বছর নিয়ে কাজ করার সময় DAY_OF_YEAR তুলনা ভুল ফলাফল হতে পারে"
ক্রিজিসটফ কোট

-1
import java.io.*;

class AgeCalculator
{
    public static void main(String args[])
    {
        InputStreamReader ins=new InputStreamReader(System.in);
        BufferedReader hey=new BufferedReader(ins);

        try
        {
            System.out.println("Please enter your name: ");
            String name=hey.readLine();

            System.out.println("Please enter your birth date: ");
            String date=hey.readLine();

            System.out.println("please enter your birth month:");
            String month=hey.readLine();

            System.out.println("please enter your birth year:");
            String year=hey.readLine();

            System.out.println("please enter current year:");
            String cYear=hey.readLine();

            int bDate = Integer.parseInt(date);
            int bMonth = Integer.parseInt(month);
            int bYear = Integer.parseInt(year);
            int ccYear=Integer.parseInt(cYear);

            int age;

            age = ccYear-bYear;
            int totalMonth=12;
            int yourMonth=totalMonth-bMonth;

            System.out.println(" Hi " + name + " your are " + age + " years " + yourMonth + " months old ");
        }
        catch(IOException err)
        {
            System.out.println("");
        }
    }
}

-1
public int getAge(String birthdate, String today){
    // birthdate = "1986-02-22"
    // today = "2014-09-16"

    // String class has a split method for splitting a string
    // split(<delimiter>)
    // birth[0] = 1986 as string
    // birth[1] = 02 as string
    // birth[2] = 22 as string
    // now[0] = 2014 as string
    // now[1] = 09 as string
    // now[2] = 16 as string
    // **birth** and **now** arrays are automatically contains 3 elements 
    // split method here returns 3 elements because of yyyy-MM-dd value
    String birth[] = birthdate.split("-");
    String now[] = today.split("-");
    int age = 0;

    // let us convert string values into integer values
    // with the use of Integer.parseInt(<string>)
    int ybirth = Integer.parseInt(birth[0]);
    int mbirth = Integer.parseInt(birth[1]);
    int dbirth = Integer.parseInt(birth[2]);

    int ynow = Integer.parseInt(now[0]);
    int mnow = Integer.parseInt(now[1]);
    int dnow = Integer.parseInt(now[2]);

    if(ybirth < ynow){ // has age if birth year is lesser than current year
        age = ynow - ybirth; // let us get the interval of birth year and current year
        if(mbirth == mnow){ // when birth month comes, it's ok to have age = ynow - ybirth if
            if(dbirth > dnow) // birth day is coming. need to subtract 1 from age. not yet a bday
                age--;
        }else if(mbirth > mnow){ age--; } // birth month is comming. need to subtract 1 from age            
    }

    return age;
}

দ্রষ্টব্য: তারিখের ফর্ম্যাটটি হ'ল: yyyy-MM-dd। এটি জেনেরিক কোড যা jdk7 ... এ পরীক্ষিত ...
Jhonie

1
আপনি যদি কিছু মন্তব্য সরবরাহ করেন বা সঠিকভাবে এই কোডটি কীভাবে ব্যবহার করবেন তা ব্যাখ্যা করলে এটি সহায়তা করবে। কেবল কোড ডাম্পিং সাধারণত নিরুৎসাহিত করা হয় এবং আপনি কেন আপনার পদ্ধতিটিকে এইভাবে কোড করার সিদ্ধান্ত নিয়েছেন তা প্রশ্নকর্তা আপনার পছন্দগুলি বুঝতে পারবেন না।
রেআরিং

@ রাইরিং: ঝনি ইতিমধ্যে কোডটিতে মন্তব্য যুক্ত করেছে। এটা বোঝার পক্ষে যথেষ্ট। দয়া করে এই জাতীয় মন্তব্য দেওয়ার আগে ভাবেন এবং পড়ুন।
অক্ষয়

@ অক্ষয় আমার কাছে তা স্পষ্ট ছিল না। অন্ধকারে দেখে মনে হচ্ছিল সে কোড ফেলেছে। আমি সাধারণত মন্তব্য পড়ি না। এটি সুন্দর হবে যদি সেগুলি শরীর থেকে সরানো হয় এবং ব্যাখ্যা হিসাবে আলাদাভাবে রাখা হয়। যদিও এটি আমার পছন্দ এবং আমরা এখানে একমত হতে সম্মত হতে পারি .... যা বলা হচ্ছে, আমি ভুলে গিয়েছিলাম এমনকি প্রায় দু'বছর আগে যেমন এই মন্তব্যটি লিখেছিলাম আমি তাও লিখেছি।
রাইরিং

@ রায়েরেং: এই মন্তব্যের নেপথ্যের কারণ ছিল, নেতিবাচক মন্তব্যগুলি লেখাই মানুষকে এত সুন্দর ফোরাম ব্যবহার থেকে নিরুৎসাহিত করে। সুতরাং, আমাদের ইতিবাচক মন্তব্য দিয়ে তাদের উত্সাহ দেওয়া উচিত। বিডিডাব্লু, কোনও অপরাধ নেই। চিয়ার্স !!!
অক্ষয়

-1
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.Period;

public class AgeCalculator1 {

    public static void main(String args[]) {
        LocalDate start = LocalDate.of(1970, 2, 23);
        LocalDate end = LocalDate.now(ZoneId.systemDefault());

        Period p = Period.between(start, end);
        //The output of the program is :
        //45 years 6 months and 6 days.
        System.out.print(p.getYears() + " year" + (p.getYears() > 1 ? "s " : " ") );
        System.out.print(p.getMonths() + " month" + (p.getMonths() > 1 ? "s and " : " and ") );
        System.out.print(p.getDays() + " day" + (p.getDays() > 1 ? "s.\n" : ".\n") );
    }//method main ends here.
}

3
স্ট্যাকওভারফ্লোতে অংশ নেওয়ার জন্য ধন্যবাদ। আপনার জন্য একটি দম্পতি পরামর্শ। [এ] দয়া করে আপনার উত্তর সহ কিছু আলোচনা অন্তর্ভুক্ত করুন। স্ট্যাকওভারফ্লো ডটকম বলতে কোড স্নিপেট সংগ্রহের চেয়ে অনেক বেশি বোঝানো হয় more উদাহরণস্বরূপ, আপনার কোডটি নতুন জাভা.টাইম ফ্রেমওয়ার্কটি কীভাবে ব্যবহার করছে তা নোট করুন এবং অন্যান্য উত্তরগুলির বেশিরভাগ java.util.Date এবং জোদা-সময় ব্যবহার করছে। [খ] দয়া করে আপনার উত্তরটি মেনো হচচাইল্ডের অনুরূপ উত্তরের সাথে আলাদা করুন যা জাভা.টাইমও ব্যবহার করে। আপনার কীভাবে ভাল তা ব্যাখ্যা করুন বা সমস্যাটির উপর একটি ভিন্ন কোণকে আক্রমণ করুন। বা ভাল না হলে আপনার প্রত্যাহার।
তুলসী বাউরক

-1
public int getAge(Date birthDate) {
    Calendar a = Calendar.getInstance(Locale.US);
    a.setTime(date);
    Calendar b = Calendar.getInstance(Locale.US);
    int age = b.get(YEAR) - a.get(YEAR);
    if (a.get(MONTH) > b.get(MONTH) || (a.get(MONTH) == b.get(MONTH) && a.get(DATE) > b.get(DATE))) {
        age--;
    }
    return age;
}

-1

আমি সমস্ত সঠিক উত্তর প্রশংসা করি কিন্তু এটি একই প্রশ্নের কোটলিন উত্তর

আমি আশা করি কোটলিন বিকাশকারীদের পক্ষে সহায়ক হবে

fun calculateAge(birthDate: Date): Int {
        val now = Date()
        val timeBetween = now.getTime() - birthDate.getTime();
        val yearsBetween = timeBetween / 3.15576e+10;
        return Math.floor(yearsBetween).toInt()
    }

আমাদের কাছে যখন শিল্প-শীর্ষস্থানীয় জাভা.টাইম ক্লাস থাকে তখন আমাদের এই জাতীয় গণিত করা বোকামি বলে মনে হয় ।
বেসিল বাউরক

জাভাতে ওপি অনুরোধ।
তেরান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.