- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这里有个问题。我见过很多解决方案,但似乎没有一个能满足我想要的标准......
我想以这种格式显示年龄
20 y(s) 2 m(s) 20 d(s)
20 y(s) 2 m(s)
2 m(s) 20 d(s)
20 d(s)
等...
我尝试了几种解决方案,但闰年是我的问题所在。由于闰年,我的单元测试总是失败,无论中间有多少天,闰年都会计算额外的天数。
这是我的代码....
public static string AgeDiscription(DateTime dateOfBirth)
{
var today = DateTime.Now;
var days = GetNumberofDaysUptoNow(dateOfBirth);
var months = 0;
var years = 0;
if (days > 365)
{
years = today.Year - dateOfBirth.Year;
days = days % 365;
}
if (days > DateTime.DaysInMonth(today.Year, today.Month))
{
months = Math.Abs(today.Month - dateOfBirth.Month);
for (int i = 0; i < months; i++)
{
days -= DateTime.DaysInMonth(today.Year, today.AddMonths(0 - i).Month);
}
}
var ageDescription = new StringBuilder("");
if (years != 0)
ageDescription = ageDescription.Append(years + " y(s) ");
if (months != 0)
ageDescription = ageDescription.Append(months + " m(s) ");
if (days != 0)
ageDescription = ageDescription.Append(days + " d(s) ");
return ageDescription.ToString();
}
public static int GetNumberofDaysUptoNow(DateTime dateOfBirth)
{
var today = DateTime.Now;
var timeSpan = today - dateOfBirth;
var nDays = timeSpan.Days;
return nDays;
}
有什么想法吗???
更新:
我希望两个日期之间的差异为:
var dateOfBirth = DateTime.Now.AddYears(-20);
string expected = "20 y(s) ";
string actual; // returns 20 y(s) 5 d(s)
actual = Globals.AgeDiscription(dateOfBirth);
Assert.AreEqual(expected, actual);
最佳答案
年龄是相当棘手的。这是我使用的结构的相关摘录。
public struct Age
{
private readonly Int32 _years;
private readonly Int32 _months;
private readonly Int32 _days;
private readonly Int32 _totalDays;
/// <summary>
/// Initializes a new instance of <see cref="Age"/>.
/// </summary>
/// <param name="start">The date and time when the age started.</param>
/// <param name="end">The date and time when the age ended.</param>
/// <remarks>This </remarks>
public Age(DateTime start, DateTime end)
: this(start, end, CultureInfo.CurrentCulture.Calendar)
{
}
/// <summary>
/// Initializes a new instance of <see cref="Age"/>.
/// </summary>
/// <param name="start">The date and time when the age started.</param>
/// <param name="end">The date and time when the age ended.</param>
/// <param name="calendar">Calendar used to calculate age.</param>
public Age(DateTime start, DateTime end, Calendar calendar)
{
if (start > end) throw new ArgumentException("The starting date cannot be later than the end date.");
var startDate = start.Date;
var endDate = end.Date;
_years = _months = _days = 0;
_days += calendar.GetDayOfMonth(endDate) - calendar.GetDayOfMonth(startDate);
if (_days < 0)
{
_days += calendar.GetDaysInMonth(calendar.GetYear(startDate), calendar.GetMonth(startDate));
_months--;
}
_months += calendar.GetMonth(endDate) - calendar.GetMonth(startDate);
if (_months < 0)
{
_months += calendar.GetMonthsInYear(calendar.GetYear(startDate));
_years--;
}
_years += calendar.GetYear(endDate) - calendar.GetYear(startDate);
var ts = endDate.Subtract(startDate);
_totalDays = (Int32)ts.TotalDays;
}
/// <summary>
/// Gets the number of whole years something has aged.
/// </summary>
public Int32 Years
{
get { return _years; }
}
/// <summary>
/// Gets the number of whole months something has aged past the value of <see cref="Years"/>.
/// </summary>
public Int32 Months
{
get { return _months; }
}
/// <summary>
/// Gets the age as an expression of whole months.
/// </summary>
public Int32 TotalMonths
{
get { return _years * 12 + _months; }
}
/// <summary>
/// Gets the number of whole weeks something has aged past the value of <see cref="Years"/> and <see cref="Months"/>.
/// </summary>
public Int32 Days
{
get { return _days; }
}
/// <summary>
/// Gets the total number of days that have elapsed since the start and end dates.
/// </summary>
public Int32 TotalDays
{
get { return _totalDays; }
}
/// <summary>
/// Gets the number of whole weeks something has aged past the value of <see cref="Years"/> and <see cref="Months"/>.
/// </summary>
public Int32 Weeks
{
get { return (Int32) Math.Floor((Decimal) _days/7); }
}
/// <summary>
/// Gets the age as an expression of whole weeks.
/// </summary>
public Int32 TotalWeeks
{
get { return (Int32) Math.Floor((Decimal) _totalDays/7); }
}
}
这是一个通过的示例单元测试:
[Test]
public void Should_be_exactly_20_years_old()
{
var now = DateTime.Now;
var age = new Age(now.AddYears(-20), now);
Assert.That(age, Has.Property("Years").EqualTo(20)
.And.Property("Months").EqualTo(0)
.And.Property("Days").EqualTo(0));
}
关于c# - 你如何使用出生日期计算 C# 中的年龄(考虑闰年),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10618207/
我有一个名为 reviews 的 MySql 表,它存储了很多产品评论,这些评论是多年来积累的,每条评论都带有日期时间戳。 我想绘制一个条形图,显示我一年中每天积累的评论数量,希望找到对我的系统重要的
我正在尝试整理一个结果集,该结果集提供按即将到来的生日排序的 5 个最接近的用户。在闰年开始发挥作用之前,这非常有效。例如: 5 月 15 日 - 还剩 96 天 5 月 15 日 - 还剩 97 天
我有这段代码,用户可以在其中输入开始日期,然后它会自动添加结束日期。结束日期是开始日期的 +3 天。问题是在 2 月、3 月 26 日至 31 日之后,输出错误的结束日期。它总是从 26-31 输出错
如何在 javascript 中获取两年(闰年)之间的小时差 我有两年2015年和2014年 var year1="2015"; var year="2016"; 我想通过一行代码获取上述年份之间的总
所以我使用此类“SimpleDateFormat”,以便我可以使用“DDD”将一年中的天数转换为日期。但是,我不确定这是否涵盖闰年,因为我没有看到可以指定今年是闰年的选项。如果我指定年份,它是否已经知
我正在做一项学校作业,我只是坚持这方面的逻辑。基本上需要验证 1900 年到 2099 年之间的正则表达式(日期)。天数不能超过最大月天数; (即 6 月有 30 天,所以 31 天无效)以及考虑闰年
我正在使用此 javascript 检查输入的年龄是否大于 18 岁。 function calculateDiffYear(date, month, year) {
我有一个我见过的最奇怪的练习:我必须通过在控制台中扫描年份来找到闰年,并控制它是否是闰年。 我只能使用+ -/* % 作为算术运算符;我不允许使用任何其他运算符或函数。 这是我目前所拥有的: i
我读过这个question但有很多评论,有人说它是准确的,有人说它不准确。 无论如何,我有这段代码可以用 Javascript 计算人的年龄: function calculateDiffYearB
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
问题在以下 fiddle 中得到了最好的描述: https://jsfiddle.net/bernhard_kern/85s2fm5a/3/ .我们使用两个系列和两个 xAxis。 xAxis: [{
哪个“更正确(逻辑上)”? 特定于闰年,而不是一般情况。 带括号 return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0) 没有 re
public static boolean isLeapYear(int year) { if ((year % 4) != 0) return false; else if (
我们都知道今天是一个特殊的日子。 2016 年 2 月 29 日是闰年。 我们从 Oracle 数据库中的某些表收到错误消息。错误为:Oracle ORA-01839:日期对于指定的月份无效。 例如,
我的应用程序中有日期字段,我们提供了日期选择器,但也允许用户以 YYYY/MM/DD 格式输入日期。现在,我们已经使用以下正则表达式处理了与日期格式和无效日期相关的验证: "date": /^(?!0
我是一名优秀的程序员,十分优秀!