我需要以 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 我在上面的代码中添加了时间以覆盖完整日期。
假设您想要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)