neuecc / Utf8Json

Definitely Fastest and Zero Allocation JSON Serializer for C#(NET, .NET Core, Unity, Xamarin).
MIT License
2.36k stars 267 forks source link

DateTimeOffset Deserialize problem #141

Closed issingle closed 5 years ago

issingle commented 5 years ago

DateTimeOffset Deserialize the offset part of DateTimeOffset string must be +/-AC:BD format like str1,str2,str3,str5 not work.

void test(){
            var d1 = DateTimeOffset.Parse("2004-05-03T09:30:08+08");
            var d2 = DateTimeOffset.Parse("2004-05-03T09:30:08.0841390+00");
            var d3 = DateTimeOffset.Parse("2004-05-03T09:30:08.0841390+0");
            var d4 = DateTimeOffset.Parse("2004-05-03T09:30:08.0841390+00:00");
            var d5 = DateTimeOffset.Parse("2004-05-03T09:30:08.0841390+0:0");
            Console.WriteLine("All DateTimeOffset.Parse OK");

            string str1 = "{\"PlayCount\":0,\"StartAt\":\"2004-05-03T09:30:08+08\"}";
            string str2 = "{\"PlayCount\":0,\"StartAt\":\"2004-05-03T09:30:08.0841390+00\"}";
            string str3 = "{\"PlayCount\":0,\"StartAt\":\"2004-05-03T09:30:08.0841390+0\"}";
            string str4 = "{\"PlayCount\":0,\"StartAt\":\"2004-05-03T09:30:08.0841390+00:00\"}";
            string str5 = "{\"PlayCount\":0,\"StartAt\":\"2004-05-03T09:30:08.0841390+0:0\"}";
            try {
                var o1 = Utf8Json.JsonSerializer.NonGeneric.Deserialize(typeof(TT), str1);
                Console.WriteLine("Deserialize Success:" + str1);
            }
            catch (Exception ee) {
                Console.WriteLine("Deserialize Fail:" + str1);
                Console.WriteLine(ee.Message);
            }
            try {
                var o2 = Utf8Json.JsonSerializer.NonGeneric.Deserialize(typeof(TT), str2);
                Console.WriteLine("Deserialize Success:" + str2);
            }
            catch (Exception ee) {
                Console.WriteLine("Deserialize Fail:" + str2);
                Console.WriteLine(ee.Message);
            }
            try {
                var o3 = Utf8Json.JsonSerializer.NonGeneric.Deserialize(typeof(TT), str3);
                Console.WriteLine("Deserialize Success:" + str3);
            }
            catch (Exception ee) {
                Console.WriteLine("Deserialize Fail:" + str3);
                Console.WriteLine(ee.Message);
            }
            try {
                var o4 = Utf8Json.JsonSerializer.NonGeneric.Deserialize(typeof(TT), str4);
                Console.WriteLine("Deserialize Success:" + str4);
            }
            catch (Exception ee) {
                Console.WriteLine("Deserialize Fail:" + str4);
                Console.WriteLine(ee.Message);
            }
            try {
                var o5 = Utf8Json.JsonSerializer.NonGeneric.Deserialize(typeof(TT), str5);
                Console.WriteLine("Deserialize Success:" + str5);
            }
            catch (Exception ee) {
                Console.WriteLine("Deserialize Fail:" + str5);
                Console.WriteLine(ee.Message);
            }
            Console.ReadLine();
}
    public class TT {
        public int PlayerCount { get; set; }
        public DateTimeOffset StartAt { get; set; }
    }
Tornhoof commented 5 years ago

Why do you think that those strings should be valid ISO8601 datetime strings? https://tools.ietf.org/html/rfc3339#section-5.6 describes the profile of ISO8601 fairly exact, specifying two-digit hour and two-digit minute parts.

issingle commented 5 years ago

Why do you think that those strings should be valid ISO8601 datetime strings? https://tools.ietf.org/html/rfc3339#section-5.6 describes the profile of ISO8601 fairly exact, specifying two-digit hour and two-digit minute parts.

ok thx