Pertanyaan Bagaimana cara menghitung usia seseorang di C #?


Diberikan a DateTime mewakili ulang tahun seseorang, bagaimana cara menghitung usia mereka dalam beberapa tahun?


1744


asal


Jawaban:


Solusi mudah dimengerti dan sederhana.

// Save today's date.
var today = DateTime.Today;
// Calculate the age.
var age = today.Year - birthdate.Year;
// Go back to the year the person was born in case of a leap year
if (birthdate > today.AddYears(-age)) age--;

Namun, ini menganggap Anda mencari barat Ide usia dan tidak menggunakan East Asian reckoning.


1714



Ini adalah cara yang aneh untuk melakukannya, tetapi jika Anda memformat tanggalnya yyyymmdd dan kurangi tanggal lahir dari tanggal saat ini lalu jatuhkan 4 digit terakhir yang Anda dapatkan di usia tersebut :)

Saya tidak tahu C #, tetapi saya yakin ini akan bekerja dalam bahasa apa pun.

20080814 - 19800703 = 280111 

Jatuhkan 4 digit terakhir = 28.

Kode C #:

int now = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
int dob = int.Parse(dateOfBirth.ToString("yyyyMMdd"));
int age = (now - dob) / 10000;

Atau alternatifnya tanpa semua jenis konversi dalam bentuk metode ekstensi. Kesalahan saat dihilangkan:

public static Int32 GetAge(this DateTime dateOfBirth)
{
    var today = DateTime.Today;

    var a = (today.Year * 100 + today.Month) * 100 + today.Day;
    var b = (dateOfBirth.Year * 100 + dateOfBirth.Month) * 100 + dateOfBirth.Day;

    return (a - b) / 10000;
}

892



Saya tidak tahu bagaimana solusi yang salah bisa diterima. Cuplikan C # yang benar ditulis oleh Michael Stum

Berikut ini cuplikan pengujian:

DateTime bDay = new DateTime(2000, 2, 29);
DateTime now = new DateTime(2009, 2, 28);
MessageBox.Show(string.Format("Test {0} {1} {2}",
                CalculateAgeWrong1(bDay, now),     // outputs 9
                CalculateAgeWrong2(bDay, now),     // outputs 9
                CalculateAgeCorrect(bDay, now)));  // outputs 8

Di sini Anda memiliki metode:

public int CalculateAgeWrong1(DateTime birthDate, DateTime now)
{
    return new DateTime(now.Subtract(birthDate).Ticks).Year - 1;
}

public int CalculateAgeWrong2(DateTime birthDate, DateTime now)
{
    int age = now.Year - birthDate.Year;

    if (now < birthDate.AddYears(age))
        age--;

    return age;
}

public int CalculateAgeCorrect(DateTime birthDate, DateTime now)
{
    int age = now.Year - birthDate.Year;

    if (now.Month < birthDate.Month || (now.Month == birthDate.Month && now.Day < birthDate.Day))
        age--;

    return age;
}

344



Saya tidak berpikir ada jawaban sejauh ini untuk menyediakan budaya yang menghitung usia secara berbeda. Lihat, misalnya, East Asia Age Reckoning versus itu di Barat.

Apa saja nyata Jawabannya harus mencakup lokalisasi. Itu Pola Strategi mungkin akan ada dalam urutan dalam contoh ini.


115



Jawaban sederhana untuk ini adalah untuk diterapkan AddYears seperti yang ditunjukkan di bawah karena ini adalah satu-satunya metode asli untuk menambahkan tahun ke tanggal 29 Februari tahun kabisat dan mendapatkan hasil yang benar pada tanggal 28 Februari untuk tahun-tahun biasa.

Beberapa orang merasa bahwa 1th of Mar. adalah ulang tahun dari leaplings tetapi tidak. Net maupun aturan resmi tidak mendukung hal ini, juga tidak logika umum menjelaskan mengapa beberapa orang yang lahir pada bulan Februari harus memiliki 75% dari ulang tahun mereka di bulan lain.

Lebih lanjut, metode Umur cocok untuk ditambahkan sebagai perpanjangan DateTime. Dengan ini Anda dapat memperoleh usia dengan cara yang paling sederhana:

  1. Daftar barang

int age = birthDate.Age ();

public static class DateTimeExtensions
{
    /// <summary>
    /// Calculates the age in years of the current System.DateTime object today.
    /// </summary>
    /// <param name="birthDate">The date of birth</param>
    /// <returns>Age in years today. 0 is returned for a future date of birth.</returns>
    public static int Age(this DateTime birthDate)
    {
        return Age(birthDate, DateTime.Today);
    }

    /// <summary>
    /// Calculates the age in years of the current System.DateTime object on a later date.
    /// </summary>
    /// <param name="birthDate">The date of birth</param>
    /// <param name="laterDate">The date on which to calculate the age.</param>
    /// <returns>Age in years on a later day. 0 is returned as minimum.</returns>
    public static int Age(this DateTime birthDate, DateTime laterDate)
    {
        int age;
        age = laterDate.Year - birthDate.Year;

        if (age > 0)
        {
            age -= Convert.ToInt32(laterDate.Date < birthDate.Date.AddYears(age));
        }
        else
        {
            age = 0;
        }

        return age;
    }
}

Sekarang, jalankan tes ini:

class Program
{
    static void Main(string[] args)
    {
        RunTest();
    }

    private static void RunTest()
    {
        DateTime birthDate = new DateTime(2000, 2, 28);
        DateTime laterDate = new DateTime(2011, 2, 27);
        string iso = "yyyy-MM-dd";

        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                Console.WriteLine("Birth date: " + birthDate.AddDays(i).ToString(iso) + "  Later date: " + laterDate.AddDays(j).ToString(iso) + "  Age: " + birthDate.AddDays(i).Age(laterDate.AddDays(j)).ToString());
            }
        }

        Console.ReadKey();
    }
}

Contoh tanggal kritis adalah ini:

Tanggal lahir: 2000-02-29 Tanggal selanjutnya: 2011-02-28 Umur: 11

Keluaran:

{
    Birth date: 2000-02-28  Later date: 2011-02-27  Age: 10
    Birth date: 2000-02-28  Later date: 2011-02-28  Age: 11
    Birth date: 2000-02-28  Later date: 2011-03-01  Age: 11
    Birth date: 2000-02-29  Later date: 2011-02-27  Age: 10
    Birth date: 2000-02-29  Later date: 2011-02-28  Age: 11
    Birth date: 2000-02-29  Later date: 2011-03-01  Age: 11
    Birth date: 2000-03-01  Later date: 2011-02-27  Age: 10
    Birth date: 2000-03-01  Later date: 2011-02-28  Age: 10
    Birth date: 2000-03-01  Later date: 2011-03-01  Age: 11
}

Dan untuk kemudian tanggal 2012-02-28:

{
    Birth date: 2000-02-28  Later date: 2012-02-28  Age: 12
    Birth date: 2000-02-28  Later date: 2012-02-29  Age: 12
    Birth date: 2000-02-28  Later date: 2012-03-01  Age: 12
    Birth date: 2000-02-29  Later date: 2012-02-28  Age: 11
    Birth date: 2000-02-29  Later date: 2012-02-29  Age: 12
    Birth date: 2000-02-29  Later date: 2012-03-01  Age: 12
    Birth date: 2000-03-01  Later date: 2012-02-28  Age: 11
    Birth date: 2000-03-01  Later date: 2012-02-29  Age: 11
    Birth date: 2000-03-01  Later date: 2012-03-01  Age: 12
}

99



Saran saya

int age = (int) ((DateTime.Now - bday).TotalDays/365.242199);

Itu tampaknya memiliki tahun yang berubah pada tanggal yang tepat. (Saya tempat diuji hingga usia 107)


76



Fungsi lain, bukan oleh saya tetapi ditemukan di web dan disempurnakan sedikit:

public static int GetAge(DateTime birthDate)
{
    DateTime n = DateTime.Now; // To avoid a race condition around midnight
    int age = n.Year - birthDate.Year;

    if (n.Month < birthDate.Month || (n.Month == birthDate.Month && n.Day < birthDate.Day))
        age--;

    return age;
}

Hanya dua hal yang muncul dalam pikiran saya: Bagaimana dengan orang-orang dari negara-negara yang tidak menggunakan kalender Gregorian? DateTime.Now adalah budaya khusus server yang saya pikir. Saya benar-benar memiliki 0 pengetahuan tentang benar-benar bekerja dengan kalender Asia dan saya tidak tahu apakah ada cara mudah untuk mengubah tanggal antara kalender, tetapi jika Anda bertanya-tanya tentang orang-orang Cina dari tahun 4660 :-)


65



Saya terlambat ke pesta, tapi inilah satu kalimat:

int age = new DateTime(DateTime.Now.Subtract(birthday).Ticks).Year-1;

44