code it

Martins Tech Blog

Umrechnung zwischen Zeitzonen durchführen

Entwickelt man für Systeme, deren Anwender sich nicht alle in der gleichen Zeitzone befinden, so ist es in der Regel angebracht, dem Benutzer die Datumswerte in lokaler Zeit anzuzeigen und diese Information dann im Backend zu einer gemeinsamen Zeit (meist handelt es sich dabei um UTC) zu konsolidieren.

Glücklicherweise beherrscht das .NET-Framework den Umgang mit mehreren Zeitzonen. Schlüssel für das Ganze ist die TimeZoneInfo-Klasse. Im folgenden Beispiel möchte ich das mal verdeutlichen:

// DateTime in UTC
DateTime utcDate = DateTime.SpecifyKind(DateTime.Parse("2008-11-01T19:35:00.0000000Z"), DateTimeKind.Utc);

// create new TimeZoneInfo
TimeZoneInfo destinationTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");

// convert to local date in destination TimeZone
DateTime localDate =  TimeZoneInfo.ConvertTimeFromUtc(utcDate, destinationTimeZone);

Mittels der statischen Methode FindSystemTimeZoneById wird ein neues Objekt vom Typ TimeZoneInfo erzeugt. Die möglichen Zeitzonen sind im System definiert und finden sich in der Registry unter HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\TimeZones:

FindSystemTimeZoneById erwartet einen der hier definierten Schlüssel. Konnte keine Zeitzone mit der angegebenen Id gefunden werden, wird hier eine TimeZoneNotFound-Exception geworfen. Im nächsten Schritt kann dann mittels ConvertTime (bzw. ConvertTimeFromUtc) die Konvertierung durchgeführt werden.

Soweit ist das ja ganz einfach - nur müssen alle beteiligten Systeme die TimeZoneIds auch kennen. Natürlich wäre es auch möglich, nur einen UTC-Offset auszutauschen und dann diesen anzuwenden. Vorteil der hier dargestellten Methode ist, dass die Sommerzeit (Daylight Saving Time) automatisch angewandt wird.

Title-Feld mit Edit-Menü in der Listenansicht einer Dokumentenbibliothek

In der Listenansicht von Dokumentenbibliotheken ist es im Standard die Spalte Name, neben der das "!New"-Icon erscheint und neben der das Edit-Menü erscheint. Nicht immer ist es aber erwünscht, die doch manchmal sehr kryptischen Dateinamen anzuzeigen. Eine Title-Spalte mit Edit-Menü sucht man in der Konfiguration der Listenansicht aber vergebens.

In der SharePoint Users Group gibt es einen Post, der die Lösung für dieses Problem liefert:

Im Beispiel erzeuge ich zuerst eine Kopie der Standard-Ansicht namens "Title View", der noch die Titel-Spalte hinzugefügt wird.

Für die weitere Konfiguration wird der SharePoint-Designer benötigt. In der entsprechenden Dokumentenbibliothek wurde durch den vorherigen Schritt unter "Forms" eine aspx-Seite mit dem Namen der Ansicht angelegt.

 

Um diese Ansicht anzupassen, muss die Seite geöffnet und am besten Split-Ansicht aktiviert werden. Nun klickt man rechts auf die Ansicht und erhält ein Kontextmenü, das auch einen Eintrag enthält, mit dem man die Ansicht in die XSLT Data View konvertieren kann.

 

Ist diese Konvertierung vollständig durchgeführt, kann das XSLT angepasst werden. Um das Title-Feld anzupassen, klickt man es an. Um das "!New"-Icon hinter den Titel zu bekommen, kopiert man folgende Zeile aus dem Feld "Name":

<xsl:if test="ddwrt:IfNew(string(@Created))"><IMG SRC="/_layouts/1033/images/new.gif" alt="New" /></xsl:if>

Um die komplette Funktionalität des Feldes Name zu übernehmen, kopiert man die im entsprechenden TD-Tag enthaltene Tabelle und ersetzt

<xsl:value-of select="ddwrt:UrlBaseName(string(@LinkFilename))" />

durch

<xsl:value-of disable-output-escaping="yes" select="ddwrt:AutoNewLine(string(@Title))" />

Die Spalte "Name" kann nun aus der Ansicht gelöscht werden. Nachdem die Seite gespeichert wurde, enthält die resultierende Ansicht nun wie gewünscht die Titel-Spalte mit dem Edit-Dropdown und dem New-Icon.