Создать дату и время только с месяцем и днем, без года - PullRequest
29 голосов
/ 31 октября 2011

Я создаю задание таймера в VS для sharepoint, и я хочу создать объект Date, у которого есть только месяц и день. Причина этого в том, что я хочу, чтобы эта работа выполнялась ежегодно в конкретную дату.

Если это невозможно с объектом даты, то как бы вы это сделали?

Вот что у меня есть:

DateTime value = new DateTime(2010, 1, 18);

Ответы [ 4 ]

45 голосов
/ 31 октября 2011

Ну, вы можете создать свой собственный тип - но у DateTime всегда есть полная дата и время.Вы не можете даже иметь «просто дату», используя DateTime - самое близкое, что вы можете прийти, это иметь DateTime в полночь.

Вы всегда можете игнорировать год, хотя- или взять текущий год:

// Consider whether you want DateTime.UtcNow.Year instead
DateTime value = new DateTime(DateTime.Now.Year, month, day);

Чтобы создать свой собственный тип, вы всегда можете просто встроить DateTime в структуру и прокси на вызовы типа AddDays и т. д .:

public struct MonthDay : IEquatable<MonthDay>
{
    private readonly DateTime dateTime;

    public MonthDay(int month, int day)
    {
        dateTime = new DateTime(2000, month, day);
    }

    public MonthDay AddDays(int days)
    {
        DateTime added = dateTime.AddDays(days);
        return new MonthDay(added.Month, added.Day);
    }

    // TODO: Implement interfaces, equality etc
}

Обратите внимание, что выбранный вами год влияет на поведение типа - должно ли 29 февраля быть допустимым значением месяца / дня или нет?Это зависит от года ...

Лично я не думаю, что я создаст для этого тип - вместо этого у меня будет метод возврата "в следующий раз, когда программа должнабеги ".

1 голос
/ 31 октября 2011

Как насчет создания таймера со следующей датой?

При обратном вызове таймера вы создаете таймер на следующий год?DateTime всегда имеет значение года.То, что вы хотите выразить, является повторяющимся указанием времени.Это еще один тип, который вам нужно создать.DateTime всегда представляет конкретную дату и время, но не повторяющуюся дату.

1 голос
/ 31 октября 2011

Нет такой вещи, как DateTime без года!

Из того, что я понял, ваш дизайн немного странный:

Я бы порекомендовал сохранить "начало" (DateTime включая год для ПЕРВОГО вхождения) и значение, которое определяет, как рассчитать следующее событие ... это может быть, например, TimeSpan или какая-то другая пользовательская структура esp.поскольку «каждый год» может означать, что событие происходит в определенную дату и не будет автоматически совпадать с сообщением о том, что оно происходит через +365 дней.

После того, как событие происходит, вы вычисляете следующее и сохраняете это и т. д..

0 голосов
/ 10 декабря 2017

В любом случае вам нужен год.

В некоторых инженерных областях фиксированный день и месяц и год могут быть переменными. Но этот день и месяц важны для начала расчета без учета того, в каком году вы находитесь. Например, ваш пользователь должен выбрать только день и месяц, а год предоставления зависит от вас.

Вы можете создать пользовательский комбинированный список с помощью этого: Настраиваемый раскрывающийся список ComboBox .

1- В VS создайте пользовательский элемент управления.

2 - См. Код в ссылке выше, чтобы реализовать этот элемент управления.

3- Создайте еще один пользовательский элемент управления и поместите в него 31 кнопку или метку, а над ними разместите метку для отображения месяцев.

4- Поместите элемент управления в шаге 3 в свой пользовательский список.

5- Поместите элемент управления в setp 4 в шаге 1.

Теперь у вас есть контроль только с днями и месяцами. Вы можете использовать любой год, который у вас есть в вашей базе данных или ....

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