C#中基于出生日期的简单年龄计算器[重复]

Posted

技术标签:

【中文标题】C#中基于出生日期的简单年龄计算器[重复]【英文标题】:Simple Age Calculator base on date of birth in C# [duplicate] 【发布时间】:2014-12-17 16:50:32 【问题描述】:

我创建了一个简单的年龄计算器。我想删除小数位,但问题是当我将now 减去到bday 时。

例子:我输入20121023,现在的日期是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#中基于出生日期的简单年龄计算器[重复]的主要内容,如果未能解决你的问题,请参考以下文章

根据出生年份计算年龄的公式,如何根据出生日期求年龄?

Java 根据出生日期获得年龄

出生日期,根据出生日期怎么算年龄?

出生日期直接算出年龄,excel按出生日期算年龄函数

MySQL通过出生日期计算年龄

excel 中把身份证号转换成年龄和出生日期的公式是啥?