2017-07-20 193 views
3

我有以下问题RestSharp将日期时间转换为UTC

我正在使用RestSharp来访问我的API。但是当我发送日期时间时,它似乎被转换为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" 
} 

任何想法,我能做些什么? 谢谢

+0

这是同样的问题,因为https://github.com/restsharp/RestSharp/issues/691? – mjwills

回答

2

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

确切的问题说明如下:https://github.com/restsharp/RestSharp/issues/834

所以,不要2小时添加到你得到它的API中的每个日期时间。当另一个客户端发送未转换的日期时,您可能会更改正确的数据。

  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而在反序列化你调用JSON。净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 
     }; 
+0

什么变量是'request'? –

+0

它只是一个包含请求API的路径和其他信息的对象。没什么特别的。重要的是将JsonSerializer设置为使用Json.Net的那个。 –

1

我想这是因为你的DateTime对象有DateTime.Kind属性等于DateTimeKind.Unspecified - 它打破了本地和utc类型之间的所有转换。我的意思是一些工具假设你的日期时间是在Utc,当它不是真的。

所以,只是不要与工具,必须猜测你和你的客户之间的正确的DateTimes类型的工具。只需在世界各地使用UTC并将其转换为本地,即可向用户显示。

,或者甚至更好,使用DateTimeOffset哪个更适合对付多区域次..甚至使用乔恩斯基特的NodaTime库,它是一个瑞士军刀任何时间有关的工作(虽然也许它是你的情况矫枉过正)。

UPD。在下面的评论中回答@Matthias Burger提出的问题:

你会如何处理像出生日期这样的日期?我认为“10.06.1991”可能是一个生日。意味着,在UTC他的生日不同于格林尼治标准时间 - 不是吗?

一如既往 - 这取决于:)

随着时间是一件棘手的事情,你要小心 - 有从乔恩斯基特的博客大约joys of date/time arithmetic一个伟大的文章。老实说,我知道这不是一个真正的答案,但是有太多不同的可能的问题案例 - 我们是否需要比较日期,他们是否在同一日历中,我们是否假设所有人都在当地时区的午夜出生,等

在已经提到NodaTime有一个全球和本地时间的概念(看看它的concepts page)。我认为对于最简单的情况,当我们需要存储并显示生日LocalDate(当地日期即时)就足够了。即使DateTime就足够了,如果您存储本地日期并为所有人注视同一时区(因此它会像您根本不使用时区)。

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

+0

只为我的调停和更好的理解:你如何处理像出生日期这样的日期?我认为“10.06.1991”可能是一个生日。意味着,在UTC他的生日不同于格林尼治标准时间 - 不是吗? –

+1

@MatthiasBurger更新了我的答案) – pkuderov