首页 > 解决方案 > ASP.NET MVC 将 DateTime 转换为 UTC 以发送到 API

问题描述

我需要以 UTC 格式向 API 发送开始日期和结束日期,我尝试了以下方法:

DateTime startDate = Convert.ToDateTime(start + "T00:00:00Z").ToUniversalTime();
DateTime endDate = Convert.ToDateTime(end + "T23:59:59Z").ToUniversalTime();

但似乎他们没有转换为 UTC,将 startDate 和 endDate 转换为 UTC 的正确方法是什么?

开始是一个字符串,是 2018-08-31,结束日期也是一个字符串,是 2018-08-31 我在上面的代码中添加了时间以涵盖完整日期。

标签: c#datetime

解决方案


假设您想endDate以 UTC 表示给定日期的最后可能时刻:

DateTime startDate = DateTime.ParseExact(start, "yyyy-MM-dd", CultureInfo.InvariantCulture,
                        DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal);

DateTime endDate = DateTime.ParseExact(end, "yyyy-MM-dd", CultureInfo.InvariantCulture,
                        DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal)
                        .AddDays(1).AddTicks(-1);

其他几件事:

  • ToUniversalTime从计算机的本地时区转换为 UTC (除非.Kind == DateTimeKind.Utc)。除非计算机的本地时区与您的情况相关,否则您通常应该避免使用它。

  • 在上面的代码中,您需要AssumeUniversal表明输入日期将被解释为 UTC,并AdjustToUniversal表明您希望输出值保持为 UTC 而不是计算机的本地时区。

  • UTC 不是“格式”。您的组合日期和时间字符串将采用 ISO 8601 扩展格式(也符合 RFC 3339)。

  • 一般尽量不要使用Convert.ToDateTime。它相当于DateTime.ParsewithCultureInfo.CurrentCulture和 no DateTimeStyles。这可能适用于某些情况,但通常最好更具体一些。

  • .AddDays(1).AddTicks(-1)是否可以让您到达该日期的最后一个可表示的刻度。这允许在开始和结束之间进行包容性比较,但它的缺点是无法减去两个值并获得整个 24 小时。因此,通常最好简单地跟踪00:00一天到00:00第二天,然后在结束日期使用排他比较。(只有开始日期应该包含比较。)

    换句话说,而不是:

    2018-08-31T00:00:00.0000000Z <= someValueToTest <= 2018-08-31T23:59:59.9999999Z
    

    做这个:

    2018-08-31T00:00:00.0000000Z <= someValueToTest < 2018-09-01T00:00:00.0000000Z
    

推荐阅读