簡體   English   中英

ASP.NET MVC 將 DateTime 轉換為 UTC 發送到 API

[英]ASP.NET MVC convert DateTime to UTC to send to 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 我在上面的代碼中添加了時間以涵蓋完整日期。

假設您希望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.ParseCultureInfo.CurrentCulture並沒有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 

移除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)

首先從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

如果您像我一樣發送動態 linq,則需要文本形式的日期時間。 如果您正在處理 UTC,那么:

//specify utc just to avoid any problem
DateTime dateTime = yourDateTime.SetKindUtc();

var filterToSendToApi = $"CreatedTime>={dateTime.ToStringUtc()}"

幫手:

      public static string ToStringUtc(this DateTime time)
        {
            return $"DateTime({time.Ticks}, DateTimeKind.Utc)";
        }

      public static DateTime SetKindUtc(this DateTime dateTime)
        {
            if (dateTime.Kind == DateTimeKind.Utc)
            {
                return dateTime;
            }

            return DateTime.SpecifyKind(dateTime, DateTimeKind.Utc);
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM