[英]get UTC DateTime from query string
假設我們有行動:
[HttpGet]
public Task<IActionResult> Foo(DateTime date)
{
var utc = date.ToUniversalTime();
}
看起來MVC框架默認情況下將UTC DateTime轉換為Local(中間件中的某個地方)。 如何關閉此行為並擺脫其他轉換?
UPD:
Chrome開發。 console(網絡選項卡)顯示我這樣的查詢參數: date:2017-12-01T00:00:00.000Z
但在控制器中我看到: {01/12/2017 03:00:00}
當需要准確的基於時區的時間時,不應使用DateTime
。 這就是DateTimeOffset
存在的原因。 默認情況下, DateTime.Kind
是DateTimeKind.Unspecified
。 換句話說,在發布后,由您決定應該將其解釋為什么。 問題是你真的只能假設DateTimeKind.Utc
,因為這是唯一可以正確解釋為DateTime
東西。 發布用戶的本地時間會使您陷入困境,因為DateTimeKind.Local
實際上意味着服務器的本地時間 ,通常與客戶端的時間不同。
但是,即使在HTML5中,使用時區發布完整的日期時間實際上也是不可能的。 雖然存在諸如datetime
和datetime-local
類的輸入類型,但它們並未在任何主要瀏覽器中實現。 如果您要發布帶有時間和時區的日期,那么您的視圖模型實際上需要三個屬性:
public DateTime Date { get; set; }
public TimeSpan Time { get; set; }
public string TimeZone { get; set; }
TimeZone
屬性假定您將使用由TimeZoneInfo.GetSystemTimeZones()
的值組成的下拉列表。 如果你想使用不同的設置,你需要一些方法來映射/從這些值映射,因為這是你必須在C#中使用以獲得偏移量。 但是,您可以簡單地允許用戶發布偏移量,但這對用戶不太友好,對某些用戶來說可能很難。 特別是,他們不僅需要了解“偏離UTC”概念的含義,還需要了解夏令時的當前狀態,並根據實際日期調整該偏移。
無論如何,這些屬性中的每一個都可以輕松映射到輸入類型: date
/ time
和TimeZone
情況下的select
/ time
,具體取決於您是使用下拉菜單還是手動偏移條目。 它們也可以通過模型綁定器輕松映射回您的視圖模型。 然后,您只需要根據該信息創建一個DateTimeOffset
,這就是您實際在實體類中保留的信息。
var offset = TimeZoneInfo
.FindTimeZoneById(model.TimeZone)
.GetUtcOffset(model.Date)
var dateTimeOffset = new DateTimeOffset(model.Date.Add(model.Time), offset);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.