74 lines
2.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using gehGassi.Web.Models;
namespace gehGassi.Web.Helper
{
/// <summary>
/// Hilfsklasse für den Umgang mit Zeitzonen
/// </summary>
public static class TimeZoneHelper
{
/// <summary>
/// Gibt eine Liste aller Zeitzonen zurück
/// </summary>
/// <returns>Liste</returns>
public static List<TimeZoneVm> GetTimeZones()
{
var timeZones = new List<TimeZoneVm>();
foreach (var zone in TimeZoneInfo.GetSystemTimeZones())
{
timeZones.Add(new TimeZoneVm()
{
Id = zone.Id,
Name = zone.DisplayName
});
}
return timeZones;
}
/// <summary>
/// Hilfsmethode die aus einem UTC-Offset als string die erste passende Zeitzone (Basis ohne Daylightsaving) auswählt
/// </summary>
/// <param name="offset">Offset</param>
/// <returns>Id der Zeitzone</returns>
public static string GetTimezoneIdByOffset(string offset)
{
offset = offset.Replace("+", "");
var timeSpan = TimeSpan.ParseExact(offset, "hh\\:mm", CultureInfo.InvariantCulture, TimeSpanStyles.None);
var firstOrDefault = TimeZoneInfo.GetSystemTimeZones().FirstOrDefault(c => c.BaseUtcOffset == timeSpan);
if (firstOrDefault != null)
return firstOrDefault.Id;
return "W. Europe Standard Time";
}
/// <summary>
/// Konvertiert ein UTC-Date in ein Datum das der aktuellen Auswahl des Benutzers entspricht
/// </summary>
/// <param name="utcDate">Datum in UTC-Format welches in das aktuell lokale Datum übersetzt werden soll</param>
/// <param name="timeZoneId">Id der Zeitzone</param>
/// <returns>Datum in lokaled Datum konvertiert</returns>
public static DateTime ConvertToLocal(DateTime utcDate, string timeZoneId)
{
var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
return TimeZoneInfo.ConvertTimeFromUtc(utcDate, timeZoneInfo);
}
/// <summary>
/// Konvertiert ein Benutzer bezogenes lokales Datum basierend auf der aktuellen Auswahl des Benutzers in ein UTC Datum
/// </summary>
/// <param name="localDate">Datum welches in UTC konvertiert werden soll</param>
/// <param name="timeZoneId">Id der Zeitzone</param>
/// <returns>Datum in UTC Konvertiert</returns>
public static DateTime ConvertToUtc(DateTime localDate, string timeZoneId)
{
var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
return TimeZoneInfo.ConvertTimeToUtc(localDate, timeZoneInfo);
}
}
}