C# 使用C的年份日期差异#
如何计算年内两个日期之间的日期差C# 使用C的年份日期差异#,c#,date,datediff,C#,Date,Datediff,如何计算年内两个日期之间的日期差 例如:(Datetime.Now.Today()-11/03/2007)以年为单位。我已经编写了一个实现,可以正确地处理相隔一年的日期 但是,与其他算法不同,它不能优雅地处理负时间跨度。它也不使用自己的日期算法,而是依赖于标准库 不用多说,下面是代码: DateTime zeroTime=新的DateTime(1,1,1); DateTime a=新的DateTime(2007,1,1); DateTime b=新的DateTime(2008,1,1); 时间跨
例如:
(Datetime.Now.Today()-11/03/2007)
以年为单位。我已经编写了一个实现,可以正确地处理相隔一年的日期
但是,与其他算法不同,它不能优雅地处理负时间跨度。它也不使用自己的日期算法,而是依赖于标准库
不用多说,下面是代码:
DateTime zeroTime=新的DateTime(1,1,1);
DateTime a=新的DateTime(2007,1,1);
DateTime b=新的DateTime(2008,1,1);
时间跨度=b-a;
//因为我们从公历的第一年开始
//日历,我们必须在这里减去一年。
整数年=(零时间+跨度);
//1,其中我的另一个算法得到0。
Console.WriteLine(“年过去:+年”);
不清楚您希望如何处理小数年,但可能是这样的:
DateTime now = DateTime.Now;
DateTime origin = new DateTime(2007, 11, 3);
int calendar_years = now.Year - origin.Year;
int whole_years = calendar_years - ((now.AddYears(-calendar_years) >= origin)? 0: 1);
int another_method = calendar_years - ((now.Month - origin.Month) * 32 >= origin.Day - now.Day)? 0: 1);
使用后的平均天数。使用:
int Years(DateTime start, DateTime end)
{
return (end.Year - start.Year - 1) +
(((end.Month > start.Month) ||
((end.Month == start.Month) && (end.Day >= start.Day))) ? 1 : 0);
}
我希望下面的链接能有所帮助 这里甚至有C#的例子。只需单击C语言选项卡
祝你好运如果你在处理月份和年份的问题,你需要知道每个月有多少天,哪些年份是闰年 输入(以及其他特定于区域性的实现) 虽然Calendar没有提供直接计算两个时间点之间差异的方法,但它确实有如下方法
DateTime AddWeeks(DateTime time, int weeks)
DateTime AddMonths(DateTime time, int months)
DateTime AddYears(DateTime time, int years)
我实现了一种扩展方法,以获得两个日期之间的年数,四舍五入为整月
/// <summary>
/// Gets the total number of years between two dates, rounded to whole months.
/// Examples:
/// 2011-12-14, 2012-12-15 returns 1.
/// 2011-12-14, 2012-12-14 returns 1.
/// 2011-12-14, 2012-12-13 returns 0,9167.
/// </summary>
/// <param name="start">
/// Stardate of time period
/// </param>
/// <param name="end">
/// Enddate of time period
/// </param>
/// <returns>
/// Total Years between the two days
/// </returns>
public static double DifferenceTotalYears(this DateTime start, DateTime end)
{
// Get difference in total months.
int months = ((end.Year - start.Year) * 12) + (end.Month - start.Month);
// substract 1 month if end month is not completed
if (end.Day < start.Day)
{
months--;
}
double totalyears = months / 12d;
return totalyears;
}
//
///获取两个日期之间的总年数,四舍五入为整月。
///示例:
///2011-12-1412012-12-15返回1。
///2011-12-1412012-12-14返回1。
///2011-12-1412012-12-13返回09167。
///
///
///时段开始日期
///
///
///时间段的结束日期
///
///
///两天之间的总年数
///
公共静态双差总计(此日期时间开始,日期时间结束)
{
//获得总月份的差异。
整月=((年末-年初)*12)+(月末-月初);
//如果月末未完成,则减去1个月
如果(结束日<开始日)
{
月--;
}
双倍总年=月/12d;
回归年数;
}
我们必须对检查进行编码,以确定两个日期(开始日期和结束日期)之间的差异是否大于2年
多亏了上面的提示,操作如下:
DateTime StartDate = Convert.ToDateTime("01/01/2012");
DateTime EndDate = Convert.ToDateTime("01/01/2014");
DateTime TwoYears = StartDate.AddYears(2);
if EndDate > TwoYears .....
我在以下网站上找到:
要计算经过的年份(年龄),结果将为负1
var timeSpan = DateTime.Now - birthDateTime;
int age = new DateTime(timeSpan.Ticks).Year - 1;
这里有一个巧妙的技巧,让系统自动处理闰年。它给出了所有日期组合的准确答案
DateTime dt1 = new DateTime(1987, 9, 23, 13, 12, 12, 0);
DateTime dt2 = new DateTime(2007, 6, 15, 16, 25, 46, 0);
DateTime tmp = dt1;
int years = -1;
while (tmp < dt2)
{
years++;
tmp = tmp.AddYears(1);
}
Console.WriteLine("{0}", years);
DateTime dt1=新的日期时间(1987,9,23,13,12,12,0);
DateTime dt2=新的日期时间(2007,6,15,16,25,46,0);
日期时间tmp=dt1;
整数年=-1;
而(tmp
如果你出于琐碎的原因需要了解某人的年龄,那么Timespan是可以的,但是如果你出于财务、科学或法律目的需要计算退休金、长期存款或其他任何东西,那么我担心Timespan不够准确,因为Timespan假设每年都有相同的天数,相同的小时数和相同的秒数)
事实上,某些年份的长度会有所不同(原因不同,超出了本答案的范围)。要绕过Timespan的限制,您可以模仿Excel的功能,即:
public int GetDifferenceInYears(DateTime startDate, DateTime endDate)
{
//Excel documentation says "COMPLETE calendar years in between dates"
int years = endDate.Year - startDate.Year;
if (startDate.Month == endDate.Month &&// if the start month and the end month are the same
endDate.Day < startDate.Day// AND the end day is less than the start day
|| endDate.Month < startDate.Month)// OR if the end month is less than the start month
{
years--;
}
return years;
}
public int getDifferenceInEars(日期时间开始日期、日期时间结束日期)
{
//Excel文档显示“日期之间的完整日历年”
int YERS=endDate.Year-startDate.Year;
if(startDate.Month==endDate.Month&&//如果开始月份和结束月份相同
endDate.Day
简单解决方案:
public int getYearDiff(DateTime startDate, DateTime endDate){
int y = Year(endDate) - Year(startDate);
int startMonth = Month(startDate);
int endMonth = Month(endDate);
if (endMonth < startMonth)
return y - 1;
if (endMonth > startMonth)
return y;
return (Day(endDate) < Day(startDate) ? y - 1 : y);
}
public int getYearDiff(日期时间开始日期,日期时间结束日期){
int y=年(结束日期)-年(开始日期);
int startMonth=月份(起始日期);
int endMonth=月(endDate);
如果(月末<开始月)
返回y-1;
如果(月末>开始月)
返回y;
报税表(日(截止日期)<日(起始日期)?y-1:y;
}
也许这有助于回答以下问题:给定年份的天数
new DateTime(anyDate.Year, 12, 31).DayOfYear //will include leap years too
关于。这是计算年和月差异的最佳代码:
DateTime firstDate = DateTime.Parse("1/31/2019");
DateTime secondDate = DateTime.Parse("2/1/2016");
int totalYears = firstDate.Year - secondDate.Year;
int totalMonths = 0;
if (firstDate.Month > secondDate.Month)
totalMonths = firstDate.Month - secondDate.Month;
else if (firstDate.Month < secondDate.Month)
{
totalYears -= 1;
int monthDifference = secondDate.Month - firstDate.Month;
totalMonths = 12 - monthDifference;
}
if ((firstDate.Day - secondDate.Day) == 30)
{
totalMonths += 1;
if (totalMonths % 12 == 0)
{
totalYears += 1;
totalMonths = 0;
}
}
DateTime firstDate=DateTime.Parse(“2019年1月31日”);
DateTime secondDate=DateTime.Parse(“2/1/2016”);
int totalYears=firstDate.Year-secondDate.Year;
int totalMonths=0;
如果(firstDate.Month>secondDate.Month)
totalMonths=firstDate.Month-secondDate.Month;
else if(firstDate.Month
工作完美:
internal static int GetDifferenceInYears(DateTime startDate)
{
int finalResult = 0;
const int DaysInYear = 365;
DateTime endDate = DateTime.Now;
TimeSpan timeSpan = endDate - startDate;
if (timeSpan.TotalDays > 365)
{
finalResult = (int)Math.Round((timeSpan.TotalDays / DaysInYear), MidpointRounding.ToEven);
}
return finalResult;
}
以下是基于Dana的简单代码,该代码在大多数情况下生成正确答案。但它并没有考虑到两个日期之间不到一年的时间。下面是我用来产生一致结果的代码:
public static int DateDiffYears(DateTime startDate, DateTime endDate)
{
var yr = endDate.Year - startDate.Year - 1 +
(endDate.Month >= startDate.Month && endDate.Day >= startDate.Day ? 1 : 0);
return yr < 0 ? 0 : yr;
}
public static int DateDiffYears(DateTime startDate,DateTime endDate)
{
var yr=结束日期。年份-开始日期。年份-1+
(endDate.Month>=startDate.Month&&endDate.Day>=startDate.Day?1:0);
年回报率<0?0:年;
}
处理
public int getYearDiff(DateTime startDate, DateTime endDate){
int y = Year(endDate) - Year(startDate);
int startMonth = Month(startDate);
int endMonth = Month(endDate);
if (endMonth < startMonth)
return y - 1;
if (endMonth > startMonth)
return y;
return (Day(endDate) < Day(startDate) ? y - 1 : y);
}
new DateTime(anyDate.Year, 12, 31).DayOfYear //will include leap years too
DateTime firstDate = DateTime.Parse("1/31/2019");
DateTime secondDate = DateTime.Parse("2/1/2016");
int totalYears = firstDate.Year - secondDate.Year;
int totalMonths = 0;
if (firstDate.Month > secondDate.Month)
totalMonths = firstDate.Month - secondDate.Month;
else if (firstDate.Month < secondDate.Month)
{
totalYears -= 1;
int monthDifference = secondDate.Month - firstDate.Month;
totalMonths = 12 - monthDifference;
}
if ((firstDate.Day - secondDate.Day) == 30)
{
totalMonths += 1;
if (totalMonths % 12 == 0)
{
totalYears += 1;
totalMonths = 0;
}
}
internal static int GetDifferenceInYears(DateTime startDate)
{
int finalResult = 0;
const int DaysInYear = 365;
DateTime endDate = DateTime.Now;
TimeSpan timeSpan = endDate - startDate;
if (timeSpan.TotalDays > 365)
{
finalResult = (int)Math.Round((timeSpan.TotalDays / DaysInYear), MidpointRounding.ToEven);
}
return finalResult;
}
public static int DateDiffYears(DateTime startDate, DateTime endDate)
{
var yr = endDate.Year - startDate.Year - 1 +
(endDate.Month >= startDate.Month && endDate.Day >= startDate.Day ? 1 : 0);
return yr < 0 ? 0 : yr;
}