c# - 基于 C# 中出生日期的简单年龄计算器

标签 c# datetime decimal calculator

<分区>

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

示例:我输入20121023,现在的日期是2014- 10-22, 所以当 2014.1022 - 2012.1023 结果将是 1.9999... 我想删除所有小数位并保留整数 1,但是当我使用 String.Format("{0:00}" 时,即使我使用 ConvertToInt32,它也会将结果四舍五入为 02,我不'想使用 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 在这里没有帮助您,因为一年不是固定的时间长度。这反过来导致你表达的目标确实非常奇怪。你真的不应该将日期表示为小数,前两位数字是月份,第三和第四位数字是天。时间不是那样运作的。 (例如,考虑 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 接口(interface)表示“一种及时获取当前时刻的方法”,在主程序集中有一个 SystemClock 实现和一个 FakeClock 在测试程序集中实现。您的代码将接受一个 IClock(可能带有依赖注入(inject)),然后使用它来确定您感兴趣的任何时区的当前日期。这样,您可以为任何您喜欢的情况编写测试, 而无需更改计算机的时钟。 IMO,这是处理一般时间相关任务的好方法。

关于c# - 基于 C# 中出生日期的简单年龄计算器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26504044/

相关文章:

c# - 跨域Cors问题

c# - 为同一个 API 创建的多个文档

java - 在 Java 中将字符串转换为 OffsetDateTime

ios - 如何从字符串中解析十进制而不丢失精度?

c# - Json.Net 两次没有以相同的方式序列化小数

c# - 如何动态引用 ExpandoObject 中的字段?

c# - 删除 Entity Framework 中的项目列表

c# - 在数据库中插入日期

MySQL 选择指定日期在开始日期和结束日期之间的行

javascript 函数 Math.pow 从输入文本中获取十进制值