我有以下问题
我使用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"
}
知道我能做什么吗? 感谢
答案 0 :(得分:4)
不是您的API会收到错误的数据,而是您的客户发送错误的"数据。我的API遇到了同样的问题。 不,它是正确的数据,但转换为UTC。
此处描述了确切的问题:https://github.com/restsharp/RestSharp/issues/834
因此,不要在API中获得每个DateTime 2小时。当另一个客户发送未转换的日期时,您可能会更改正确的数据。
10.06.1991 00:00
- 也许你没关系以下是关于如何实施的一个非常好的示例:http://bytefish.de/blog/restsharp_custom_json_serializer/
ISerializer
和IDeserializer
序列化中您调用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;)