2017-04-03 101 views
0

我有兩個Web服務器,WEB1和WEB2。功能:ASP.net在不同服務器上的時間渲染不同

public static string ToTimeAgoHTML(this DateTime date) 
{ 
    return "<time class=\"timeago\" datetime=\"" + date.ToString("o") + "\">" + date.FriendlyDate() + "</time>"; 
} 

被調用一個值。這些呈現爲:

WEB1

<time class="timeago" datetime="2017-04-03T15:12:04.9072263Z">3 Apr, 2017</time> 

WEB2

<time class="timeago" datetime="2017-04-03T15:12:04.9072263">3 Apr, 2017</time> 

注意WEB1呈現與z末,而WEB2沒有做到這一點。這導致Web2上的請求在過去1小時內顯示。

在Windows中,兩個網絡服務器時區都設置​​爲(UTC) Coordinated Universal Time

有誰知道這裏會發生什麼?

+0

什麼是文化? – mason

+0

@Mason這兩個網絡服務器是相同的在IIS'不變語言(不變國家)' –

+0

我會驗證實際的線程。檢查'Thread.CurrentThread.CurrentCulture'和'Thread.CurrentThread.CurrentUICulture' – mason

回答

1

在使用ToString("o")是關係到你在通過DateTimeKind屬性的輸出:

  • 隨着DateTimeKind.Utc,該字符串將與Z結束 - 這標誌着UTC
  • 隨着DateTimeKind.Local,該字符串將以UTC的偏移結束,例如-07:00
  • With DateTimeKind.Unspecified,該字符串將在時間部分之後結束。這可能是任何時間點,因爲沒有傳送時區偏移信息。

請注意,這與ISO8601標準完全一致。它也被描述爲in the MSDN docs

要弄清楚爲什麼一臺服務器產生的輸出不同於另一臺服務器,你必須弄清楚他們從哪裏獲取數據。我的猜測是Web1發送的值來自DateTime.UtcNow,而Web2正在從文件,數據庫讀取值,或者在沒有指定種類的情況下手動構建它。

+0

你是對的,謝謝!其中一臺服務器正在從Redis那裏讀取,那裏的種類沒有說明。 –

+0

從Redis檢索時使用'DateTime.SpecifyKind'。 –

相關問題