Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. Other Discussions
  3. The Weird and The Wonderful
  4. How NOT to calculate the end of month...

How NOT to calculate the end of month...

Scheduled Pinned Locked Moved The Weird and The Wonderful
ruby
14 Posts 9 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • OriginalGriffO OriginalGriff

    Ah. I can see a problem developing there. I assume he tested it on the first of the month, and it worked fine? :laugh: Here is my stab at it:

    /// /// Returns the last day in the current month
    ///
    /// /// DateTime endOfMonth = DateTime.Now.LastDayOfMonth();
    ///
    /// Start date
    ///
    public static DateTime LastOfMonth(this DateTime dt)
    {
    int daysInMonth = DateTime.DaysInMonth(dt.Year, dt.Month);
    return dt.FirstOfMonth().AddDays(daysInMonth - 1).AtMidnight();
    }

    As seen before: DateTime Extensions to Make Some Simple Tasks a Little More Readable[^]

    "I have no idea what I did, but I'm taking full credit for it." - ThisOldTony AntiTwitter: @DalekDave is now a follower!

    R Offline
    R Offline
    Rob Grainger
    wrote on last edited by
    #3

    Actually, he had unit tests in place, but all the dates tested were on the first day of the month. My fix was:

    return new DateTime(dt.Year, dt.Month, 1).AddMonths(1).AddDays(-1);

    "If you don't fail at least 90 percent of the time, you're not aiming high enough." Alan Kay.

    OriginalGriffO L M O M 5 Replies Last reply
    0
    • R Rob Grainger

      Actually, he had unit tests in place, but all the dates tested were on the first day of the month. My fix was:

      return new DateTime(dt.Year, dt.Month, 1).AddMonths(1).AddDays(-1);

      "If you don't fail at least 90 percent of the time, you're not aiming high enough." Alan Kay.

      OriginalGriffO Offline
      OriginalGriffO Offline
      OriginalGriff
      wrote on last edited by
      #4

      :doh: I guess it's true for tests as well: GIGO ... :laugh:

      "I have no idea what I did, but I'm taking full credit for it." - ThisOldTony AntiTwitter: @DalekDave is now a follower!

      "I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
      "Common sense is so rare these days, it should be classified as a super power" - Random T-shirt

      1 Reply Last reply
      0
      • R Rob Grainger

        Actually, he had unit tests in place, but all the dates tested were on the first day of the month. My fix was:

        return new DateTime(dt.Year, dt.Month, 1).AddMonths(1).AddDays(-1);

        "If you don't fail at least 90 percent of the time, you're not aiming high enough." Alan Kay.

        L Offline
        L Offline
        Lost User
        wrote on last edited by
        #5

        And why not simply use DateTime.DaysInMonth?

        It does not solve my Problem, but it answers my question

        K 1 Reply Last reply
        0
        • L Lost User

          And why not simply use DateTime.DaysInMonth?

          It does not solve my Problem, but it answers my question

          K Offline
          K Offline
          kalberts
          wrote on last edited by
          #6

          Because the programmer wanted the attention of being presented here? :-)

          L 1 Reply Last reply
          0
          • K kalberts

            Because the programmer wanted the attention of being presented here? :-)

            L Offline
            L Offline
            Lost User
            wrote on last edited by
            #7

            Makes sense :laugh:

            It does not solve my Problem, but it answers my question

            1 Reply Last reply
            0
            • R Rob Grainger

              Actually, he had unit tests in place, but all the dates tested were on the first day of the month. My fix was:

              return new DateTime(dt.Year, dt.Month, 1).AddMonths(1).AddDays(-1);

              "If you don't fail at least 90 percent of the time, you're not aiming high enough." Alan Kay.

              M Offline
              M Offline
              Marc Clifton
              wrote on last edited by
              #8

              Rob Grainger wrote:

              but all the dates tested were on the first day of the month.

              :laugh: :laugh: :laugh:

              Latest Articles:
              Abusing Extension Methods, Null Continuation, and Null Coalescence Operators

              1 Reply Last reply
              0
              • R Rob Grainger

                Found this gem in our codebase...

                public static class DateTimeExtensions
                {
                public static DateTime EndOfMonth(this DateTime dt)
                {
                return dt.Date.AddMonths(1).AddDays(-1);
                }
                }

                "If you don't fail at least 90 percent of the time, you're not aiming high enough." Alan Kay.

                E Offline
                E Offline
                EbenRoux
                wrote on last edited by
                #9

                Not to be pernickity but I guess it is going to depend on the intention of the method. If a trial runs for a month then perhaps from a given date that would be the end of the month :) However, the intention is not clear from the method name so one may very well assume that it represents the date for the last day in the month of the given date.

                R 1 Reply Last reply
                0
                • E EbenRoux

                  Not to be pernickity but I guess it is going to depend on the intention of the method. If a trial runs for a month then perhaps from a given date that would be the end of the month :) However, the intention is not clear from the method name so one may very well assume that it represents the date for the last day in the month of the given date.

                  R Offline
                  R Offline
                  Rob Grainger
                  wrote on last edited by
                  #10

                  Personally, I feel that an extension method on DateTime should apply to all possible DateTime instances. Otherwise, it can be defined to match circumstances, as long as that is clear from the name.

                  "If you don't fail at least 90 percent of the time, you're not aiming high enough." Alan Kay.

                  1 Reply Last reply
                  0
                  • R Rob Grainger

                    Found this gem in our codebase...

                    public static class DateTimeExtensions
                    {
                    public static DateTime EndOfMonth(this DateTime dt)
                    {
                    return dt.Date.AddMonths(1).AddDays(-1);
                    }
                    }

                    "If you don't fail at least 90 percent of the time, you're not aiming high enough." Alan Kay.

                    B Offline
                    B Offline
                    BDieser
                    wrote on last edited by
                    #11

                    30 days have September, all the rest I can't remember.

                    R 1 Reply Last reply
                    0
                    • R Rob Grainger

                      Actually, he had unit tests in place, but all the dates tested were on the first day of the month. My fix was:

                      return new DateTime(dt.Year, dt.Month, 1).AddMonths(1).AddDays(-1);

                      "If you don't fail at least 90 percent of the time, you're not aiming high enough." Alan Kay.

                      O Offline
                      O Offline
                      obermd
                      wrote on last edited by
                      #12

                      Rob Grainger wrote:

                      return new DateTime(dt.Year, dt.Month, 1).AddMonths(1).AddDays(-1);

                      This is exactly my EndOfMonth extension function in dotNet.

                      1 Reply Last reply
                      0
                      • B BDieser

                        30 days have September, all the rest I can't remember.

                        R Offline
                        R Offline
                        Rob Grainger
                        wrote on last edited by
                        #13

                        I resemble that remark.

                        "If you don't fail at least 90 percent of the time, you're not aiming high enough." Alan Kay.

                        1 Reply Last reply
                        0
                        • R Rob Grainger

                          Actually, he had unit tests in place, but all the dates tested were on the first day of the month. My fix was:

                          return new DateTime(dt.Year, dt.Month, 1).AddMonths(1).AddDays(-1);

                          "If you don't fail at least 90 percent of the time, you're not aiming high enough." Alan Kay.

                          M Offline
                          M Offline
                          Myron Dombrowski
                          wrote on last edited by
                          #14

                          This gets you the last *date* of the month, but if you’re actually looking for the “end” of the month and don’t want fencepost errors, you’d want the first of the next month (with no time component) and then use a strict less-than in your comparisons.

                          1 Reply Last reply
                          0
                          Reply
                          • Reply as topic
                          Log in to reply
                          • Oldest to Newest
                          • Newest to Oldest
                          • Most Votes


                          • Login

                          • Don't have an account? Register

                          • Login or register to search.
                          • First post
                            Last post
                          0
                          • Categories
                          • Recent
                          • Tags
                          • Popular
                          • World
                          • Users
                          • Groups