C# 更改DateTimeOffset.Offset属性?
我的最终目标是从客户那里获得世界时,不需要任何偏移量,只需要UTC时间。我试着这样做: Javascript:C# 更改DateTimeOffset.Offset属性?,c#,datetimeoffset,C#,Datetimeoffset,我的最终目标是从客户那里获得世界时,不需要任何偏移量,只需要UTC时间。我试着这样做: Javascript:(new Date()).toutString(),其输出日志为:Thu,2016年3月17日15:13:23 GMT,这正是我需要的 然后我把它拿到服务器上,试着把它转换成DateTimeOffset: string dateTimeOffsetPattern = "ddd, dd MMM yyyy HH:mm:ss 'GMT'"; DateTimeOffset clientLog
(new Date()).toutString()
,其输出日志为:Thu,2016年3月17日15:13:23 GMT
,这正是我需要的
然后我把它拿到服务器上,试着把它转换成DateTimeOffset
:
string dateTimeOffsetPattern = "ddd, dd MMM yyyy HH:mm:ss 'GMT'";
DateTimeOffset clientLoginTime = DateTimeOffset.ParseExact
(timeStringFromClient, dateTimeOffsetPattern, CultureInfo.InvariantCulture);
其结果是:
3/17/2016 3:13:23 PM -04:00
它以某种方式调整了本地(东部)偏移的时间。我不希望发生这种情况,我希望它只返回UTC时间,如下所示:
3/17/2016 3:13:23 PM +00:00
顺便说一句,我只是问了另一个问题,我道歉,因为我觉得这应该很容易,但我不明白。这应该非常简单,但看起来像(除非我像往常一样完全缺少一些C#basics):
有一个DateTimeValues
的值是AssumeUniversal
,它表示:
如果格式不要求输入包含偏移量值,则返回的DateTimeOffset对象将获得UTC偏移量(+00:00)
这基本上意味着“不要假设它是本地的,假设它是通用的。”假设本地是默认值,这就是为什么你看到的结果是,它正在适应本地。指定AssumeUniversal
应该按照您想要的方式解析它
DateTimeOffset clientLoginTime = DateTimeOffset.ParseExact
(timeStringFromClient, dateTimeOffsetPattern, CultureInfo.InvariantCulture,
DateTimeStyles.AssumeUniversal);
从JavaScript(或任何其他客户端)中,您应该使用yyyy-MM-ddTHH-MM-ss.sssz
格式发送日期时间。Z表示日期时间实例为GMT(UTC)。您还可以将其更改为从GMT添加+或-
创建WebAPI模型时,可以直接使用DateTime
或DateTimeOffset
类型。Web API的JSON.NET序列化程序将自动将发送的ISO8601 datetime字符串反序列化为正确的datetime或DateTimeOffset类型(取决于您使用的类型)。这意味着您不必在代码中进行任何手动解析,这是很好的。(想象一下,如果您必须以字符串形式发送所有内容,并在所有方法中手动解析所有内容?)
现在你可以有一个方法了
public async Task<IHttpActionResult> GetRecords(DateTimeOffset? startFrom)
公共异步任务GetRecords(DateTimeOffset?startFrom)
并且将根据发送的ISO8601格式的日期时间字符串,自动填充从开始的startFrom
最后,这样做的最后一个也是最重要的原因是,您的客户机可能不会全部使用相同的语言环境。您可以让用户将浏览器设置为西班牙语,这样。toutString()
将不会生成英语字符串,甚至可能不会生成带mm/dd的字符串,但会生成相反的字符串(与美国以外的大多数国家一样)
WebAPI的长话短说
- 使用ISO8601从/到客户端
- 直接在模型中使用DateTimeOffset或DateTime实例(无解析)
我通常会从JS解析,然后执行以下操作:
- 通过返回
DateTime
- 通过实例化另一个
DateTimeOffset
将TimeSpan
设置为ZERO
来设置OffSet
就你而言:
var clientLoginTime = new DateTimeOffset(clientLoginTime.DateTime, TimeSpan.FromHours(0));
这可以很容易地转换为扩展方法
public static DateTimeOffset SetOffset(this DateTimeOffset dto, int timeZoneDiff)
{
return new DateTimeOffset(dto.DateTime, TimeSpan.FromHours(timeZoneDiff));
}
我实际上只是将字符串发送到服务器。我有一个Web API2控制器,它接受一个字符串参数,该参数接收由:(new Date())创建的字符串。您是否将其作为JSON发送?您是否使用JSON.NET进行反序列化?另外,正在发送的原始字符串/有效负载的值是多少?@HansPassant:我需要的答案刚刚发布。但是,是的,我不是在争论我是否可以设计得更好。伊戈尔,我更新了你问的信息。我想我知道你要说什么,但它似乎没有改变这里的字符串。你应该使用格式向服务器发送日期时间对象。这将是yyyy-MM-ddTHH-MM-ss.sssz
。特别是在使用浏览器时,如果你这样发送,浏览的文化将决定日期的字符串。谢谢Igor,这是我需要检查的。这正是我需要的。工作完美。谢谢,我们会在倒计时结束后回来接受。感谢您提供的信息。
public static DateTimeOffset SetOffset(this DateTimeOffset dto, int timeZoneDiff)
{
return new DateTimeOffset(dto.DateTime, TimeSpan.FromHours(timeZoneDiff));
}