簡體   English   中英

從查詢字符串中獲取UTC DateTime

[英]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.KindDateTimeKind.Unspecified 換句話說,在發布后,由您決定應該將其解釋為什么。 問題是你真的只能假設DateTimeKind.Utc ,因為這是唯一可以正確解釋為DateTime東西。 發布用戶的本地時間會使您陷入困境,因為DateTimeKind.Local實際上意味着服務器的本地時間 ,通常與客戶端的時間不同。

但是,即使在HTML5中,使用時區發布完整的日期時間實際上也是不可能的。 雖然存在諸如datetimedatetime-local類的輸入類型,但它們並未在任何主要瀏覽器中實現。 如果您要發布帶有時間和時區的日期,那么您的視圖模型實際上需要三個屬性:

public DateTime Date { get; set; }
public TimeSpan Time { get; set; }
public string TimeZone { get; set; }

TimeZone屬性假定您將使用由TimeZoneInfo.GetSystemTimeZones()的值組成的下拉列表。 如果你想使用不同的設置,你需要一些方法來映射/從這些值映射,因為這是你必須在C#中使用以獲得偏移量。 但是,您可以簡單地允許用戶發布偏移量,但這對用戶不太友好,對某些用戶來說可能很難。 特別是,他們不僅需要了解“偏離UTC”概念的含義,還需要了解夏令時的當前狀態,並根據實際日期調整該偏移。

無論如何,這些屬性中的每一個都可以輕松映射到輸入類型: date / timeTimeZone情況下的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.

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