2017-04-03 3 views
0

Ich habe zwei Webserver, WEB1 und WEB2. Die Funktion:ASP.net Zeit Rendering anders auf verschiedenen Servern

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

Wird auf einen Wert aufgerufen. Diese machen wie:

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> 

Beachten Sie, dass Web1 mit einem z am Ende macht, während Web2 dies nicht tun. Dies führt dazu, dass die Anfragen auf Web2 1 Stunde in der Vergangenheit angezeigt werden.

Beide Webserver Zeitzonen sind die (UTC) Coordinated Universal Time in Windows eingestellt.

Weiß jemand, was hier passieren könnte?

+0

Was ist die Kultur? – mason

+0

@Mason beide Webserver sind die gleichen in IIS 'Invariant Sprache (Invariant Country)' –

+0

Ich würde auf dem tatsächlichen Thread überprüfen. Überprüfen Sie 'Thread.CurrentThread.CurrentCulture' und' Thread.CurrentThread.CurrentUICulture' – mason

Antwort

1

Der Ausgang bei der Verwendung von ToString("o") zum Kind Eigenschaft des DateTime Sie passieren zusammenhängt:

  • Mit DateTimeKind.Utc, wird die Zeichenfolge mit Z enden - die UTC
  • Mit DateTimeKind.Local bedeutet, wird die Zeichenfolge Ende mit einem Offset von UTC, wie -07:00.
  • Mit DateTimeKind.Unspecified endet die Zeichenfolge nur nach dem Zeitabschnitt. Dies könnte ein beliebiger Zeitpunkt sein, da keine Zeitzonen-Offset-Information übermittelt wird.

Beachten Sie, dass dies genau mit dem ISO8601-Standard übereinstimmt. Es wird auch in the MSDN docs beschrieben.

Um herauszufinden, warum ein Server eine andere Ausgabe produziert als die andere, müssen Sie herausfinden, woher sie ihre Daten nehmen. Meine Vermutung ist, dass Web1 einen Wert sendet, der von DateTime.UtcNow stammt und Web2 liest einen Wert aus einer Datei, Datenbank, oder hat es manuell ohne Angabe einer Art erstellt.

+0

Sie haben Recht, danke! Einer der Server las aus Redis, wo der Kind nicht spezifiziert war. –

+0

Verwenden Sie 'DateTime.SpecifyKind' beim Abrufen von Redis. –

Verwandte Themen