从今天开始接下来的30天

时间:2013-07-15 07:39:27

标签: c# json linq windows-phone-7

对于以下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天

3 个答案:

答案 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

此外,如果日期为空,则无论如何都会考虑某个日期。

因此,你能解决问题的最好方法是考虑字符串而不是日期;一旦所有信息完成(日,月和年),就开始考虑日期。

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