Datový typ DateTime má v sobě položku DateTimeKind, která může nabývat hodnot Local, Utc, Unspecified. Podle nastavení této hodnoty je po-té provedena konverze časové zóny při volání webové služby.
V případě kindu unspecified se konverze časové zóny neprovádí. V případě kindu local se převede časová zóna volající strany do časové zóny příjemce. V případě kindu UTC se čas také nepřevádí.
Kind se při přenosu nemění.
Zde jsou příklady, jak která operace v C# nastavuje DateTimeKind:
DateTime dt1 = DateTime.Now; // DateTimeKind.Local DateTime dt2 = DateTime.UtcNow; // DateTimeKind.Utc DateTime dt3 = new DateTime(2014, 1, 1); // DateTimeKind.Unspecified DateTime dt4 = DateTime.Now.ToLocalTime(); // DateTimeKind.Local DateTime dt5 = DateTime.Now.ToUniversalTime(); // DateTimeKind.Utc DateTime dt6 = DateTime.SpecifyKind(DateTime.Now.ToUniversalTime(), DateTimeKind.Unspecified); // DateTimeKind.Unspecified, pouze změna kindu bez konverze času
Při přenosu času jsme nakonec použili toto řešení:
Struktura: ... public class WorkLogItemDTO { /// <summary> /// Datum pracovního záznamu. /// </summary> public DateTime Datum { get; set; } /// <summary> /// Identifikátor klientské časové zóny. /// </summary> public string TimeZoneID { get; set; } ... Klient (při volání serveru): ... dto.Datum = item.Datum; dto.TimeZoneID = TimeZoneInfo.Local.Id; ... Server: ... if (item.Datum.Kind != DateTimeKind.Unspecified) { if (string.IsNullOrEmpty(item.TimeZoneID)) { throw new Exception("Casova zona neni vyplnena (WorkLogItemDTO->IdTimeZone)."); } TimeZoneInfo clientTimeZone = TimeZoneInfo.FindSystemTimeZoneById(item.TimeZoneID); item.Datum = TimeZoneInfo.ConvertTime(item.Datum, clientTimeZone); } ...