0

对于以下 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();

我还尝试通过.AddYear(-1)在 LINQ 查询中使用来删除年份。

但是我没有得到下一个 30 天,我得到了所有Emp的生日列表,但我只需要从今天起接下来的 30 天

4

3 回答 3

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

我正在使用我的手机,所以我没有测试它。在实际应用程序中使用之前,请确保逻辑符合您的要求。我建议您使用单元测试来确保其正常运行。

于 2013-07-15T07:52:24.793 回答
1

您还必须给出条件:

DateTime.Parse(BdayItems.birthday) >= DateTime.Today

IE:

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();
于 2013-07-15T07:47:01.920 回答
0

你遇到的问题是DateTime不能解释一个空的年份。如果未提供年份,则假定它是当前年份。那是:

 string stringDate = "05/01";
 int year = DateTime.Parse(stringDate).Year; // -> 2013

此外,如果日期为空,则无论如何它都会说明某个日期。

因此,解决问题的最佳方法是考虑字符串而不是日期;并在所有信息完成后开始考虑日期(日、月和年)。

除此之外,您的查询不会提供您想要的结果(但其他答案已经解决了这个问题)。

于 2013-07-15T07:50:35.260 回答