我创建了一个简单的年龄计算器。我想删除小数位,但问题是当我将now
减去bday
时。
示例:我输入2012
,10
和23
,现在日期为2014-10-22
,
因此,当2014.1022 - 2012.1023
结果为1.9999...
时,我想删除所有小数位并保留整数1
,但我使用的时间String.Format("{0:00}"
它将结果四舍五入02
即使我使用ConvertToInt32
,我也不想使用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();
}
}
}
答案 0 :(得分:10)
与评论相反,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
界面代表&#34;一种获取当前时刻的方法&#34;,在主程序集中有一个SystemClock
实现,并且FakeClock
在测试程序集中实现。您的代码将接受IClock
(可能具有依赖注入),然后使用它来确定您感兴趣的任何时区中的当前日期。这样,您可以针对您喜欢的任何情况编写测试,无需更换计算机的时钟。这是一般处理与时间相关的任务的好方法,IMO。
答案 1 :(得分:3)
在我们的框架中,我们使用以下方法:
/// <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);
}
答案 2 :(得分:-1)