例如,我尝试弹出一个显示给定日期的月份和年份的消息框我的输入是:
2012年7月和2013年2月
输出应该是:
2012年7月8日、2012年8月9日、2012月10日、2012日11月12日、2013年1月2日
我写道:
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;
上面的代码计算时间差,但我的输出尝试没有成功。
这里有一个开始的示例。
它提供了一个方便的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"
你可以用任何你喜欢的。
由于不能保证日期是同一天,因此可以使用此代码创建只考虑月初的新日期。
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));
仔细研究TimeSpan结构,它将帮助您更快地实现目标。
http://msdn.microsoft.com/en-us/library/system.timespan.aspx
您可以使用
TimeSpan dateDifference = endDate - begDate;
year = dateDifference.Days / 365;
month = dateDifference.Days / 30;
编辑:我忘了TimeSpan
没有Year
或Month
,对不起:(