繁体   English   中英

RestSharp将Datetimes转换为UTC

[英]RestSharp converts Datetimes to UTC

我有以下问题

我正在使用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"
}

知道我能做什么吗? 谢谢

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

确切的问题在这里描述: https//github.com/restsharp/RestSharp/issues/834

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

  1. 您可以查看是否在GET上收到正确的日期。 也许RestSharp将那个“错误的”日期时间转换回10.06.1991 00:00 - 也许你对它没问题
  2. 如果您希望数据库不包含UTC但您希望发送的数据,请不要使用默认的序列化程序,请使用JSON.Net( http://www.newtonsoft.com/json )。 它不会转换为UTC并发送原始DateTime。

以下是如何实现的一个非常好的示例: http//bytefish.de/blog/restsharp_custom_json_serializer/

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

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

我的客户看起来像:

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 
        };

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

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

或者,更好的是,使用更适合处理多区域时间的DateTimeOffset ..甚至使用Jon Skeet的NodaTime库,这是任何与时间相关的工作的瑞士刀(尽管,对你的情况来说可能是一种矫枉过正)。

UPD 要回答以下评论中来自@Matthias Burger的问题:

你会如何处理出生日期等日期? 我认为“10.06.1991”可能是一个生日。 手段,在UTC他的生日与GMT不同 - 不是吗?

一如既往 - 这取决于:)

由于时间是一件棘手的事情,你应该小心 - 而Jon Skeet的博客中有一篇关于日期/时间算术的快乐的文章。 老实说,我知道这不是一个真正的答案,但是有太多不同的可能的问题案例 - 我们需要比较日期,它们是否在同一日历中,我们是否假设所有人都在当地时区的午夜出生,等等

在已经提到过的NodaTime有一个全局和局部瞬间的概念 (看看它的概念页面 )。 我认为对于最简单的情况,当我们需要存储和显示生日时LocalDate (本地日期即时)就足够了。 如果您存储本地日期并为所有人固定相同的时区,即使DateTime也足够了(所以它就像你根本不使用时区一样)。

PS顺便说一下,不知道最后一个问题是否是支票,但UTC是标准,GMT是时区 ;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM