C# 如何将字符串解析为JObject忽略时区

C# 如何将字符串解析为JObject忽略时区,c#,json,json.net,C#,Json,Json.net,我有一个json字符串,需要转换为JObject 例如: String result = ""{"totalSize":1,"done":true,"records":[{"attributes":{"type":"Municipio__c","url":"/services/data/v37.0/sobjects/Municipio__c/a0V2C000000gIgzUAE"},"Id":"a0V2C000000gIgzUAE","LastModifiedDate":"2017-08-01T

我有一个json字符串,需要转换为JObject

例如:

String result = ""{"totalSize":1,"done":true,"records":[{"attributes":{"type":"Municipio__c","url":"/services/data/v37.0/sobjects/Municipio__c/a0V2C000000gIgzUAE"},"Id":"a0V2C000000gIgzUAE","LastModifiedDate":"2017-08-01T18:12:04.000+0000"}]}";"

var json = JObject.Parse(result);
但在转换瞬间,LastModifiedDate将值更改为my时区

就像这样:

{{
  "totalSize": 1,
  "done": true,
  "records": [
    {
      "attributes": {
        "type": "Municipio__c",
        "url": "/services/data/v37.0/sobjects/Municipio__c/a0V2C000000gIgzUAE"
      },
      "Id": "a0V2C000000gIgzUAE",
      "LastModifiedDate": "2017-08-01T15:12:04-03:00"
    }
  ]
}}
时间更改为:18:12:04(hh:MM:ss)到15:12:04(hh:MM:ss)


是否有办法忽略解析中的时区?

您必须使用
jsonvert
和相应的
DateTimeZoneHandling

var json = JsonConvert.DeserializeObject
                       ( result
                       , new JsonSerializerSettings()
                         { DateTimeZoneHandling = DateTimeZoneHandling.Utc
                         }
                       );
时间实例是相同的
18:12:04+00:00
15:12:04-03:00
21:12:04+03:00
相同(希腊的当前偏移量)

解析日期值时的默认行为是生成本地
DateTime
值,即其属性为DatTimeKind.local`。其他值为UTC,未指定

这并不意味着值发生了变化<代码>本地是一个相对术语,但在不知道实际偏移量的情况下,很容易误解它

正如Patrick Hofman所解释的,您可以通过设置
DateTimeZoneHandling
设置来指定使用UTC

更好的方法是使用
DateParseHandling=DateParseHandling.DateTimeOffset
属性指定将使用
DateTimeOffset
而不是
DateTime
。这将保留原始时区信息:

var settings=new JsonSerializerSettings{ 
    DateParseHandling = DateParseHandling.DateTimeOffset
};
var json = JsonConvert.DeserializeObject( result, settings);
在这种情况下,该值将是原始时间的a,偏移量为
00:00

我在这里使用
dynamic
来降低铸造噪音:

var settings=new JsonSerializerSettings{ 
    DateParseHandling = DateParseHandling.DateTimeOffset
};

dynamic json = JsonConvert.DeserializeObject( result, settings);
var value=(DateTimeOffset)(json.records[0].LastModifiedDate.Value);

Console.WriteLine("{0:o}",value);
这将返回:

2017-08-01T18:12:04.0000000+00:00

我觉得这很奇怪,你确定就这些吗?是的。这是@MarcoSalerno
JObject.Parse
不修改字符串的一个特性。不可能。字符串是不可变的。修改后的字符串来自哪里?此外,时间没有改变。完全相同。当您将鼠标悬停在
JObject
@PanagiotisKanavos@PatrickHofman18:12:04+00:00与15:12:04-03:00的时间值相同。如何将其格式化为字符串,取决于对象的类型(是DateTime吗?),如果是DateTime,则取决于其类型。值的DateTimeKind是什么?