计算生日的剩余天数?

Posted

技术标签:

【中文标题】计算生日的剩余天数?【英文标题】:Calculate days remaining to a birthday? 【发布时间】:2010-11-13 07:18:39 【问题描述】:

我有一个带有某人生日的 DateTime 对象。我使用这个人的出生年月日创建了这个对象,方法如下:

DateTime date = new DateTime(year, month, day);

我想知道距离此人的下一个生日还有多少天。在 C# 中这样做的最佳方法是什么(我是该语言的新手)?

【问题讨论】:

@Mitch - 听起来是这样,但全文搜索在几秒钟内没有找到骗子,所以我想我会用清晰的方式写下这个问题...... 类似于***.com/questions/9/… @Russ - 抱歉,这是一个不同的问题。有一些相似之处,但肯定不一样(最好的证明是答案不同......) 【参考方案1】:
// birthday is a DateTime containing the birthday

DateTime today = DateTime.Today;
DateTime next = new DateTime(today.Year,birthday.Month,birthday.Day);

if (next < today)
    next = next.AddYears(1);

int numDays = (next - today).Days;

如果生日是 2 月 29 日,这个简单的算法就会失败。这是替代方案(这与 Seb Nilsson 的答案基本相同:

DateTime today = DateTime.Today;
DateTime next = birthday.AddYears(today.Year - birthday.Year);

if (next < today)
    next = next.AddYears(1);

int numDays = (next - today).Days;

【讨论】:

TotalDays 返回双精度:msdn.microsoft.com/en-us/library/system.timespan.totaldays.aspx +1 这与我现在使用的“手动”方式很接近,我想也许有一个巧妙的 C# 技巧可以简化它。 +1,我以为他使用了 DateTime.Now,其中包括当前时间。 如果生日是 2 月 29 日并且当前年份不是闰年,这将失败 这很好,很优雅,但是 2 月 29 日的处理有一个额外的边缘情况被遗漏了。考虑以下条件:生日是 2 月 29 日,并且已经过去,今年不是闰年,但下一年是。使用上面的当前逻辑,计算出的“天数”将比应有的天数少一,因为即使是闰年,您也会将 1 年添加到 2 月 28 日。请参阅我的答案以了解细微的单行调整。【参考方案2】:

试试这个方法

private int GetDaysBeforeBirthday(DateTime birthdate)

    DateTime nextBday = new DateTime(DateTime.Now.Year, birthdate.Month, birthdate.Day);
    if (DateTime.Today > nextBday)
        nextBday = nextBday.AddYears(1);
    return (nextBday - DateTime.Today).Days;

只要过了你的生日,它就会返回你下一个生日前的剩余天数

【讨论】:

这与 Philippe 的回答有何不同?【参考方案3】:

使用今天的年份和生日的月份和日期不适用于闰年

经过一些测试,我开始工作了:

private static int GetDaysUntilBirthday(DateTime birthday) 
    var nextBirthday = birthday.AddYears(DateTime.Today.Year - birthday.Year);
    if(nextBirthday < DateTime.Today) 
        nextBirthday = nextBirthday.AddYears(1);
    
    return (nextBirthday - DateTime.Today).Days;

在闰年的 2 月 29 日以及生日是同一天进行测试。

【讨论】:

这是唯一可以 100% 工作的方法。原因是它使用了AddYears,它在二月的最后一个日期永远不会失败。【参考方案4】:
        DateTime Variable = DateTime.Now;
        int NumOfDaysTillNextMonth = 0;
        while (Variable < Comparer) //Comparer is just a target datetime
        
            Variable = Variable.AddDays(1);
            NumOfDaysTillNextMonth++;
        

刚刚为一个程序必须这样做。如果您只需要剩余天数,那么与其他方法相比,它就足够简单了。

【讨论】:

【参考方案5】:

这是基于 Philippe Leybaert 上面的回答,但处理了一个额外的边缘情况,我认为在之前的任何答案中都没有考虑到这一情况。

我要解决的极端情况是生日在闰日,今年的生日在过去,当年不是闰年,但下一年是。

当前提供的答案将减少一天,因为它将“下一个”设置为当年的 2 月 28 日,然后添加一年,使日期为闰年的 2 月 28 日(这是不正确的)。更改一行可以处理这种极端情况。

DateTime today = DateTime.Today;
DateTime next = birthday.AddYears(today.Year - birthday.Year);

if (next < today)

    if (!DateTime.IsLeapYear(next.Year + 1))
        next = next.AddYears(1);
    else
        next = new DateTime(next.Year + 1, birthday.Month, birthday.Day);


int numDays = (next - today).Days;

更新:根据 Philippe 指出我的代码存在相当大的缺陷进行了编辑。

【讨论】:

当今天的年份是除闰年之前的一年和生日为 2 月 29 日之外的任何年份时,此代码会崩溃。 这应该(现在)被接受,因为它可以正确处理包括闰年在内的所有日期【参考方案6】:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1

    class Program
    
        static void Main(string[] args)
        
            DateTime dt1 = DateTime.Parse("09/08/2012");
            DateTime dt2 = DateTime.Parse(DateTime.Now.ToString());
            int days = (dt2 - dt1).Days;
            Console.WriteLine(days);

            double month = (dt2 - dt1).Days / 30;
            Console.WriteLine(month);
            double year = (dt2 - dt1).Days / 365;
            Console.WriteLine(year);
            Console.Read();
        
    

【讨论】:

以上是关于计算生日的剩余天数?的主要内容,如果未能解决你的问题,请参考以下文章

计算剩余天数[重复]

计算剩余天数[重复]

如何计算给定日期的剩余天数、小时数、分钟数和秒数?

计算剩余天数的批处理脚本

sql 如何计算财务季度结束前的剩余天数

sql 如何使用SQL计算日历季度的剩余天数