Leancloud C# API DateTime读写问题?

用这里的版本测试了一下,貌似从0.10.1“修复泰文环境下DateTime解析异常”那个版本开始就有问题了。
https://github.com/leancloud/csharp-sdk
直接写入之后再读取,值会完全错乱。

0.10.1之前的版本虽然没有这个问题,但从今天开始,读取的DateTime数据有时会倒退100年……

using LeanCloud;
using LeanCloud.Storage;

LCApplication.Initialize("XXX", "YYY", "https://zzz.api.lncldglobal.com");

{
    LCQuery<LCObject> q = new LCQuery<LCObject>("AAA").WhereEqualTo("BBB", "CCC");
    var licList = q.Find().Result;
    var lic = licList.First();
    lic["DDD"] = DateTime.UtcNow;
    lic.Save().Wait();
    Console.WriteLine(((DateTime)lic["DDD"]).ToUniversalTime().ToString("o"));
}

{
    LCQuery<LCObject> q = new LCQuery<LCObject>("AAA").WhereEqualTo("BBB", "CCC");
    var licList = q.Find().Result;
    var lic = licList.First();
    Console.WriteLine(((DateTime)lic["DDD"]).ToUniversalTime().ToString("o"));
}

能提供一下查询的日志吗?

查询的日志具体是指?

参考 这里 打开日志,把怀疑有问题的请求和应答日志粘贴一下

[DEBUG] 2022/3/17 14:38:18 === HTTP Request Start ===
URL: https://ixo5n8sn.api.lncldglobal.com/1.1/classes/Test?skip=0&limit=100&where={"User":"New"}
Method: GET
Headers:
        User-Agent: LeanCloud-CSharp-SDK/0.10.1
        Accept: application/json
        X-LC-Id: ixo5n8sniAbcA3xrbMDznVMy-MdYXbMMI
        X-LC-Sign: c33014c96be8eac4b0b373760ebf603f,1647499098313
=== HTTP Request End ===


[DEBUG] 2022/3/17 14:38:19 === HTTP Response Start ===
URL: https://ixo5n8sn.api.lncldglobal.com/1.1/classes/Test?skip=0&limit=100&where={"User":"New"}
Status Code: OK
Content: {"results":[{"Time":{"__type":"Date","iso":"2022-03-17T06:44:25.098Z"},"User":"New","createdAt":"2022-03-17T06:36:16.185Z","updatedAt":"2022-03-17T06:37:33.491Z","objectId":"6232d6e03e94a2115ac3364b"}]}
=== HTTP Response End ===


[DEBUG] 2022/3/17 14:38:19 === HTTP Request Start ===
URL: https://ixo5n8sn.api.lncldglobal.com/1.1/classes/Test/6232d6e03e94a2115ac3364b?
Method: PUT
Headers:
        User-Agent: LeanCloud-CSharp-SDK/0.10.1
        Accept: application/json
        X-LC-Id: ixo5n8sniAbcA3xrbMDznVMy-MdYXbMMI
        X-LC-Sign: 6e99087594f81a7dea21dd9ef82aadc2,1647499099288
        Content-Type: application/json
Content: {"Time":{"__type":"Date","iso":"2022-03-17T06:38:19.2752413Z"}}
=== HTTP Request End ===


[DEBUG] 2022/3/17 14:38:19 === HTTP Response Start ===
URL: https://ixo5n8sn.api.lncldglobal.com/1.1/classes/Test/6232d6e03e94a2115ac3364b?
Status Code: OK
Content: {"updatedAt":"2022-03-17T06:38:18.351Z","objectId":"6232d6e03e94a2115ac3364b"}
=== HTTP Response End ===


写入值:2022-03-17T06:38:19.2752413Z
[DEBUG] 2022/3/17 14:38:19 === HTTP Request Start ===
URL: https://ixo5n8sn.api.lncldglobal.com/1.1/classes/Test?skip=0&limit=100&where={"User":"New"}
Method: GET
Headers:
        User-Agent: LeanCloud-CSharp-SDK/0.10.1
        Accept: application/json
        X-LC-Id: ixo5n8sniAbcA3xrbMDznVMy-MdYXbMMI
        X-LC-Sign: 8155d51935f145310ca2c9715faf5c8d,1647499099499
=== HTTP Request End ===


[DEBUG] 2022/3/17 14:38:19 === HTTP Response Start ===
URL: https://ixo5n8sn.api.lncldglobal.com/1.1/classes/Test?skip=0&limit=100&where={"User":"New"}
Status Code: OK
Content: {"results":[{"Time":{"__type":"Date","iso":"2022-03-17T07:24:11.413Z"},"User":"New","createdAt":"2022-03-17T06:36:16.185Z","updatedAt":"2022-03-17T06:38:18.351Z","objectId":"6232d6e03e94a2115ac3364b"}]}
=== HTTP Response End ===


读取值:2022-03-17T07:24:11.4130000Z

应该是字符串parse问题。

是说【写入值】和【读取值】不匹配吧?这个问题已经发现了,下个版本就会修复。
前面提到的【倒退 100 年】是指什么情况?

那个是老版本sdk(0.10以前)在昨天下午突然出现的问题。
我这边代码完全没变过,可能是你们服务器返回的数据有误?需要的话我再测测?

目前已知的是写入日期类型的字段精度会导致数据有问题,稍后将会发布一个版本修复这个问题。
不太清楚提到的老版本的问题是什么?能再测试一下吗?

现在暂时无法复现那个回退100年的问题了。不排除是我的代码运行环境的CultureInfo改变为“en-US-POSIX”导致的。等你们发新版本了再说吧。

非常感谢反馈问题,已经在 0.10.5 版本中修复
后续有问题欢迎反馈!

发现新的bug:某些特定的时间值在保存的时候会报错,提示Invalid date format, expect: yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
具体来说是这个值:2022-04-22T05:05:21.0005369Z
如果把毫秒里的000改成111则没有问题。
测试代码如下:

using LeanCloud;
using LeanCloud.Storage;

LCApplication.Initialize("XXX", "YYY", "https://zzz.api.lncldglobal.com");

{
    LCQuery<LCObject> q = new LCQuery<LCObject>("AAA").WhereEqualTo("BBB", "CCC");
    var licList = q.Find().Result;
    var lic = licList.First();
    lic["DDD"] = DateTime.Parse("2022-04-22T05:05:21.0005369Z");
    lic.Save().Wait();
}

感谢反馈,已确认问题:当毫秒为 0 时,C# DateTime.ToString() 会省略掉【毫秒】部分,导致 SDK 与后端的通信格式非法。
会在下个版本中修复。

已在 0.10.10 中修复,感谢反馈!