C#日期时间范围

C#日期时间范围,c#,string,datetime,C#,String,Datetime,假设我不能更改返回数据的服务,那么我就只能 var date = "20140231"; var scope = DateTime.ParseExact(date, "yyyyMMdd", CultureInfo.CurrentCulture); 显然,“20140231”是一种懒散的说法,表示二月底。输入“20140231”获取2月最后日期的最干净方法是什么 有一个限制-这应该适用于.net 2.0。您可以在创建的同时将日期切分,并从日期部分中不断减去一个,直到它成为有效日期。不过,这确实应

假设我不能更改返回数据的服务,那么我就只能

var date = "20140231";
var scope = DateTime.ParseExact(date, "yyyyMMdd", CultureInfo.CurrentCulture);
显然,“20140231”是一种懒散的说法,表示二月底。输入“20140231”获取2月最后日期的最干净方法是什么


有一个限制-这应该适用于.net 2.0。

您可以在创建
的同时将日期切分,并从日期部分中不断减去一个,直到它成为有效日期。不过,这确实应该在入口端解决

试试这个:

var date = "20140231";
DateTime scope;
bool dateValid = DateTime.TryParseExact(date, "yyyyMMdd", CultureInfo.CurrentCulture, DateTimeStyles.None, out scope);

while (!dateValid)
{
    string yearMonth = date.Substring(0, 4);
    int day = Convert.ToInt32(date.Substring(6, 2));

    if (day > 1)
    {
        day--;
    }
    else
    {
        break;
    }

    date = yearMonth + day.ToString().PadLeft(2, '0');

    dateValid = DateTime.TryParseExact(date, "yyyyMMdd", CultureInfo.CurrentCulture, DateTimeStyles.None, out scope);
}
只能有
28
29
天,具体取决于当前年份是否为a

任何一年都不能有
30
31
天。这就是您无法成功解析
20140231
字符串的原因

你可以清楚地看到二月的最后一天

DateTime lastDayOfFebruary = (new DateTime(2014, 2, 1)).AddMonths(1).AddDays(-1);
如果您的服务总是将“获取年份”作为前4个字符,则可以使用“获取年份”和“通过年份”

var date = "20140231";
string year = date.Substring(0, 4);
DateTime lastDayOfFebruary = (new DateTime(int.Parse(year), 2, 1)).AddMonths(1).AddDays(-1);

那么闰年呢?20140230呢?这个例子不是随机选择的。我仍然希望输入29、30、31的月份的最后日期。如果日期是固定的8字符数据,为什么不自己将年份、月份和日期分开,然后计算出所需的内容。。这是如何转换服务提供的日期的?因此,在这种情况下,新的DateTime(int.Parse(date.Substring(1,4))、int.Parse(date.Substring(5,6))、int.Parse(date.Substring(7,8))将返回3月3日?我可以做新的DateTime(int.Parse(date.Substring(1,4)),int.Parse(date.Substring(5,6)),1).AddMonths(1.AddDays(-1)和take min,但这不是很干净。@PatrickHofman OP无法在公历中解析
20140231
字符串,因为没有这样的日期。如果服务返回的字符串总是以年份作为前4个字符,那么他可以在
DateTime
构造函数中传递该值。@SonerGönül:我想这就是问题所在。服务返回的日期无效。@PatrickHofman完全正确。我们无法分析不作为
日期时间存在的字符串
string date = "20140231";
DateTime result;
int year = Convert.ToInt32(date.Substring(0, 4));
int month = Convert.ToInt32(date.Substring(4, 2));
int day = Convert.ToInt32(date.Substring(6, 2));

result = new DateTime(year, month, Math.Min(DateTime.DaysInMonth(year, month), day));