题 创建仅包含月和日的日期时间,不包括年份


我在VS中为sharepoint创建一个计时器作业,我想创建一个只有月和日的Date对象。这是因为我希望这份工作每年在特定日期开展。

如果使用日期对象是不可能的,那么你会怎么做呢?

这是我得到的:

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

27
2017-10-31 19:46


起源


日期有多年。故事结局。如果您只想要月份和日期,请创建自己的对象类型来保存它。 - Joel Coehoorn
谁将使用此日期时间对象? - sll
的确如此,我想我的问题就是..如果没有多个对象/事件,你怎么能有一个重复的日期 - novicePrgrmr
@novicePrgrmr:你是什么意思 recurring date without....? - sll
@sll我的意思是每年指定的月份和日期.. - novicePrgrmr


答案:


好吧,你可以创建自己的类型 - 但是 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
}

请注意,您选择的年份会影响该类型的行为 - 2月29日是否应该是有效的月/日值?这取决于年份......

就个人而言,我不认为我  为此创建一个类型 - 相反,我有一个方法可以返回“下次运行程序时”。


42
2017-10-31 19:50



是否 NodaTime 解决这个问题? - Shimmy
@Shimmy:Noda Time没有月/日类型,没有 - 也没有年/月类型,因为您可能需要信用卡。 - Jon Skeet
tx为您的回复。在Java NodaTime中,我错了吗? - Shimmy
@Shimmy:你的意思是在Joda Time?是。我还没有决定是否将其纳入Noda Time是一个非常重要的想法 - 我正在努力保持这种精益。 - Jon Skeet
@ MikkelR.Lund:自从写了这个答案(差不多6年前)和评论(2年前)Noda Time 不 有 AnnualDate。 - Jon Skeet


如何在下一个日期创建计时器?

在你的计时器回调中你创建了下一年的计时器? DateTime始终为年份值。您想要表达的是经常性的时间规范。这是您需要创建的另一种类型。 DateTime始终表示特定日期和时间,但不是重复日期。


1
2017-10-31 19:52





没有像这样的东西 DateTime 没有一年!

从我收集到的你的设计有点奇怪:

我建议存储一个“开始”(DateTime 包括第一次出现的年份和一个指定如何计算下一个事件的值...这可能是例如a TimeSpan 或者某些自定义结构。因为“每年”可能意味着事件发生在特定日期,并且不会自动与说明它发生在+365天内相同。

事件发生后,您计算下一个并存储该等。


1
2017-10-31 19:51





无论如何你需要'年'。

在某些工程领域,您可以固定日期和月份,并且年份可以变化。但是那天和月对于开始计算很重要,而不考虑你是哪一年。例如,您的用户只应选择一天一个月,并且提供年份取决于您。

您可以使用以下方法创建自定义组合框: 可自定义的ComboBox下拉菜单

1-在VS中创建用户控件。

2-请参阅上面链接中的代码以阻止该控件。

3-创建另一个用户控件并在其中放置31按钮或标签,在它们上方放置一个标签以显示月份。

4-将控件放入自定义组合框中的步骤3中。

5-将控制器放入步骤1中的setp 4中。

你现在只有几天和几个月的控制权。您可以使用数据库中的任何年份或....


0
2017-12-10 04:41