【问题标题】:Create a date time with month and day only, no year创建一个只有月份和日期的日期时间,没有年份
【发布时间】:2017-12-10 13:02:37
【问题描述】:

我正在 VS 中为 sharepoint 创建一个计时器作业,并且我想创建一个只有一个月和一天的 Date 对象。这样做的原因是因为我希望这项工作每年在特定日期运行。

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

这是我得到的:

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

【问题讨论】:

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

标签: c# datetime


【解决方案1】:

好吧,您可以创建自己的类型 - 但 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 日是否应该是有效的月/日值?这取决于年份...

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

【讨论】:

  • @Shimmy:Noda Time 中没有月/日类型,也没有您可能想要的信用卡年/月类型。
  • tx 供您回复。 Java NodaTime 里面有,我错了吗?
  • @Shimmy:你是说在 Joda Time?是的。我还没有决定是否将它包含在 Noda Time 中是否足够重要 - 我正在努力保持精简。
  • @MikkelR.Lund:自从写了这个答案(大约 6 年前)和评论(2 年前)之后,Noda Time 确实AnnualDate
  • @Ash18:您可以使用DateTimeFormatInfo.MonthNamesDateTimeFormatInfo.AbbreviatedMonthNames。我不确定这是否真的与您添加评论的问题有关 - 最好提出一个新问题。
【解决方案2】:

如何创建一个带有下一个日期的计时器?

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

【讨论】:

    【解决方案3】:

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

    据我所知,你的设计有点奇怪:

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

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

    【讨论】:

      【解决方案4】:

      无论如何你需要'年'。

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

      您可以使用以下命令创建自定义组合框:Customizable ComboBox Drop-Down

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

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

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

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

      5- 在步骤 1 中将控件置于 setp 4 中。

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

      【讨论】:

        猜你喜欢
        • 2018-10-15
        • 1970-01-01
        • 1970-01-01
        • 2021-09-08
        • 2013-06-07
        • 1970-01-01
        • 1970-01-01
        • 2011-06-27
        • 2021-12-15
        相关资源
        最近更新 更多