Хранить более 24 часов в DateTime - PullRequest
11 голосов
/ 02 апреля 2010

Я работаю в причудливой и иррациональной индустрии, где нам нужно представлять время дня с 06:00:00 до 30:00:00 вместо 0:00:00 до 24:00:00. Есть ли способ сделать это, используя тип DateTime? Если я пытаюсь построить дату и время в часах больше 24, это вызывает исключение.

Ответы [ 7 ]

10 голосов
/ 02 апреля 2010

Я думаю, что это должен быть только вопрос презентации.

Разрешите своим пользователям вводить данные в этом странном формате и немедленно преобразовывать их в 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 голосов
/ 02 апреля 2010

Я сомневаюсь, что вы можете делать именно то, что вы ищете, но я ожидаю, что вы можете создать свой собственный класс DateTime, который просто добавляет +6 часов к значению. то есть хранит 00 - 24 внутри, но методы get / set делают его похожим на 06 - 30.

2 голосов
/ 02 апреля 2010

Как насчет использования 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

0 голосов
/ 24 апреля 2019

Я для расчета рабочего времени сотрудников использовать эту функцию:

     public string SumHours(string TimeIn, string TimeOut)
    {
        var parts = TimeIn.Split(':');
        var hours = Int32.Parse(parts[0]);
        var minutes = Int32.Parse(parts[1]);
        var result = new TimeSpan(hours, minutes, 0);
        TimeIn = result.ToString();

        TimeSpan Hour1 = TimeSpan.Parse(TimeIn);
        TimeSpan Hour2 = TimeSpan.Parse(TimeOut);
        Hour1 = Hour1.Add(Hour2);

        string HourtoStr = string.Format("{0:D2}:{1:D2}:{2:D2}", (Hour1.Days * 24 + Hour1.Hours), Hour1.Minutes, Hour1.Seconds);
        return HourtoStr;
    }
0 голосов
/ 02 апреля 2010
  1. Вы должны использовать TimeSpan, а не DateTime.
  2. Параметры формата TimeSpan:

    a: [дни]. [Часы]: [минуты]: [секунды]. [Доли секунды]

    b: [дни]. [Часы]: [минуты]: [секунды]

    c: [дни]. [Часы]: [минуты]

    d: [дни]. [Часы]

    е: [дней]

    f: [часы]: [минуты]: [секунды]. [Доли секунды]

    г: [часы]: [минуты]: [секунды]

    ч: [часы]: [минуты]

0 голосов
/ 02 апреля 2010

как насчет использования обычного DateTime для хранения фактического времени и написания нового класса, который хранит (или наследует) DateTime и имеет ToString (), который регулирует вывод.

0 голосов
/ 02 апреля 2010

Просто сохраните / верните свою бизнес-логику DateTime.Hours.Add (6). Вы должны знать об этом в логике своего дисплея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...