2

我尝试弹出一个显示给定日期的月份和年份的 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

4 回答 4

3

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

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

有关格式字符串的说明,请参阅自定义日期和时间格式字符串。

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"

你可以使用任何你喜欢的。

于 2013-02-14T16:14:43.733 回答
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));
于 2013-02-14T16:11:04.160 回答
0

研究使用 TimeSpan 结构,它将帮助您更快地实现目标。

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

于 2013-02-14T16:04:06.837 回答
0

您可以使用

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

编辑: 我忘了TimeSpan没有功能YearMonth,对不起:(

于 2013-02-14T16:04:07.370 回答