【问题标题】:Net DateTime.AddMonths(1) doesn't work the same as Javascript d.setMonth(d.getMonth() + 1)Net DateTime.AddMonths(1) 与 Javascript d.setMonth(d.getMonth() + 1) 的工作方式不同
【发布时间】:2009-09-24 17:16:31
【问题描述】:

我有客户端日期验证,它要求一个特定的日期与另一个日期相差一个月,所以我使用d.setMonth(d.getMonth() + 1) 并且大多数情况下都可以正常工作。

对于 2009 年 1 月 31 日的月末问题,它会返回 2009 年 3 月 3 日,这很好 - 这就是我希望它处理它的方式。

在后面的代码中,我也生成了这个日期,但 DateTime.AddMonths(1) 返回 2/28/2009,所以这不好。

有没有办法解决这个问题?

【问题讨论】:

  • 我不敢相信你认为 3/3 正好是 1/31 之后的一个月,但无论如何!
  • 正好是1/31之后的30天...
  • 我的想法并不重要——那是当权者所期望的行为。

标签: .net javascript datetime


【解决方案1】:

.NET 功能无疑更加智能。但是,如果您想将其简化为像 Javascript 一样,请改为添加 31 天...

DateTime.AddDays(31)

【讨论】:

  • 你会这么认为,但是对于 2009 年 2 月 1 日,我想获得 2009 年 3 月 1 日,所以这行不通。
  • 哇哦。所以 1/31 之后的一个月是 3/3。 2/1 之后的一个月是 3/1。这很有意义,不是吗?
  • 哦,我知道这实际上没有意义,但我必须让网站模仿我无法控制或发言的桌面应用程序的行为。不要把它当作私人的。
【解决方案2】:

从您将 2009 年 1 月 31 日更改为 2009 年 3 月 3 日的示例,听起来您只是想要一种将指定日期提前其相应月份的天数的方法。 (如果是在 1 月,则在日期上增加 31 天,如果在非闰年的 2 月,则增加 28 天,等等......)

所以你的代码看起来像:

d = d.AddDays(DateTime.DaysInMonth(d.Year, d.Month))

【讨论】:

    【解决方案3】:

    添加到 Josh 的答案...不太确定为什么要这样做,但如果您确实想要一个未内置的特定行为,请记住您有能力编写扩展。此扩展向 DateTime 添加了一个名为“AddMonthsJ”的方法。这给出了我认为您正在寻找的行为,并使其易于使用。您可以将扩展名修改为您在不断变化的月份中寻找的任何内容。

    class Program
    {
        static void Main(string[] args)
        {
            DateTime myDate = DateTime.Parse("01/31/2009");
    
            myDate = myDate.AddMonthsJ(1);
    
            Console.WriteLine(myDate.ToShortDateString());
    
            Console.ReadLine();
        }
    }
    
    public static class Extensions
    {
        public static DateTime AddMonthsJ(this DateTime oldDate, int months)
        {
            return (oldDate.AddDays(months * 31));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-11-17
      • 1970-01-01
      • 2022-01-08
      • 2014-06-20
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      • 2018-12-03
      • 2018-05-29
      相关资源
      最近更新 更多