C# 日期时间范围

C# datetime scope

假设我无法更改 returns 数据的服务,我只剩下

var date = "20140231";
var scope = DateTime.ParseExact(date, "yyyyMMdd", CultureInfo.CurrentCulture);

很明显,“20140231”是 2 月底 的懒惰说法。输入“20140231”获取 2 月最后一个日期的最简洁方法是什么?

有 1 个约束 - 这应该适用于 .net 2.0。

您可以创建一个 while,将日期分割成多个部分,并不断从天部分中减去一个,直到它成为一个有效日期。不过,这确实应该在入口端修复。

试试这个:

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);
}

February can have only 28 or 29 days depends on current year is a leap year与否。

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

二月的最后一天你可以很清楚的点赞;

DateTime lastDayOfFebruary = (new DateTime(2014, 2, 1)).AddMonths(1).AddDays(-1);

如果您的服务总是将年份作为前 4 个字符,您可以使用 .Substring() to get year and pass DateTime constructor 作为年份。

var date = "20140231";
string year = date.Substring(0, 4);
DateTime lastDayOfFebruary = (new DateTime(int.Parse(year), 2, 1)).AddMonths(1).AddDays(-1);
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));