c#给定日期之间的月份和年份

时间:2013-02-14 15:59:37

标签: c# datetime

我尝试弹出一个msgbox,显示给定日期的月份和年份 我的意见是:

2012年7月和2013年2月

,输出应为:

7 / 2012,8 / 2012,9 / 2012,10 / 2012,11 / 2012,12 / 2012,1 / 2013,2 / 2013

我写道:

    string datePart1;
    string datePart2;
    string[] date1 = new string[] { "" };
    string[] date2 = new string[] { "" };

    private void button1_Click(object sender, EventArgs e)
    {
        DateTime endDate = new DateTime(2013, 2, 1);  // i will be having the date time as a variable from a textbox
        DateTime begDate = new DateTime(2012, 7, 1);  // i will be having the date time as a variable from a text box

        int year, month;

        if (endDate.Month - begDate.Month < 0)
        {
            month = (endDate.Month - begDate.Month) + 12;
            endDate = new DateTime(endDate.Year - 1, endDate.Month, endDate.Day);
        }
        else
            month = endDate.Month - begDate.Month;

        year = endDate.Year - begDate.Year;

上面的代码计算时差,但我的输出尝试没有奏效。

4 个答案:

答案 0 :(得分:3)

这是一个让您入门的示例。

它提供了一个方便的MonthsInRange()方法,该方法返回指定范围内所有月份的序列。然后,您可以使用“M \\ / yyyy”(见下文)格式化返回的日期,以输出所需的格式。 (注意:这不是字母V,它是反斜杠后跟正斜杠!)

有关格式字符串的说明,请参阅Custom Date and Time Format Strings

using System;
using System.Collections.Generic;

namespace Demo
{
    public static class Program
    {
        static void Main(string[] args)
        {
            DateTime endDate = new DateTime(2013, 2, 1);
            DateTime begDate = new DateTime(2012, 7, 1);

            foreach (DateTime date in MonthsInRange(begDate, endDate))
            {
                Console.WriteLine(date.ToString("M\\/yyyy"));
            }
        }

        public static IEnumerable<DateTime> MonthsInRange(DateTime start, DateTime end)
        {
            for (DateTime date = start; date <= end; date = date.AddMonths(1))
            {
                yield return date;
            }
        }
    }
}

为什么“M \\ / yyyy”而不只是“M / yyyy”?

这是因为DateTime格式字符串中的“/”字符将被解释为“日期分隔符”,而不是文字“/”。在某些语言环境中,这将显示为“。”而不是“/".

要解决此问题,我们需要使用“\”字符来转义它。但是,我们不能只使用单个“\”,因为C#本身会将其解释为转义字符,并将使用它来转义后续字符。文字“\”的C#转义序列是“\\”,这就是为什么我们必须放“\\ /”而不只是“\ /”。

或者你可以通过在字符串前加上一个@字符来转义“\”字符的转义,如下所示:

@"M/yyyy"

您可以根据自己的喜好使用。

答案 1 :(得分:2)

由于您无法保证在同一天拥有日期,因此您可以使用此代码创建仅考虑当月第一天的新日期。

static IEnumerable<string> InclusiveMonths(DateTime start, DateTime end)
{
    // copies to ensure the same day.
    var startMonth = new DateTime(start.Year, start.Month, 1);
    var endMonth = new DateTime(end.Year, end.Month, 1);

    for (var current = startMonth; current <= endMonth; current = current.AddMonths(1))
        yield return current.ToString("M/yyyy");
}

// usage
foreach (var mmyyyy in InclusiveMonths(begDate, endDate))
{
    Console.WriteLine(mmyyyy);
}

var allMonths = string.Join(", ", InclusiveMonths(begDate, endDate));

答案 2 :(得分:0)

使用TimeSpan结构,它可以帮助您更快地实现目标。

http://msdn.microsoft.com/en-us/library/system.timespan.aspx

答案 3 :(得分:0)

您可以使用

TimeSpan dateDifference = endDate - begDate;
year = dateDifference.Days / 365;
month = dateDifference.Days / 30;

修改 我忘了TimeSpan没有YearMonth,抱歉:(