[英]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.Parse
與CultureInfo.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.