对于以下json:
{
"id": "100001","Emp": {"data": [
{
"birthday": "08/14/1987",
"id": "52442"
},
{
"id": "52554"
},
{
"id": "54281"
},
{
"birthday": "04/08/1986",
"id": "54353"
},
{
"id": "58667"
},
{
"birthday": "12/20",
"id": "61435"
},
{
"id": "62794"
},
{
"id": "64577"
},
{
"birthday": "08/12",
"id": "65151"
},
{
"birthday": "11/15/1988",
"id": "66075"
},
{
"birthday": "08/02",
"id": "68282"
},
{
"birthday": "05/01",
"id": "70120"
},
{
"birthday": "12/24/1989",
"id": "74611"
},
{
"birthday": "06/18",
"id": "10293"
}
],
}
}
有些Emp
个对象没有birthday
属性,有些生日没有定义年份。
现在我的任务是从今天开始接下来的30个Emp对象生日
我的代码就像这样
var response = e.Result;
var jsonData = JsonConvert.DeserializeObject<RootObject>(response);
jsonData.emp.data = jsonData.friends.data.Where(BdayItems => (BdayItems.birthday != null && DateTime.Parse(BdayItems.birthday)<= DateTime.Today.AddDays(30))).OrderBy(BdayItems => BdayItems.birthday).ToList();
我还尝试在LINQ查询中使用.AddYear(-1)
删除年份。
但是接下来的30天我没有得到所有Emp
生日列表,但我只需要从今天开始的30天
答案 0 :(得分:2)
我认为您需要先将生日转换为当前年份。您可以通过添加生日年份和当前年份之间的差异来实现此目的。或者,如果您关心处理闰年的特定方法,只需使用DateTime构造函数和您自己的闰年处理算法。
此外,如另一个答案所述,您应该确保生日(当年)是当前日期或之后。
根据要求,这是一个实现此目的的方法示例。这使用了AddYears的闰年处理。
jsonData.friends.data.Where(BdayItems =>
{
if (BdayItems.birthday != null)
{
var originalBirthday = DateTime.Parse(BdayItems.birthday);
var today = DateTime.Today; //Storing this prevents a race condition.
var birthdayThisYear = originalBirthday.AddYears(today.Years - originalBirthday.Years);
var thirtyDaysFromNow = today.AddDays(30);
return birthdayThisYear >= today && birthdayThisYear <= thirtyDaysFromNow;
}
return false;
});
我正在使用手机,所以我没有测试过。在实际应用程序中使用逻辑之前,请确保逻辑符合您的要求。我建议您使用单元测试以确保其正常运行。
答案 1 :(得分:1)
您还必须提供条件:
DateTime.Parse(BdayItems.birthday) >= DateTime.Today
即:
jsonData.friends.data.Where(BdayItems => (BdayItems.birthday != null &&
DateTime.Parse(BdayItems.birthday) >= DateTime.Today &&
DateTime.Parse(BdayItems.birthday)<= DateTime.Today.AddDays(30))).OrderBy(BdayItems => BdayItems.birthday).ToList();
答案 2 :(得分:0)
您遇到的问题是DateTime
无法解释空白年份。如果没有提供年份,则假定它是当前的年份。那就是:
string stringDate = "05/01";
int year = DateTime.Parse(stringDate).Year; // -> 2013
此外,如果日期为空,则无论如何都会考虑某个日期。
因此,你能解决问题的最好方法是考虑字符串而不是日期;一旦所有信息完成(日,月和年),就开始考虑日期。
除此之外,您的查询无法提供您想要的结果(但其他答案已经解决了这个问题)。