RestSharp将Datetimes转换为UTC

时间:2017-07-20 09:17:23

标签: c# restsharp

我有以下问题

我使用RestSharp访问我的API。但是当我发送DateTime时,它似乎转换为UTC。 我发送了' 10.06.1991 00:00'并且API获得了09.06.1991 22:00'

那么,当我的API获取DateTime对象时,我总是需要增加2个小时?

我检查了JSON RestSharp发送到API。

public class Test
{
    public int IntProperty {get;set;}
    public string StringProperty {get;set;}
    public DateTime DateTimeProperty {get;set;}
}

我的目标是

Test t = new Test{ IntProperty=3, StringProperty="string", DateTimeProperty=new DateTime(1991,06,10) }

当我通过RestSharp发送对象时,我的API收到的JSON是

{
    "IntProperty":3,
    "StringProperty":"string",
    "DateTimeProperty":"09.06.1991 22:00:00"
}

知道我能做什么吗? 感谢

2 个答案:

答案 0 :(得分:4)

不是您的API会收到错误的数据,而是您的客户发送错误的"数据。我的API遇到了同样的问题。 不,它是正确的数据,但转换为UTC。

此处描述了确切的问题:https://github.com/restsharp/RestSharp/issues/834

因此,不要在API中获得每个DateTime 2小时。当另一个客户发送未转换的日期时,您可能会更改正确的数据。

  1. 您可以查看是否在GET上收到正确的日期。也许RestSharp正在转换那个"错误" datetime回到10.06.1991 00:00 - 也许你没关系
  2. 如果您希望数据库不包含UTC但您原始想要发送的数据,请不要使用默认序列化程序,请使用JSON.Net(http://www.newtonsoft.com/json)。它不会转换为UTC并发送原始的DateTime。
  3. 以下是关于如何实施的一个非常好的示例:http://bytefish.de/blog/restsharp_custom_json_serializer/

    • 您编写了一个实现ISerializerIDeserializer
    • 的自定义类
    • 序列化中您调用JSON.Net Serialize,而在反序列化中,您调用JSON.Net Deserialize

    • 你只需要像这样在你的RestClient中添加一个处理程序:(我使用上述博客中描述的静态默认实例)

    我的客户看起来像:

    private readonly RestClient _client;
    
    public RestApiClient(string apiAdress)
    {
        _client = new RestClient(apiAdress);
        _client.AddHandler("application/json", NewtonsoftJsonSerializer.Default);
    }
    

    在请求中,您可以设置JsonSerializer

     IRestRequest restRequest = 
            new RestRequest(request.GetRestfulUrl(), request.Method) {
                RequestFormat = request.DataFormat, 
                JsonSerializer = NewtonsoftJsonSerializer.Default 
            };
    

答案 1 :(得分:1)

我想这是因为您的DateTime个对象的DateTime.Kind属性等于DateTimeKind.Unspecified - 它会破坏本地和utc种类之间的所有转换。我的意思是一些工具假设您的DateTime在Utc中并不是真的。

所以,不要与那些必须在你和你的客户之间猜到正确类型的DateTimes的工具进行斗争。只需在任何地方使用UTC并转换为仅本地以向用户显示。

或者,更好的是,使用更适合处理多区域时间的DateTimeOffset ..甚至使用Jon Skeet的NodaTime库,这是任何时间相关的瑞士刀工作(虽然,也许这对你的案子来说太过分了。)

<强> UPD 即可。要在下面的评论中回答@Matthias Burger提出的问题:

  

您如何处理出生日期等日期?我认为&#34; 10.06.1991&#34;可能是个生日。手段,在UTC他的生日与GMT不同 - 不是吗?

一如既往 - 取决于:)

由于时间紧迫,你应该小心 - Jon Skeet的博客中有一篇关于joys of date/time arithmetic的精彩文章。我知道这不是一个真正的答案,老实说,但是有太多不同的可能问题案例 - 我们是否需要比较日期,是否在同一日历中,我们是否假设所有人都出生在当地时区的午夜等。

在已经提到的NodaTime中,有一个全球和本地时刻的概念(看看它concepts page)。我认为,对于最简单的情况,我们只需要存储和显示生日LocalDate(本地日期即时)就足够了。如果你存储本地日期并为所有人设置相同的时区,即使DateTime也足够了(所以它就像你根本不使用时区一样)。

P.S。顺便说一句,不知道最后一个问题是否是支票,但是UTC is a standard and GMT is a time zone;)