更改DateTimeOffset.Offset属性?

时间:2016-03-17 15:45:27

标签: c# datetimeoffset

我的最终目标是从客户端获得没有偏移的通用时间 - 只是UTC时间。我试着这样做:

Javascript: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

3/17/2016 3:13:23 PM +00:00

结果是:

public TimeSpan Offset { get; }

不知何故,它会调整我的本地(东方)偏移量的时间。我不希望发生这种情况,我希望它只返回UTC时间,如下所示:

    CREATE VIEW `test` AS
    SELECT 
        Format(some_data_table.double_number,0) AS string_result
    FROM some_data_table;

P.S。我刚刚问了一个关于这个的问题,我道歉,因为我觉得它应该很容易,但我不明白。这应该非常简单,但它看起来像offset doesn't have a setter(除非我像往常一样完全错过了一些C#基础知识):

hitTest

3 个答案:

答案 0 :(得分:5)

overload of ParseExact where you can specify a DateTimeStyles. DateTimeValues的其中一个值为AssumeUniversal,其中包含:{/ p>

  

如果format不要求输入包含偏移值,则返回的DateTimeOffset对象将获得UTC偏移量(+00:00)。

这基本上意味着"不要假设它是本地的,假设它是普遍的。"假设本地是默认值,这就是为什么你看到你所处的结果,它调整到本地。指定AssumeUniversal应该按照您想要的方式解析它。

DateTimeOffset clientLoginTime = DateTimeOffset.ParseExact
(timeStringFromClient, dateTimeOffsetPattern, CultureInfo.InvariantCulture, 
    DateTimeStyles.AssumeUniversal);

答案 1 :(得分:2)

从JavaScript(或任何其他客户端),您应使用ISO8601格式yyyy-MM-ddTHH-mm-ss.sssz发送日期时间。 Z表示日期时间实例是GMT(UTC)。您也可以将其更改为从GMT添加+或 - 。您可以使用{Date}对象使用myDate.toISOString()

执行此操作

创建WebAPI模型时,您可以直接使用DateTimeDateTimeOffset类型。用于Web API的JSON.NET序列化程序将自动将发送的ISO8601日期时间字符串反序列化为正确的DateTime或DateTimeOffset类型(取决于您使用的是哪一个)。这意味着您不必在代码中进行任何好的解析。 (想象一下,如果您必须将所有内容作为字符串发送并在所有方法中手动解析所有内容?)。

所以你现在可以有一个方法

public async Task<IHttpActionResult> GetRecords(DateTimeOffset? startFrom)

startFrom将根据发送的ISO8601格式的DateTime字符串自动填充。

最后,执行此操作的最后一个也是最重要的原因是您的客户可能不会全部使用相同的区域设置。您可以让用户将其浏览器设置为西班牙语,以便.toUTCString()不会产生英文字符串,甚至可能不会产生mm / dd的字符串,反之亦然(与美国以外的大多数国家/地区一样)。

WebAPI的简短说明

  • 使用来自/到客户端的ISO8601。
  • 直接在模型中使用DateTimeOffset或DateTime实例(无解析)。

答案 2 :(得分:2)

我会正常从JS解析,然后执行以下操作:

  • 通过返回OffSet
  • DateTimeOffset剥离DateTime
  • 通过设置OffSet设置为DateTimeOffset的其他TimeSpan来设置ZERO

在你的情况下:

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));
}