首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果今天是一个即将到来的周年纪念日(基于某个开始日期),什么是最好的计算方法?

如果今天是一个即将到来的周年纪念日(基于某个开始日期),什么是最好的计算方法?
EN

Stack Overflow用户
提问于 2013-05-09 02:02:12
回答 4查看 761关注 0票数 1

我有一些能得到约会的密码:

代码语言:javascript
复制
 DateTime startDate = new DateTime(2010, 1,4);

我想要创建一个函数

代码语言:javascript
复制
 string message = CalculateUpcomingAnniversary(startDate);

我正在计算今天是否是即将到来的周年纪念日

因此,如果在接下来的5天里有周年纪念(考虑到这个开始日期),我希望有一个函数,返回类似于"3周年纪念日即将到来的4天…“。

另外,我只想返回空字符串。最有效的计算方法是什么?

因此,考虑到上面的开始日期,如果我今天运行它,它将返回一个空字符串,但是如果我在2014年1月5日运行这个函数,它将返回一个字符串"4周年1天

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-05-09 02:04:52

您可能希望将其分成两个函数。首先要找到这样的下一个周年纪念日:

代码语言:javascript
复制
public DateTime GetNextAnniversary(DateTime startDate)
{
    var now = DateTime.Now
    var next = startDate.AddYears(now.Year - startDate.Year);
    return now > next ? next.AddYears(1) : next;
}

您可以这样格式化日期:

代码语言:javascript
复制
public string GetAnniversaryString(DateTime startDate)
{
    var next = GetNextAnniversary(startDate);
    int nYears = next.Year - startDate.Year;
    var span = next - DateTime.Now;
    return span.Days <= 5 
        ? string.Format("{0} year anniversary in {1} days", nYears, span.Days)
        : string.Empty;
}

或者更完整的方法可能如下所示:

代码语言:javascript
复制
var now = DateTime.Now;
var next = GetNextAnniversary(startDate);
int nYears = next.Year - startDate.Year;
var span = next - DateTime.Now;
if (span.Days <= 30)
{
    return string.Format("{0} year anniversary in {1} days", nYears, span.Days);
}
else
{
    int months = next.Month - startDate.Month;
    if (next.Year > now.Year)
    {
        months += CultureInfo.CurrentCulture.Calendar.GetMonthsInYear(now.Year);
    }

    return string.Format("{0} year anniversary in {1} months", nYears, months);
}

当然,这是一个相当粗糙的字符串格式函数,可以大大改进。

票数 5
EN

Stack Overflow用户

发布于 2013-05-09 02:24:35

我建议如下(根据要求检查<5天的提前通知):

代码语言:javascript
复制
DateTime _now = DateTime.Now;

TimeSpan _ts = _now - startDate;

// days till anniversary
if(_ts.Days>5) return null;

// next anniversary, intermediate result
DateTime _nextAnniversary = new DateTime(_now.Year, startDate.Month, startDate.Day);

// next anniversary, final result
return (_now > _nextAnniversary )? _nextAnniversary.AddYears(1):_nextAnniversary;

这个代码片段可以封装成完整的函数,它可以返回_ts.Days_nextAnniversary值(然后您应该定义一些要返回的结构或对象),或者只返回_nextAnniversary,因为可以像代码(_ts.Days)中所示的那样轻松地计算未来的日子。

票数 0
EN

Stack Overflow用户

发布于 2013-05-09 05:02:31

代码语言:javascript
复制
 protected void Page_Load(object sender, EventArgs e)
        {

            GetAnniversarydate();   


        }

 protected void GetAnniversarydate()
        { 
         DateTime _anniversarydate = new DateTime(2005, 6, 9);

            DateTime _currentdate = Convert.ToDateTime(DateTime.Now.ToShortDateString());

            //Comparing the anniversary day and month with current day and month
            if ((_anniversarydate.Day == _currentdate.Day) && (_anniversarydate.Month == _currentdate.Month))
            {
                int _Yeardifference = _currentdate.Year - _anniversarydate.Year;

                Response.Write(string.Format("Today is your {0} anniversary",_Yeardifference));

            }
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16453186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档