C#中基于出生日期的简单年龄计算器[重复]
Posted
技术标签:
【中文标题】C#中基于出生日期的简单年龄计算器[重复]【英文标题】:Simple Age Calculator base on date of birth in C# [duplicate] 【发布时间】:2014-12-17 16:50:32 【问题描述】:我创建了一个简单的年龄计算器。我想删除小数位,但问题是当我将now
减去到bday
时。
例子:我输入2012
、10
和23
,现在的日期是2014-10-22
,
因此,当2014.1022 - 2012.1023
结果为1.9999...
时,我想删除所有小数位并保留整数1
,但是当我使用String.Format("0:00"
时,即使我使用@,它也会将结果四舍五入为02
987654334@,我不想用split string它需要很多代码。
有什么想法吗?
static void Main(string[] args)
string year, month, day = string.Empty;
Console.WriteLine("Enter your Birthdate:");
Console.WriteLine("Year :");
year = Console.ReadLine();
Console.WriteLine("Month :");
month = Console.ReadLine();
Console.WriteLine("Day :" );
day = Console.ReadLine();
try
DateTime date = Convert.ToDateTime(year + "-" + month + "-" + day);
var bday = float.Parse(date.ToString("yyyy.MMdd"));
var now = float.Parse(DateTime.Now.ToString("yyyy.MMdd"));
if (now < bday)
Console.WriteLine("Invalid Input of date");
Console.ReadLine();
Console.WriteLine("Your Age is " + (String.Format("0:00", (now - bday)))); //it rounds off my float
Console.ReadLine();
catch (Exception ex)
Console.WriteLine(ex.ToString());
Console.ReadLine();
【问题讨论】:
你为什么不使用 TimeSpan 类? 1.你可以使用TimeSpan
。 2. 看看这个答案***.com/questions/16671165/… 了解如何自己计算日期
@JennyO'Reilly:你无法从 TimeSpan 到数年......
我不清楚您期望的结果是什么 - 考虑到一年的长度会有所不同,因此使用小数年数是没有意义的。用年、月和日来谈论更有意义。此外,将年-月-日值视为数值是一个非常糟糕的主意。它根本不会像你想要的那样运行......不要这样做。
@jon skeet 但这是准确的我想删除所有小数位并将整数作为结果
【参考方案1】:
与 cmets 不同,TimeSpan
在这里没有帮助你,因为一年不是固定的时间长度。这反过来又导致你表达的目标确实非常奇怪。您真的不应该将日期表示为小数,前两位数字是月份,第三和第四位数字是天。时间不是那样工作的。 (例如,考虑到 2014.0131 和 2014.0201 之间的差异远大于 2014.0130 和 2014.0131 之间的差异。)
最好用年、月和日来表示一个年龄。我的Noda Time 库让这变得非常简单:
LocalDate birthday = new LocalDate(1976, 6, 19); // For example
LocalDate today = LocalDateTime.FromDateTime(DateTime.Now).Date; // See below
Period period = Period.Between(birthday, today);
Console.WriteLine("You are 0 years, 1 months, 2 days old",
period.Years, period.Months, period.Days);
如果您只想确定年数,您可以决定只使用period.Years
,或者也可以根据period.Months
对结果进行四舍五入。
不过,我建议不要在生产代码中使用DateTime.Now
。在 Noda Time 中,我们有一个 IClock
接口,表示“一种获取当前时刻的方法”,在主程序集中有一个 SystemClock
实现,在测试程序集中有一个 FakeClock
实现。您的代码将接受IClock
(可能带有依赖注入),然后使用它来确定您感兴趣的任何时区的当前日期。这样,您可以为您喜欢的任何情况编写测试,而无需更改计算机的钟。总的来说,这是处理与时间相关的任务的好方法,IMO。
【讨论】:
【参考方案2】:在我们的框架中,我们使用以下方法:
/// <summary>
/// Calculates the age at the specified date.
/// </summary>
/// <param name="dateOfBirth">The date of birth.</param>
/// <param name="referenceDate">The date for which the age should be calculated.</param>
/// <returns></returns>
public static int Age(DateTime dateOfBirth, DateTime referenceDate)
int years = referenceDate.Year - dateOfBirth.Year;
dateOfBirth = dateOfBirth.AddYears(years);
if (dateOfBirth.Date > referenceDate.Date)
years--;
return years;
/// <summary>
/// Calculates the age at this moment.
/// </summary>
/// <param name="dateOfBirth">The date of birth.</param>
/// <returns></returns>
public static int Age(DateTime dateOfBirth)
return Age(dateOfBirth, DateTime.Today);
【讨论】:
【参考方案3】:Here 我找到了我的问题的答案,我使用LastIndexOf
删除某个字符后的所有字符串,即 point(.),但在此之前我将 float
转换为 string
。
很准确,试试看。 :)
static void Main(string[] args)
string year, month, day = string.Empty;
Console.WriteLine("Enter your Birthdate:");
Console.WriteLine("Year :");
year = Console.ReadLine();
Console.WriteLine("Month :");
month = Console.ReadLine();
Console.WriteLine("Day :" );
day = Console.ReadLine();
try
DateTime date = Convert.ToDateTime(year + "-" + month + "-" + day);
var bday = float.Parse(date.ToString("yyyy.MMdd"));
var now = float.Parse(DateTime.Now.ToString("yyyy.MMdd"));
if (now < bday)
Console.WriteLine("Invalid Input of date");
Console.ReadLine();
string age = (now - bday).ToString();
Console.WriteLine("Your Age is " + (age.Substring(0, age.LastIndexOf('.'))));
Console.ReadLine();
catch (Exception ex)
Console.WriteLine(ex.ToString());
Console.ReadLine();
【讨论】:
我投了反对票,因为发布了几个解决方案,但你仍然用一种非常复杂的方法来回答你自己的问题。 @JennyO'Reilly,你到底在说什么。我仍然没有得到他们的答案的任何解决方案。我试着自己解决它 您自己发布的解决方案实际上已经由我(使用 Math.Floor)和 Jon Skeet(转换为整数)使用更简单的方法提出。所以你的解决方案对我来说毫无意义。您的解决方案有何不同? @JennyO'Reilly 正如我对我的问题所说的那样,转换为整数会使我的数字四舍五入。我想要的只是删除小数位而不是四舍五入。 有什么区别? 1.999 四舍五入是 1。没有小数位的 1.999 是 1。1 = 1。以上是关于C#中基于出生日期的简单年龄计算器[重复]的主要内容,如果未能解决你的问题,请参考以下文章