Я работаю в причудливой и иррациональной индустрии, где мы должны иметь возможность представлять время дня с 06:00:00 до 30:00:00 вместо 0:00:00 до 24:00:00. Есть ли способ сделать это, используя тип DateTime? Если я попытаюсь построить дату с часовым значением больше 24, это вызовет исключение.
Храните более 24 часов в формате DateTime
Ответ 1
Я думаю, что это должно быть только проблема с презентацией.
Позвольте своим пользователям вводить данные в этом странном формате и немедленно конвертировать их в 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);
}
}
Ответ 2
Как насчет использования 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 obj
Ответ 3
Я сомневаюсь, что вы можете делать именно то, что ищете, но я ожидаю, что вы сможете создать свой собственный класс DateTime, который просто добавит к стоимости значение +6 часов. то есть хранит 00-24 внутри, но методы get/set делают это похоже на 06 - 30.
Ответ 4
Просто сохраните/верните свою бизнес-логику DateTime.Hours.Add(6). Вы должны знать об этом в своей логике отображения.
Ответ 5
как "использовать обычную дату DateTime для хранения фактического времени и писать новый класс, который хранит (или получает) DateTime и имеет ToString(), который настраивает вывод.
Ответ 6
- Вы должны использовать TimeSpan, а не DateTime.
-
Параметры формата для TimeSpan:
a: [дни]. [часы]: [минуты]: [секунды]. [дробные секунды]
b: [дни]. [часы]: [минуты]: [секунды]
c: [дни]. [часы]: [минуты]
d: [дни]. [часы]
e: [days]
f: [часы]: [минуты]: [секунды]. [дробные секунды]
g: [часы]: [минуты]: [секунды]
h: [часы]: [минуты]