Я думаю, что это должен быть только вопрос презентации.
Разрешите своим пользователям вводить данные в этом странном формате и немедленно преобразовывать их в UTC. Сделайте все расчеты по времени UTC. Затем создайте метод ToString, чтобы преобразовать результаты обратно в ваш странный формат. Возможно, вам также понадобятся некоторые другие служебные методы и свойства, такие как реализация WeirdDateTime.Day
.
Вы можете написать класс-оболочку вокруг DateTime и иметь все необходимые для этого класса методы преобразования и утилиты. Я попытался запустить его - осуществив синтаксический анализ строки в странном формате. Это не готовый к использованию производственный код, но, возможно, он может дать вам несколько идей о том, как вы можете подойти к этому:
class WeirdDateTime
{
public DateTime DateTime { get; set; }
public WeirdDateTime(int year, int month, int day, int hour, int minute, int second, DateTimeKind kind)
{
if (hour < 6 || hour >= 30)
throw new ArgumentException("Not a valid WeirdDateTime", "hour");
bool addDay;
if (hour >= 24)
{
addDay = true;
hour -= 24;
}
else
{
addDay = false;
}
DateTime dateTime = new DateTime(year, month, day, hour, minute, second, kind);
if (addDay)
dateTime = dateTime.AddDays(1);
DateTime = dateTime;
}
public static WeirdDateTime Parse(string s)
{
Regex regex = new Regex(@"(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})");
Match match = regex.Match(s);
if (!match.Success)
throw new FormatException("Not a valid WeirdDateTime");
int[] parts = match.Groups.Cast<Group>()
.Skip(1)
.Select(x => int.Parse(x.Value))
.ToArray();
int year = parts[0];
int month = parts[1];
int day = parts[2];
int hour = parts[3];
int minute = parts[4];
int second = parts[5];
return new WeirdDateTime(year, month, day, hour, minute, second, DateTimeKind.Unspecified);
}
public override string ToString()
{
throw new NotImplementedException("Write this!");
}
}
class Program
{
public static void Main()
{
WeirdDateTime weirdDateTime = WeirdDateTime.Parse("2010-01-19 27:00:00");
DateTime dateTimeUtc = weirdDateTime.DateTime.ToUniversalTime();
Console.WriteLine(dateTimeUtc);
}
}