为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
交互式爱情 2022-01-09 10:23:52
我需要以 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 我在上面的代码中添加了时间以涵盖完整日期。
查看完整描述

3 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

假设您想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


查看完整回答
反对 回复 2022-01-09
?
冉冉说

TA贡献1877条经验 获得超1个赞

首先从 NuGet 包管理器安装以下包并在您的项目中引用它:


Install-Package Newtonsoft.Json

现在您可以轻松地使用JsonConvert.SerializeObject(object value)方法将任何对象序列化为 Json。


用于将 DateTime 转换为 UTC 使用TimeZoneInfo.ConvertTimeToUtc(DateTime dateTime)方法。


在你的情况下:


DateTime date = DateTime.Parse("2018-08-31");

DateTime dateTimeToUtc = TimeZoneInfo.ConvertTimeToUtc(date);

string dateInJson = JsonConvert.SerializeObject(dateTimeToUtc);

变量 dateInJson 将具有类似的值2018-08-30T19:30:00Z。


查看完整回答
反对 回复 2022-01-09
?
jeck猫

TA贡献1909条经验 获得超7个赞

删除 Z

        string start = "2018-08-31";        string end = "2018-08-31";
        DateTime startDate = Convert.ToDateTime(start + "T00:00:00");
        DateTime endDate = Convert.ToDateTime(end + "T23:59:59");
        Console.WriteLine(startDate);                   // 8/31/2018 12:00:00 (Local)
        Console.WriteLine(startDate.ToUniversalTime()); // 8/31/2018 5:00:00 (UTC)
        Console.WriteLine(endDate);                     // 8/31/2018 11:59:59 (Local)
        Console.WriteLine(endDate.ToUniversalTime());   // 9/1/2018 4:59:59 (UTC)


查看完整回答
反对 回复 2022-01-09
  • 3 回答
  • 0 关注
  • 263 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信