[英]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小时。 当另一个客户端发送未转换的日期时,您可能会更改正确的数据。
10.06.1991 00:00
- 也许你对它没问题 以下是如何实现的一个非常好的示例: http : //bytefish.de/blog/restsharp_custom_json_serializer/
ISerializer
和IDeserializer
的自定义类 在序列化中,您调用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.