Я работаю в причудливой и иррациональной промышленности, где мы должны смочь представить время суток как 6:00:00 к 30:00:00 вместо 0:00:00 к 24:00:00. Там какой-либо путь состоит в том, чтобы сделать это использование типа DateTime? Если я пытаюсь создать время даты со значением часа, больше, чем 24, оно выдает исключение.
Просто сохраните / верните вашу бизнес-логику DateTime.Hours.Add (6). Вы должны знать об этом в своей логике отображения.
Я думаю, что это должно касаться только презентации.
Разрешите вашим пользователям вводить данные в этом странном формате и сразу же конвертировать их в 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);
}
}
Как насчет использования вместо этого TimeSpan ?
DateTime departure = new DateTime(2010, 6, 12, 18, 32, 0);
DateTime arrival = new DateTime(2010, 6, 13, 22, 47, 0);
TimeSpan travelTime = arrival - departure;
Console.WriteLine("{0} - {1} = {2}", arrival, departure, travelTime);
Затем используйте свойство TotalHours
объекта TimeSpan
Параметры формата для TimeSpan:
a: [дни]. [Часы]: [минуты]: [секунды]. [Доли секунды]
b: [дни]. [Часы]: [минуты] : [секунды]
c: [дни]. [часы]: [минуты]
d: [дни]. [часы]
e: [дни]
f: [часы]: [ минуты]: [секунды]. [доли секунды]
g: [часы]: [минуты]: [секунды]
h: [часы]: [минуты]
Я сомневаюсь, что вы сможете сделать именно то, что ищете, но я надеюсь, что вы могли бы создать свой собственный класс DateTime это просто добавляет +6 часов к стоимости. т.е. хранит 00–24 внутри, но методы get / set делают его похожим на 06–30.
как насчет использования обычного DateTime для хранения фактического времени, и написания нового класса, который хранит (или является производным от ) DateTime, и имеет ToString(), который корректирует вывод.