Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改DateTimeOffset.Offset属性?_C#_Datetimeoffset - Fatal编程技术网

C# 更改DateTimeOffset.Offset属性?

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

我的最终目标是从客户那里获得世界时,不需要任何偏移量,只需要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 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));
}