ASP.NET MVC 将 DateTime 转换为 UTC 以发送到 API

use*_*331 0 c# datetime

我需要以 UTC 格式向 API 发送开始日期和结束日期,我已尝试以下操作:

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

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

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

Mat*_*int 5

假设您想要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);
Run Code Online (Sandbox Code Playgroud)

其他一些事情:

  • 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
    
    Run Code Online (Sandbox Code Playgroud)

    做这个:

    2018-08-31T00:00:00.0000000Z <= someValueToTest < 2018-09-01T00:00:00.0000000Z
    
    Run Code Online (Sandbox Code Playgroud)