C #-də bir şəxsin yaşını necə hesablamaq olar?

Bir şəxsin doğum gününü təmsil edən DateTime , necə yaşda yaşlarını necə hesablaya bilərəm?

1743
01 авг. Jeff Atwood tərəfindən təyin olunan 01 av. 2008-08-01 02:40 '08 at 2:40 2008-08-01 02:40
@ 64 cavab
  • 1
  • 2
  • 3

Anlamaq asan və sadə həll.

 // Save today 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--; 

Buna baxmayaraq, bu, Qərbin yaşa dair fikirlərini aradığınızı və Şərqi Asiya hesablamalarından istifadə etməyinizi göstərir.

1759
04 авг. Mike Polen 04 aug tərəfindən verilmiş cavab 2008-08-04 19:50 '08 saat 19:50 'da 2008-08-04 19:50

Bunu etmək üçün qəribə bir yoldur, ancaq yyyymmdd tarixini yyyymmdd və cari tarixdən doğum tarixini yyyymmdd , bir yaşa sahib olan son 4 rəqəmi buraxın :)

C # bilmirəm, amma inanıram ki, bu hər hansı bir dildə işləyəcək.

 20080814 - 19800703 = 280111 

Son 4 rəqəm = 28 rəqəmini buraxın.

border=0

C # kodu:

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

Alternativ olaraq, bir uzadılması üsulu şəklində tip dönüşüm olmadan. Doğrulama hatası:

 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; } 
909
15 авг. Cavab verilir ScArcher2 15 aug. 2008-08-15 06:47 '08 saat 06:47 2008-08-15 06:47

Yanlış qərarın necə qurulacağını bilmirəm. Düzgün C # tərtibatı Michael Stam tərəfindən yazılmışdır

Testin bir parçası:

 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 

Burada üsullar var:

 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; } 
349
20 окт. Cavab RMA 20 okta verilir . 2009-10-20 18:07 '09 at 06:07 PM 2009-10-20 18:07

Cavablardan heç biri hələ yaşı fərqli hesablayan mədəniyyətlər vermir. Misal üçün, Şərq Asiyalı yaş təfəkkürünə baxın.

Hər hansı bir real cavab lokalizasiyanı əhatə etməlidir. Bu nümunədə, strategiyanın nümunəsi sırası ola bilər.

116
17 авг. 17 Avqustda James A. Rosen tərəfindən verilmiş cavab 2008-08-17 20:14 '08 saat 08:14 'da 2008-08-17 20:14

Bunun üçün sadə bir cavab, AddYears dən aşağıda göstərildiyi kimi istifadə AddYears Çünki bu, 29 fevral tarixinə bir ildən bir il əlavə edərək, ümumi illər üçün 28 fevralda düzgün nəticə əldə etməkdir,

Bəziləri düşünürlər ki, martın 1-i siçan bitkilərinin doğum günüdür, amma nə rəsmi, nə də rəsmi qayda bu fikri dəstəkləmir və fevral ayından etibarən doğulanların bəziləri başqa bir ayda doğum günlərinin 75% .

Bundan əlavə, Age üsulu DateTime üçün uzantı kimi əlavə edilə bilər. Bunun sayəsində yaşı asanlıqla əldə edə bilərsiniz:

  • Siyahı maddələri

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; } } 

İndi bu testi keçirin:

 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(); } } 

Kritik tarixin nümunəsi:

Doğum tarixi: 2000-02-29 Son tarix: 2011-02-28 Yaş: 11

Nəticə:

 { 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 } 

Sonrakı tarix üçün 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 } 
100
20 февр. cavab camelCasus 20 fevral verilir. 2011-02-20 02:56 '11 'də 2:56' də 2011-02-20 02:56

Mənim təklifim

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

Göründüyü kimi, il düzgün tarixə dəyişir. (Ləkəni 107-yə test etdim)

77
03 окт. 03 oktyabrda James Curran tərəfindən verilmiş cavab 2008-10-03 23:19 '08 at 11:19 pm 2008-10-03 23:19

Başqa bir funksiya məni deyil, internetdə tapdı, bir az aydınlıq etdi:

 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; } 

Mənim fikrimə gələn yalnız iki şey: Gregoryen təqvimindən istifadə etməyən ölkələrdən olan insanlar haqqında nə deyirsiniz? Server mədəniyyətində DateTime.Now, hesab edirəm. Asiya təqvimi ilə əsl işlə bağlı tamamilə 0 bilik var və tarixləri təqvimlər arasında çevirmək üçün asan bir yol varmı bilmirəm amma 4660-cı ildən bəri bu Çin uşaqları haqqında merak etdiyiniz halda: -)

65
02 авг. Michael Stum tərəfindən verilmişdir cavab Aug. 02 2008-08-02 00:46 '08 at 12:46 pm 2008-08-02 00:46

Bir partiyaya gecikdim amma burada bir xətt var:

 int age = new DateTime(DateTime.Now.Subtract(birthday).Ticks).Year-1; 
44
18 мая '09 в 15:36 2009-05-18 15:36 cavab SillyMonkey tərəfindən 18 may 09: 00-da saat 15: 36-da verilmişdir. 2009-05-18 15:36

2 Problemin həlli üçün əsas problemlər:

1. dəqiq yaşı hesablayın - il, ay, gün və s.

2. Ümumiyyətlə qəbul olunan yaşı hesablayın - insanlar adətən nə qədər yaşlı olduğuna qayğı vermirlər, yalnız doğum günü cari ildə olduğunda qayğı göstərirlər.


1 üçün həll aydındır:

 DateTime birth = DateTime.Parse("1.1.2000"); DateTime today = DateTime.Today; //we usually don't care about birth time TimeSpan age = today - birth; //.NET FCL should guarantee this as precise double ageInDays = age.TotalDays; //total number of days ... also precise double daysInYear = 365.2425; //statistical value for 400 years double ageInYears = ageInDays / daysInYear; //can be shifted ... not so precise 

2 üçün həll, ümumi yaşı müəyyənləşdirmək üçün dəqiq deyil, lakin insanlar tərəfindən dəqiq qəbul edilir. İnsanlar öz yaşlarını "əllə" hesablayarkən adətən istifadə edirlər:

 DateTime birth = DateTime.Parse("1.1.2000"); DateTime today = DateTime.Today; int age = today.Year - birth.Year; //people perceive their age in years if (today.Month < birth.Month || ((today.Month == birth.Month)  (today.Day < birth.Day))) { age--; //birthday in current year not yet reached, we are 1 year younger ;) //+ no birthday for 29.2. guys ... sorry, just wrong date for birth } 

2 qeydləri:

  • Bu, mənim üstünlüyümdir.
  • Siqnal illərində gün sayını dəyişdikcə, DateTime.DayOfYear və TimeSpans istifadə edə bilmirik.
  • Readability üçün bir neçə daha xətti qoydum.

Bir daha qeyd ... Mən onun üçün 2 statik aşırı yüklənmiş metodlar yaratmaq olardı, biri universal istifadə üçün, ikincisi isə istifadə rahatlığı üçün:

 public static int GetAge(DateTime bithDay, DateTime today) { //chosen solution method body } public static int GetAge(DateTime birthDay) { return GetAge(birthDay, DateTime.Now); } 
44
11 апр. Cavab 11 aprel tarixində Thetam tərəfindən verilir. 2011-04-11 17:47 '11 at 17:47 2011-04-11 17:47

Bir çox illər əvvəl, veb saytımdakı yaş kalkulyatoru hiyləsini təmin etmək üçün yaşımı hesablamaq üçün funksiyanı yazdım. Bu funksiya C # ( PHP versiyasından ) üçün sürətli portdur. Qorxuram ki, C # -in versiyasını yoxlaya bilmədi, amma ümid edirəm ki, siz yenə də bunu sevirsiniz!

(Əlbəttə ki, bu, Stack Overflow-da istifadəçi profillərini göstərmək üçün bir az əlverişsizdir, amma bəlkə oxucular bunun üçün bir qədər istifadə edərlər:))

 double AgeDiff(DateTime date1, DateTime date2) { double years = date2.Year - date1.Year;  double fraction = 365 + (DateTime.IsLeapYear(date2.Year)  date2.DayOfYear >= 59  (date1.DayOfYear < 59 || date1.DayOfYear > date2.DayOfYear) ? 1 : 0);  if (DateTime.IsLeapYear(date2.Year) == DateTime.IsLeapYear(date1.Year)) return years + (date2.DayOfYear - date1.DayOfYear) / fraction;  if (DateTime.IsLeapYear(date2.Year)) { return years + (date2.DayOfYear - date1.DayOfYear - (date1.DayOfYear >= 59 ? 1 : 0)) / fraction; }  if (date1.DayOfYear != 59) { return years + (date2.DayOfYear - date1.DayOfYear + (date1.DayOfYear > 59 ? 1 : 0)) / fraction; }  return years + (date2.DayOfYear - 58.5) / fraction; } 
33
01 авг. Chris Jester-Young tərəfindən verilmiş cavab 01 Av 2008-08-01 11:57 '08 at 11:57 2008-08-01 11:57

Burada istifadə etdiyimiz versiyadır. Bu işləyir və olduqca sadədir. Jeffin eyni fikri var, amma bir az mürəkkəbdir, çünki məntiqi birindən ayırır, anlamaq üçün bir az daha asan olur.

 public static int GetAge(this DateTime dateOfBirth, DateTime dateAsAt) { return dateAsAt.Year - dateOfBirth.Year - (dateOfBirth.DayOfYear < dateAsAt.DayOfYear ? 0 : 1); } 

Üçlü operatoru bu dəqiq olmadığını düşünsəniz daha da aydınlaşdırmaq üçün uzatmaq olar.

Aydındır ki, bu, DateTime də uzadılması üsulu olaraq aparılır, amma açıq-aydın olaraq, işi edən və hər hansı bir yerə qoyan kodun bir xəttini işə sala bilərsiniz. Burada tamamilə dolğunluq üçün DateTime.Now keçən genişlənmə metodunun başqa yükü var.

33
06 авг. David Wengier tərəfindən verilmiş cavab 6 Avqust 2008-08-06 13:23 '08 at 13:23 pm 2008-08-06 13:23

Mən bunu istifadə edirəm:

 public static class DateTimeExtensions { public static int Age(this DateTime birthDate) { return Age(birthDate, DateTime.Now); } public static int Age(this DateTime birthDate, DateTime offsetDate) { int result=0; result = offsetDate.Year - birthDate.Year; if (offsetDate.DayOfYear < birthDate.DayOfYear) { result--; } return result; } } 
30
17 февр. Cavab 17 fevralda Elmer tərəfindən verilir . 2010-02-17 16:32 '10 at 16:32 2010-02-17 16:32

Səksən il və hər şey səbəbindən bildiyim ən yaxşı üsul:

 DateTime birthDate = new DateTime(2000,3,1); int age = (int)Math.Floor((DateTime.Now - birthDate).TotalDays / 365.25D); 

Bu kömək edir.

28
01 авг. Nick Berardi tərəfindən verilmiş cavab 01 avqust. 2008-08-01 15:07 '08 at 15:07 2008-08-01 15:07

Bu, bu suala "daha ətraflı" verir. Bəlkə də aradığınız şey budur.

 DateTime birth = new DateTime(1974, 8, 29); DateTime today = DateTime.Now; TimeSpan span = today - birth; DateTime age = DateTime.MinValue + span; // Make adjustment due to MinValue equalling 1/1/1 int years = age.Year - 1; int months = age.Month - 1; int days = age.Day - 1; // Print out not only how many years old they are but give months and days as well Console.Write("{0} years, {1} months, {2} days", years, months, days); 
27
20 сент. Jacqueline Loriault tərəfindən verilmiş cavab 20 sentyabr 2013-09-20 22:13 '13 at 10:13 PM 2013-09-20 22:13

Doğum tarixini nəzərə alaraq bir şəxsin yaşını hesablamaq üçün xüsusi bir SQL Server funksiyası yaratdım. Sorgunuzun bir hissəsi olaraq bu lazım olduğunda faydalıdır:

 using System; using System.Data; using System.Data.Sql; using System.Data.SqlClient; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; public partial class UserDefinedFunctions { [SqlFunction(DataAccess = DataAccessKind.Read)] public static SqlInt32 CalculateAge(string strBirthDate) { DateTime dtBirthDate = new DateTime(); dtBirthDate = Convert.ToDateTime(strBirthDate); DateTime dtToday = DateTime.Now; // get the difference in years int years = dtToday.Year - dtBirthDate.Year; // subtract another year if we're before the // birth day in the current year if (dtToday.Month < dtBirthDate.Month || (dtToday.Month == dtBirthDate.Month  dtToday.Day < dtBirthDate.Day)) years=years-1; int intCustomerAge = years; return intCustomerAge; } }; 
23
23 авг. cavab user2601 23 aug tərəfindən verilir . 2008-08-23 16:58 '08 at 4:58 pm 2008-08-23 16:58

Mən bununla bağlı bir müddət işləyirdim və il, ay və gündüz birinin yaşını hesablamaq üçün bu işlə məşğul oldum. Mən problemi 29 fevralda və sıçrayış ilində sınaqdan keçirdim və işə yaramağa bənzərsə, hər hansı bir rəy üçün minnətdaram:

 public void LoopAge(DateTime myDOB, DateTime FutureDate) { int years = 0; int months = 0; int days = 0; DateTime tmpMyDOB = new DateTime(myDOB.Year, myDOB.Month, 1); DateTime tmpFutureDate = new DateTime(FutureDate.Year, FutureDate.Month, 1); while (tmpMyDOB.AddYears(years).AddMonths(months) < tmpFutureDate) { months++; if (months > 12) { years++; months = months - 12; } } if (FutureDate.Day >= myDOB.Day) { days = days + FutureDate.Day - myDOB.Day; } else { months--; if (months < 0) { years--; months = months + 12; } days += DateTime.DaysInMonth( FutureDate.AddMonths(-1).Year, FutureDate.AddMonths(-1).Month ) + FutureDate.Day - myDOB.Day; } //add an extra day if the dob is a leap day if (DateTime.IsLeapYear(myDOB.Year)  myDOB.Month == 2  myDOB.Day == 29) { //but only if the future date is less than 1st March if (FutureDate >= new DateTime(FutureDate.Year, 3, 1)) days++; } } 
22
18 мая '09 в 14:24 2009-05-18 14:24 Cavab Jon 18 May 'da 14:24' də verilmişdir 2009-05-18 14:24

Burada başqa cavab var:

 public static int AgeInYears(DateTime birthday, DateTime today) { return ((today.Year - birthday.Year) * 372 + (today.Month - birthday.Month) * 31 + (today.Day - birthday.Day)) / 372; } 

Vahiddə hərtərəfli test edilmişdir. Bir az "sehrli" görünür. 372 nömrəli, hər ay 31 gün olsaydı, bir il içində olacağı günlərin sayıdır.

Nəyə görə çalışdığının açıqlanması ( buradan silinir ):

Yn = DateTime.Now.Year, Yb = birthday.Year, Mn = DateTime.Now.Month, Mb = birthday.Month, Dn = DateTime.Now.Day, Db = birthday.Day

age = Yn - Yb + (31*(Mn - Mb) + (Dn - Db))/372

Yn-Yb-1 olmasaydı, Yn-Yb-1 yə, Yn-Yb-1 ə çatmaq lazımdır.

a) Əgər Mn<Mb , biz -341 <= 31*(Mn-Mb) <= -31 and -30 <= Dn-Db <= 30

-371 <= 31*(Mn - Mb) + (Dn - Db) <= -1

Bir bölünmə ilə

(31*(Mn - Mb) + (Dn - Db))/372 = -1

b) əgər Mn=MbDn<Db , sonra 31*(Mn - Mb) = 0 and -30 <= Dn-Db <= -1

Yenə bir bölünmə ilə

(31*(Mn - Mb) + (Dn - Db))/372 = -1

c) Əgər Mn>Mb , 31 <= 31*(Mn-Mb) <= 341 and -30 <= Dn-Db <= 30

1 <= 31*(Mn - Mb) + (Dn - Db) <= 371

Bir bölünmə ilə

(31*(Mn - Mb) + (Dn - Db))/372 = 0

d) əgər Mn=MbDn>Db , sonra 31*(Mn - Mb) = 0 and 1 <= Dn-Db <= 3 0

Yenə bir bölünmə ilə

(31*(Mn - Mb) + (Dn - Db))/372 = 0

e) Əgər Mn=MbDn=Db , sonra 31*(Mn - Mb) + Dn-Db = 0

və buna görə də (31*(Mn - Mb) + (Dn - Db))/372 = 0

18
22 апр. Cavab Matthew Watson tərəfindən 22 Apreldə verilir 2013-04-22 11:19 '13 at 11:19 2013-04-22 11:19
 TimeSpan diff = DateTime.Now - birthdayDateTime; string age = String.Format("{0:%y} years, {0:%M} months, {0:%d}, days old", diff); 

Mən sizə geri gəlmək istədiyin tam əmin deyiləm, buna görə yalnız oxunan bir xətt çəkdim.

17
19 сент. 19 Sentyabrda Dakotah Hicock tərəfindən verilmiş cavab. 2013-09-19 18:18 '13 'da 18:18' də 2013-09-19 18:18

1 yaşdan az olan insanları nəzərdən keçirməliyikmi? Çin mədəniyyəti olaraq, gənc uşaqların yaşını 2 ay və ya 4 həftə olaraq təsvir edirik.

Aşağıda mənim tətbiqim, mən təsəvvür etdiyim kimi asan deyil, xüsusilə 2/28 kimi bir tarixə sahib olmaq.

 public static string HowOld(DateTime birthday, DateTime now) { if (now < birthday) throw new ArgumentOutOfRangeException("birthday must be less than now."); TimeSpan diff = now - birthday; int diffDays = (int)diff.TotalDays; if (diffDays > 7)//year, month and week { int age = now.Year - birthday.Year; if (birthday > now.AddYears(-age)) age--; if (age > 0) { return age + (age > 1 ? " years" : " year"); } else {// month and week DateTime d = birthday; int diffMonth = 1; while (d.AddMonths(diffMonth) <= now) { diffMonth++; } age = diffMonth-1; if (age == 1  d.Day > now.Day) age--; if (age > 0) { return age + (age > 1 ? " months" : " month"); } else { age = diffDays / 7; return age + (age > 1 ? " weeks" : " week"); } } } else if (diffDays > 0) { int age = diffDays; return age + (age > 1 ? " days" : " day"); } else { int age = diffDays; return "just born"; } } 

Bu tətbiq test halları aşağıda keçmişdir.

 [TestMethod] public void TestAge() { string age = HowOld(new DateTime(2011, 1, 1), new DateTime(2012, 11, 30)); Assert.AreEqual("1 year", age); age = HowOld(new DateTime(2011, 11, 30), new DateTime(2012, 11, 30)); Assert.AreEqual("1 year", age); age = HowOld(new DateTime(2001, 1, 1), new DateTime(2012, 11, 30)); Assert.AreEqual("11 years", age); age = HowOld(new DateTime(2012, 1, 1), new DateTime(2012, 11, 30)); Assert.AreEqual("10 months", age); age = HowOld(new DateTime(2011, 12, 1), new DateTime(2012, 11, 30)); Assert.AreEqual("11 months", age); age = HowOld(new DateTime(2012, 10, 1), new DateTime(2012, 11, 30)); Assert.AreEqual("1 month", age); age = HowOld(new DateTime(2008, 2, 28), new DateTime(2009, 2, 28)); Assert.AreEqual("1 year", age); age = HowOld(new DateTime(2008, 3, 28), new DateTime(2009, 2, 28)); Assert.AreEqual("11 months", age); age = HowOld(new DateTime(2008, 3, 28), new DateTime(2009, 3, 28)); Assert.AreEqual("1 year", age); age = HowOld(new DateTime(2009, 1, 28), new DateTime(2009, 2, 28)); Assert.AreEqual("1 month", age); age = HowOld(new DateTime(2009, 2, 1), new DateTime(2009, 3, 1)); Assert.AreEqual("1 month", age); // NOTE. // new DateTime(2008, 1, 31).AddMonths(1) == new DateTime(2009, 2, 28); // new DateTime(2008, 1, 28).AddMonths(1) == new DateTime(2009, 2, 28); age = HowOld(new DateTime(2009, 1, 31), new DateTime(2009, 2, 28)); Assert.AreEqual("4 weeks", age); age = HowOld(new DateTime(2009, 2, 1), new DateTime(2009, 2, 28)); Assert.AreEqual("3 weeks", age); age = HowOld(new DateTime(2009, 2, 1), new DateTime(2009, 3, 1)); Assert.AreEqual("1 month", age); age = HowOld(new DateTime(2012, 11, 5), new DateTime(2012, 11, 30)); Assert.AreEqual("3 weeks", age); age = HowOld(new DateTime(2012, 11, 1), new DateTime(2012, 11, 30)); Assert.AreEqual("4 weeks", age); age = HowOld(new DateTime(2012, 11, 20), new DateTime(2012, 11, 30)); Assert.AreEqual("1 week", age); age = HowOld(new DateTime(2012, 11, 25), new DateTime(2012, 11, 30)); Assert.AreEqual("5 days", age); age = HowOld(new DateTime(2012, 11, 29), new DateTime(2012, 11, 30)); Assert.AreEqual("1 day", age); age = HowOld(new DateTime(2012, 11, 30), new DateTime(2012, 11, 30)); Assert.AreEqual("just born", age); age = HowOld(new DateTime(2000, 2, 29), new DateTime(2009, 2, 28)); Assert.AreEqual("8 years", age); age = HowOld(new DateTime(2000, 2, 29), new DateTime(2009, 3, 1)); Assert.AreEqual("9 years", age); Exception e = null; try { age = HowOld(new DateTime(2012, 12, 1), new DateTime(2012, 11, 30)); } catch (ArgumentOutOfRangeException ex) { e = ex; } Assert.IsTrue(e != null); } 

Bu faydalı olacağına ümid edirəm.

17
30 нояб. Bu cavab rockXrock 30 noyabrda verilir . 2012-11-30 15:13 '12 at 15:13 2012-11-30 15:13

Sadə saxlama (və bəlkə də axmaq :)).

 DateTime birth = new DateTime(1975, 09, 27, 01, 00, 00, 00); TimeSpan ts = DateTime.Now - birth; Console.WriteLine("You are approximately " + ts.TotalSeconds.ToString() + " seconds old."); 
17
18 авг. Freddy tərəfindən 18 Avqustda cavab verildi 2010-08-18 17:29 '10 at 17:29 2010-08-18 17:29

Heç bulamadığım en asan yol. ABŞ və Batı Avropa bölgələri üçün düzgün işləyir. Başqa yerlərdə, xüsusilə Çin kimi yerlərdə danışa bilmərik. Yaşdan ilkin hesablamadan sonra ən çox 4 əlavə müqayisə.

 public int AgeInYears(DateTime birthDate, DateTime referenceDate) { Debug.Assert(referenceDate >= birthDate, "birth date must be on or prior to the reference date"); DateTime birth = birthDate.Date; DateTime reference = referenceDate.Date; int years = (reference.Year - birth.Year); // // an offset of -1 is applied if the birth date has // not yet occurred in the current year. // if (reference.Month > birth.Month); else if (reference.Month < birth.Month) --years; else // in birth month { if (reference.Day < birth.Day) --years; } return years ; } 

Mən bununla bağlı cavab axtarırdım və heç kimin sıçrayış gününün doğuşunun tənzimləyici / qanuni nəticələrinə istinad etmədiyini qeyd etdi. Məsələn, Vikipediyada , 29 Fevralda müxtəlif ölkələrdə doğulmuş olsanız, fərqli bir iliniz var:

  • Birləşmiş Krallıqda və Hong Kongda: bu ildönümlü bir gündür, belə ki, növbəti gün, 1 mart doğum gününüzdür.
  • Yeni Zelandiyada: bu, əvvəlki gün, sürücülərin lisenziyası üçün 28 fevral və digər məqsədlər üçün 1 mart.
  • Tayvan: bu 28 fevral.

ABŞ-da tövsiyyələr bu məsələyə dair səssizdir və bunu ümumi qanuna və müxtəlif tənzimləyici orqanlara öz qaydalarına əsasən müəyyən edirlər.

Bunun üçün yaxşılaşdırma:

 public enum LeapDayRule { OrdinalDay = 1 , LastDayOfMonth = 2 , } static int ComputeAgeInYears(DateTime birth, DateTime reference, LeapYearBirthdayRule ruleInEffect) { bool isLeapYearBirthday = CultureInfo.CurrentCulture.Calendar.IsLeapDay(birth.Year, birth.Month, birth.Day); DateTime cutoff; if (isLeapYearBirthday  !DateTime.IsLeapYear(reference.Year)) { switch (ruleInEffect) { case LeapDayRule.OrdinalDay: cutoff = new DateTime(reference.Year, 1, 1) .AddDays(birth.DayOfYear - 1); break; case LeapDayRule.LastDayOfMonth: cutoff = new DateTime(reference.Year, birth.Month, 1) .AddMonths(1) .AddDays(-1); break; default: throw new InvalidOperationException(); } } else { cutoff = new DateTime(reference.Year, birth.Month, birth.Day); } int age = (reference.Year - birth.Year) + (reference >= cutoff ? 0 : -1); return age < 0 ? 0 : age; } 

Qeyd etmək lazımdır ki, bu kodda nəzərdə tutulur:

  • Qərb (Avropa) yaşı göstəricisi və
  • Ayın sonunda bir temporal gün əlavə edən Grigoriy təqvimi kimi bir təqvim.
16
06 окт. Nicholas Carey tərəfindən verilmiş cavab 06 oktyabr 2010-10-06 04:49 '10 at 4:49 2010-10-06 04:49

İşdə həll.

 DateTime dateOfBirth = new DateTime(2000, 4, 18); DateTime currentDate = DateTime.Now; int ageInYears = 0; int ageInMonths = 0; int ageInDays = 0; ageInDays = currentDate.Day - dateOfBirth.Day; ageInMonths = currentDate.Month - dateOfBirth.Month; ageInYears = currentDate.Year - dateOfBirth.Year; if (ageInDays < 0) { ageInDays += DateTime.DaysInMonth(currentDate.Year, currentDate.Month); ageInMonths = ageInMonths--; if (ageInMonths < 0) { ageInMonths += 12; ageInYears--; } } if (ageInMonths < 0) { ageInMonths += 12; ageInYears--; } Console.WriteLine("{0}, {1}, {2}", ageInYears, ageInMonths, ageInDays); 
15
18 июня '09 в 13:35 2009-06-18 13:35 Cavab Rajeshwaran SP tərəfindən 18 İyun '09 saat 13:35 'da 2009-06-18 13:35

Bu, fevral ayının 29-unun istənilən ilinə nisbətən 29 fevral doğum gününə qərar verə biləcək ən doğru cavablardan biridir.

 public int GetAge(DateTime birthDate) { int age = DateTime.Now.Year - birthDate.Year; if (birthDate.DayOfYear > DateTime.Now.DayOfYear) age--; return age; } 
15
23 окт. Cavab 23 oktyabrda mjb tərəfindən verilir 2014-10-23 16:18 '14 'da 16:18' da 2014-10-23 16:18

Bu, birbaşa cavab deyil, eləcə də elmi cəhətdən elmi baxımdan problemin fəlsəfi arqumentidir.

Sualda yaşın ölçülebileceği bir birim və ya mədəniyyət olmadığını söyləyərəm, ən çox cavablar bir tamsaylı illik təsdiqi qəbul edir. SI-vahid vaxt üçün second , ergo düzgün ümumi cavab olmalıdır (əlbəttə, normallaşdırılmış bir DateTime qəbul edərək və nisbi təsirləri nəzərə almadan):

 var lifeInSeconds = (DateTime.Now.Ticks - then.Ticks)/TickFactor; 

İlin yaşını hesablamaq üçün xristian üsulunda:

 var then = ... // Then, in this case the birthday var now = DateTime.UtcNow; int age = now.Year - then.Year; if (now.AddYears(-age) < then) age--; 

Maliyyələşdirmədə, müəyyən bir dövrdə bir neçə ildir ki, "Gün sayıları" adlanır ki, hesablanarkən oxşar bir problem var. Və yaş problemi vaxt ölçmə problemidir.

Faktiki / faktiki bir nümunə (bütün günləri "doğru" sayır):

 DateTime start, end = .... // Whatever, assume start is before end double startYearContribution = 1 - (double) start.DayOfYear / (double) (DateTime.IsLeapYear(start.Year) ? 366 : 365); double endYearContribution = (double)end.DayOfYear / (double)(DateTime.IsLeapYear(end.Year) ? 366 : 365); double middleContribution = (double) (end.Year - start.Year - 1); double DCF = startYearContribution + endYearContribution + middleContribution; 

Другим довольно распространенным способом измерения времени обычно является "сериализация" (чувак, который назвал это соглашение о дате, должен был серьезно быть trippin):

 DateTime start, end = .... // Whatever, assume start is before end int days = (end - start).Days; 

Интересно, как долго мы должны идти до того, как релятивистский возраст в считанные секунды станет более полезным, чем приблизительное приближение солнечных циклов на земле за одну жизнь до сих пор:) Или, другими словами, когда должен быть задан период местоположение или функция, представляющая движение для себя, чтобы быть действительной:)

14
ответ дан flindeberg 23 нояб. '12 в 18:00 2012-11-23 18:00

Necə bu həll?

 static string CalcAge(DateTime birthDay) { DateTime currentDate = DateTime.Now; int approximateAge = currentDate.Year - birthDay.Year; int daysToNextBirthDay = (birthDay.Month * 30 + birthDay.Day) - (currentDate.Month * 30 + currentDate.Day) ; if (approximateAge == 0 || approximateAge == 1) { int month = Math.Abs(daysToNextBirthDay / 30); int days = Math.Abs(daysToNextBirthDay % 30); if (month == 0) return "Your age is: " + daysToNextBirthDay + " days"; return "Your age is: " + month + " months and " + days + " days"; ; } if (daysToNextBirthDay > 0) return "Your age is: " + --approximateAge + " Years"; return "Your age is: " + approximateAge + " Years"; ; } 
13
ответ дан Doron 08 марта '11 в 10:25 2011-03-08 10:25

У меня есть настроенный метод расчета возраста, плюс сообщение о подтверждении бонуса на всякий случай:

 public void GetAge(DateTime dob, DateTime now, out int years, out int months, out int days) { years = 0; months = 0; days = 0; DateTime tmpdob = new DateTime(dob.Year, dob.Month, 1); DateTime tmpnow = new DateTime(now.Year, now.Month, 1); while (tmpdob.AddYears(years).AddMonths(months) < tmpnow) { months++; if (months > 12) { years++; months = months - 12; } } if (now.Day >= dob.Day) days = days + now.Day - dob.Day; else { months--; if (months < 0) { years--; months = months + 12; } days += DateTime.DaysInMonth(now.AddMonths(-1).Year, now.AddMonths(-1).Month) + now.Day - dob.Day; } if (DateTime.IsLeapYear(dob.Year)  dob.Month == 2  dob.Day == 29  now >= new DateTime(now.Year, 3, 1)) days++; } private string ValidateDate(DateTime dob) //This method will validate the date { int Years = 0; int Months = 0; int Days = 0; GetAge(dob, DateTime.Now, out Years, out Months, out Days); if (Years < 18) message = Years + " is too young. Please try again on your 18th birthday."; else if (Years >= 65) message = Years + " is too old. Date of Birth must not be 65 or older."; else return null; //Denotes validation passed } 

Вызов метода здесь и передайте значение datetime (MM/dd/yyyy, если сервер установлен в локали США). Замените это на любое сообщение или любой контейнер для отображения:

 DateTime dob = DateTime.Parse("03/10/1982"); string message = ValidateDate(dob); lbldatemessage.Visible = !StringIsNullOrWhitespace(message); lbldatemessage.Text = message ?? ""; //Ternary if message is null then default to empty string 

Помните, что вы можете отформатировать сообщение так, как вам нравится.

13
ответ дан DareDevil 22 янв. '14 в 10:23 2014-01-22 10:23
 private int GetAge(int _year, int _month, int _day { DateTime yourBirthDate= new DateTime(_year, _month, _day); DateTime todaysDateTime = DateTime.Today; int noOfYears = todaysDateTime.Year - yourBirthDate.Year; if (DateTime.Now.Month < yourBirthDate.Month || (DateTime.Now.Month == yourBirthDate.Month  DateTime.Now.Day < yourBirthDate.Day)) { noOfYears--; } return noOfYears; } 
11
ответ дан AEMLoviji 06 сент. '10 в 17:09 2010-09-06 17:09

Я использовал решение ScArcher2 для точного расчета года в возрасте лиц, но мне нужно было продолжить его и рассчитать месяцы и дни вместе с Годами.

  public static Dictionary<string,int> CurrentAgeInYearsMonthsDays(DateTime? ndtBirthDate, DateTime? ndtReferralDate) { //---------------------------------------------------------------------- // Can't determine age if we don't have a dates. //---------------------------------------------------------------------- if (ndtBirthDate == null) return null; if (ndtReferralDate == null) return null; DateTime dtBirthDate = Convert.ToDateTime(ndtBirthDate); DateTime dtReferralDate = Convert.ToDateTime(ndtReferralDate); //---------------------------------------------------------------------- // Create our Variables //---------------------------------------------------------------------- Dictionary<string, int> dYMD = new Dictionary<string,int>(); int iNowDate, iBirthDate, iYears, iMonths, iDays; string sDif = ""; //---------------------------------------------------------------------- // Store off current date/time and DOB into local variables //---------------------------------------------------------------------- iNowDate = int.Parse(dtReferralDate.ToString("yyyyMMdd")); iBirthDate = int.Parse(dtBirthDate.ToString("yyyyMMdd")); //---------------------------------------------------------------------- // Calculate Years //---------------------------------------------------------------------- sDif = (iNowDate - iBirthDate).ToString(); iYears = int.Parse(sDif.Substring(0, sDif.Length - 4)); //---------------------------------------------------------------------- // Store Years in Return Value //---------------------------------------------------------------------- dYMD.Add("Years", iYears); //---------------------------------------------------------------------- // Calculate Months //---------------------------------------------------------------------- if (dtBirthDate.Month > dtReferralDate.Month) iMonths = 12 - dtBirthDate.Month + dtReferralDate.Month - 1; else iMonths = dtBirthDate.Month - dtReferralDate.Month; //---------------------------------------------------------------------- // Store Months in Return Value //---------------------------------------------------------------------- dYMD.Add("Months", iMonths); //---------------------------------------------------------------------- // Calculate Remaining Days //---------------------------------------------------------------------- if (dtBirthDate.Day > dtReferralDate.Day) //Logic: Figure out the days in month previous to the current month, or the admitted month. // Subtract the birthday from the total days which will give us how many days the person has lived since their birthdate day the previous month. // then take the referral date and simply add the number of days the person has lived this month. //If referral date is january, we need to go back to the following year December to get the days in that month. if (dtReferralDate.Month == 1) iDays = DateTime.DaysInMonth(dtReferralDate.Year - 1, 12) - dtBirthDate.Day + dtReferralDate.Day; else iDays = DateTime.DaysInMonth(dtReferralDate.Year, dtReferralDate.Month - 1) - dtBirthDate.Day + dtReferralDate.Day; else iDays = dtReferralDate.Day - dtBirthDate.Day; //---------------------------------------------------------------------- // Store Days in Return Value //---------------------------------------------------------------------- dYMD.Add("Days", iDays); return dYMD; } 
8
ответ дан Dylan Hayes 12 авг. '11 в 23:53 2011-08-12 23:53

SQL-версия:

 declare @dd smalldatetime = '1980-04-01' declare @age int = YEAR(GETDATE())-YEAR(@dd) if (@dd> DATEADD(YYYY, -@age, GETDATE())) set @age = @age -1 print @age 
8
ответ дан xenedia 30 июня '16 в 14:24 2016-06-30 14:24

Я сделал небольшое изменение в ответе Марка Соена: я переписал третью строку, чтобы выражение можно было проанализировать немного легче.

 public int AgeInYears(DateTime bday) { DateTime now = DateTime.Today; int age = now.Year - bday.Year; if (bday.AddYears(age) > now) age--; return age; } 

Я также сделал это для ясности.

7
ответ дан cdiggins 16 июля '11 в 21:01 2011-07-16 21:01
  • 1
  • 2
  • 3

Другие вопросы по меткам или Задайте вопрос