我尝试弹出一个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;
上面的代码计算时差,但我的输出尝试没有奏效。
答案 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
没有Year
或Month
,抱歉:(