Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# JSON如何反序列化日期时间并从UTC转换到指定时区?_C#_Datetime_.net Core_Timezone_Jsonserializer - Fatal编程技术网

C# JSON如何反序列化日期时间并从UTC转换到指定时区?

C# JSON如何反序列化日期时间并从UTC转换到指定时区?,c#,datetime,.net-core,timezone,jsonserializer,C#,Datetime,.net Core,Timezone,Jsonserializer,我想创建一个自定义json序列化程序,它将带有dateTime的对象转换为UTC和UTC,并返回到指定的时区。(非本地) 转换为UTC的示例如下: MyObject stuff = new MyObject(); stuff.Date = DateTime.Now; string asdd = JsonConvert.SerializeObject(stuff, new JsonSerializerSettings() {

我想创建一个自定义json序列化程序,它将带有dateTime的对象转换为UTC和UTC,并返回到指定的时区。(非本地)

转换为UTC的示例如下:

MyObject stuff = new MyObject();
stuff.Date = DateTime.Now;

string asdd = JsonConvert.SerializeObject(stuff,
            new JsonSerializerSettings()
            {
                DateTimeZoneHandling = DateTimeZoneHandling.Utc
            });
如何通过JsonSerializerSettings或自定义序列化程序将UTC转换回特定时区


注意:我在.NET Core 2.1中工作。

在序列化或反序列化时不应处理时区转换。这些是不同的关切

相反:

DateTimeZoneHandling
保留为默认值
RoundtripKind
。(不要将其设置为
Utc
) 这具有以下行为:

  • 如果要反序列化到
    DateTime
    ,并且不在数据中传递偏移量,则将设置
    DateTimeKind.Unspecified
  • 如果要反序列化到
    DateTime
    ,并在数据中传递一个尾随
    Z
    ,则将设置
    DateTimeKind.Utc
  • 如果要反序列化到
    日期时间
    ,并在数据中传递偏移量,则将设置“DateTimeKind.Local”,并将该值转换为本地时区(通常应避免此情况)
  • 如果要反序列化到
    日期时间偏移量
    ,则偏移量将被保留,并且值不会更改(如果传递偏移量,这是更好的方法)
一旦有了
DateTime
DateTimeOffset
值,然后使用
TimeZoneInfo.ConvertTime
和类似的方法更改时区(如果需要)。这一部分应该在应用程序代码中,因为它往往特定于特定API的逻辑


一般来说,尝试将所有传入或传出的日期/时间数据都处理在同一时区是一种反模式(),无论是通过序列化还是其他机制。

在序列化或反序列化时不应处理时区转换。这些是不同的关切

相反:

DateTimeZoneHandling
保留为默认值
RoundtripKind
。(不要将其设置为
Utc
) 这具有以下行为:

  • 如果要反序列化到
    DateTime
    ,并且不在数据中传递偏移量,则将设置
    DateTimeKind.Unspecified
  • 如果要反序列化到
    DateTime
    ,并在数据中传递一个尾随
    Z
    ,则将设置
    DateTimeKind.Utc
  • 如果要反序列化到
    日期时间
    ,并在数据中传递偏移量,则将设置“DateTimeKind.Local”,并将该值转换为本地时区(通常应避免此情况)
  • 如果要反序列化到
    日期时间偏移量
    ,则偏移量将被保留,并且值不会更改(如果传递偏移量,这是更好的方法)
一旦有了
DateTime
DateTimeOffset
值,然后使用
TimeZoneInfo.ConvertTime
和类似的方法更改时区(如果需要)。这一部分应该在应用程序代码中,因为它往往特定于特定API的逻辑

一般来说,它是一种反模式(),尝试将所有传入或传出的日期/时间数据都处理在同一时区,无论是通过序列化还是其他机制