Main Points

  • Section1 Section 1 for Earth Chronicle Beta Template.
  • Section2 Section 2 for Earth Chronicle Beta Template.
  • Section3 Section 3 for Earth Chronicle Beta Template.

This page is under heavy testing. Don't expect it to make much sense at this point, but if you have any suggestions, we'd love to hear from you. Or check out the discussion page for more information.

Section1

Let's test the new validation and normalization code.

Test new SetEcDateTime() validation

currentEcDateTime.Now(): (2012/05/21 01:28:58)

29 invalid for Feb. 2011, currentEcDateTime.SetEcDateTime(2011, 2, 29, 9, 9, 9): ()

29 valid in leap year, currentEcDateTime.SetEcDateTime(2012, 2, 29, 9, 9, 9): (2012/02/29 09:09:09)

29 invalid for "00" years, currentEcDateTime.SetEcDateTime(900, 2, 29, 9, 9, 9): ()

currentEcDateTime.SetEcDateTime(2011, 2, 28, 9, 9, 9): (2011/02/28 09:09:09)

30 valid for Sept., currentEcDateTime.SetEcDateTime(2011, 9, 30, 9, 9, 9): (2011/09/30 09:09:09)

31 invalid for Sept., currentEcDateTime.SetEcDateTime(2011, 9, 31, 9, 9, 9): ()

31 valid for Oct., currentEcDateTime.SetEcDateTime(1998, 10, 31, 9, 9, 9): (1998/10/31 09:09:09)

Test Normalizing with Real Month/Day Conversions

  • currentEcDateTime.AddSeconds(1000000): (1998/11/11 22:55:49)
    1,000,000 seconds ~ 16,667 minutes ~ 278 hours ~ 11.6 days = 11 days 13h 46m 40s
  • currentEcDateTime.AddDays(365): (1999/11/11 22:55:49)
    365 days = 1 year (drops one day on leap years)
  • currentEcDateTime.AddDays(365): (2000/11/10 22:55:49)
    365 days = 1 year (drops one day on leap years)
  • currentEcDateTime.AddDays(365): (2001/11/10 22:55:49)
    365 days = 1 year (drops one day on leap years)
  • currentEcDateTime.AddDays(365): (2002/11/10 22:55:49)
    365 days = 1 year (drops one day on leap years)
  • currentEcDateTime.AddDays(365): (2003/11/10 22:55:49)
    365 days = 1 year (drops one day on leap years)
  • currentEcDateTime.AddDays(365): (2004/11/09 22:55:49)
    365 days = 1 year (drops one day on leap years)
  • currentEcDateTime.AddDays(365): (2005/11/09 22:55:49)
    365 days = 1 year (drops one day on leap years)
  • currentEcDateTime.AddDays(365): (2006/11/09 22:55:49)
    365 days = 1 year (drops one day on leap years)
  • currentEcDateTime.AddDays(365): (2007/11/09 22:55:49)
    365 days = 1 year (drops one day on leap years)
  • currentEcDateTime.AddDays(365): (2008/11/08 22:55:49)
    365 days = 1 year (drops one day on leap years)
  • currentEcDateTime.AddDays(365): (2009/11/08 22:55:49)
    365 days = 1 year (drops one day on leap years)
  • currentEcDateTime.AddDays(365): (2010/11/08 22:55:49)
    365 days = 1 year (drops one day on leap years)
  • currentEcDateTime.AddDays(365): (2011/11/08 22:55:49)
    365 days = 1 year (drops one day on leap years)
  • currentEcDateTime.AddDays(365): (2012/11/07 22:55:49)
    365 days = 1 year (drops one day on leap years)
  • currentEcDateTime.AddDays(365): (2013/11/07 22:55:49)
    365 days = 1 year (drops one day on leap years)
  • currentEcDateTime.AddHours(1000): (2013/12/19 14:55:49)
    1000 hours = 41 days 16 hours
  • currentEcDateTime.AddDays(20): (2014/01/08 14:55:49)
    20 days to cross the year boundary
  • currentEcDateTime.AddDays(-365): (2013/01/08 14:55:49)
    365 days = 1 year (adds one day on leap years)
  • currentEcDateTime.AddDays(-365): (2012/01/09 14:55:49)
    365 days = 1 year (adds one day on leap years)
  • currentEcDateTime.AddDays(-365): (2011/01/09 14:55:49)
    365 days = 1 year (adds one day on leap years)
  • currentEcDateTime.AddDays(-365): (2010/01/09 14:55:49)
    365 days = 1 year (adds one day on leap years)
  • currentEcDateTime.AddDays(-365): (2009/01/09 14:55:49)
    365 days = 1 year (adds one day on leap years)
  • currentEcDateTime.AddDays(-365): (2008/01/10 14:55:49)
    365 days = 1 year (adds one day on leap years)
  • currentEcDateTime.AddDays(-365): (2007/01/10 14:55:49)
    365 days = 1 year (adds one day on leap years)
  • currentEcDateTime.AddDays(-15): (2006/12/26 14:55:49)
    moving back and forth across and month and year barrier
  • currentEcDateTime.AddDays(-365): (2005/12/26 14:55:49)
    365 days = 1 year (adds one day on leap years)
  • currentEcDateTime Starting: (2005/12/26 14:55:49)
    currentEcDateTime.AddDays(300): (2006/10/22 14:55:49)
    currentEcDateTime.AddDays(-25): (2006/09/27 14:55:49)
    currentEcDateTime.AddDays(5): (2006/10/02 14:55:49)
    currentEcDateTime.AddDays(-140): (2006/05/15 14:55:49)
    currentEcDateTime.AddDays(60): (2006/07/14 14:55:49)
    currentEcDateTime.AddDays(-200): (2005/12/26 14:55:49)
    I'm subtracting as many days as I'm adding, so we should wind up back at the same spot.
  • currentEcDateTime Starting: (2004/02/01 00:00:00)
    currentEcDateTime.AddDays(30): (2004/03/02 00:00:00)
    currentEcDateTime.AddDays(-5): (2004/02/26 00:00:00)
    currentEcDateTime.AddDays(3): (2004/02/29 00:00:00)
    currentEcDateTime.AddDays(-5): (2004/02/24 00:00:00)
    currentEcDateTime.AddYears(1): (2005/02/24 00:00:00)
    currentEcDateTime.AddDays(5): (2005/03/01 00:00:00)
    currentEcDateTime.AddDays(-3): (2005/02/26 00:00:00)
    currentEcDateTime.AddDays(10): (2005/03/08 00:00:00)
    currentEcDateTime.AddDays(-8): (2005/02/28 00:00:00)
    currentEcDateTime.AddYears(-1): (2004/02/28 00:00:00)
    currentEcDateTime.AddDays(60): (2004/04/28 00:00:00)
    currentEcDateTime.AddDays(-87): (2004/02/01 00:00:00)
    I'm subtracting as many days as I'm adding, so we should wind up back at the same spot.
  • currentEcDateTime.SetEcDateTime(2004, 1, 31, 0, 0, 0): (2004/01/31 00:00:00)
    currentEcDateTime.AddMonths(1): ()
    Blows up because 2/31 doesn't exist.
  • currentEcDateTime.SetEcDateTime(2004, 2, 29, 0, 0, 0): (2004/02/29 00:00:00)
    currentEcDateTime.AddYears(1): ()
    Blows up because 2/29 doesn't exist in 2005.
  • currentEcDateTime.SetEcDateTime(-1204, 2, 29, 0, 0, 0): (-1204/02/29 00:00:00)
    currentEcDateTime.AddYears(4): (-1200/02/29 00:00:00)
    Works because 2/29 exists in -1200 (divisible by 400).
  • currentEcDateTime.SetEcDateTime(1304, 2, 29, 0, 0, 0): (1304/02/29 00:00:00)
    currentEcDateTime.AddYears(-4): ()
    Blows up because 2/29 doesn't exist in 1300 (divisible by 100, but not 400).
  • bclDateTime = DateTime(2004, 1, 31, 0, 0, 0): (1/31/2004 12:00:00 AM)
    bclDateTime = bclDateTime.AddMonths(1): (2/29/2004 12:00:00 AM)
    Returns the maximum valid value (2/29) because 2/31 doesn't exist.
    bclDateTime = bclDateTime.AddYears(1): (2/28/2005 12:00:00 AM)
    Returns the maxmim valid value (2/28) because 2/29 doesn't exist in 2005.
    bclDateTime = bclDateTime.AddMonths(1): (3/28/2005 12:00:00 AM)
    Works because 3/28 exists - although it's now off by 3 days from what you would probably have expected.

This highlights a really fundamental issue with the add functions. Because there are a variable number of days depending on the month, it's possible for perfectly valid initial values to be appropriately normalized and still result in error codes. If you add one month to 2004/1/31, you get 2004/2/31. That's not valid, 31 is a perfectly acceptable day count for January, but not for February. The natural behavior of my EcDateTime is to recognize the bad data and shift to error values. One idea I had was to modify the value to the closest approximation. The problem is that there is no good way to deal with this. Should 2004/2/31 map to the maximum day in January (in this case 2004/2/29) or should it preserve those extra days (2004/2/29 + 2 days = 2004/3/2).

The problem is, neither is good data; if you take 2004/1/31 and add two months, you expect to get 2004/3/31. However, normalizing calendar code would only give you that value if you use AddMonths(2). If you use AddMonths(1) two times you're going to wind up with either 2004/4/2 or 2004/3/29. It may be possible to resolve some of this by adding another layer of complexity, we could try to remember the "original" value, whatever that means, and attempt to "stay true" whatever add operations are performed thereafter. However, that doesn't answer the question, does 2004/1/31 + 1 month have any valid answer. Our options 2004/2/29 and 2004/3/2 are the best we can do and they are approximations. This is a really nasty fundamental issue.

This is why my final check in this test was to run those computations with the BCL version of the DateTime. Microsoft's solution was to keep the month the same and use the maximum allowable value. Nor do they worry about adding another intricate level of complexity, this class is already more than complex enough. In the BCL, 2004/1/31 + 2 months = 2004/3/31, however 2004/1/31 + 1 month = 2004/2/29 and if we add another month we get 2004/3/29. So the value of the DateTime varies depending on what functions you call to get there. I liked this solution even less when I see it in action, thought it did at least save me having to code it for myself.

I don't like the fact that trying to shoehorn an invalid date into a DateTime creates a math that is inconsistent and depends on what functions you call and what values you enter into the functions. Operations which seem like the ought to be equivalent form the outside trigger private "fudging" functions. In some situations this might be OK, it returns a value, but leaves you totally ignorant of the fact that anything "funny" has happened. One of the reasons I prefer C# to JavaScript is that the compiler throws errors at you so you know that something needs managing for your case. Using the maximum valid day forces that behavior on you. Nor are any of the alternatives for returning a valid date in this case clearly inferior or superior. I think it is wiser to leave the current EcDateTime behavior in place; when such an edge case occurs, let it be an invalid value so that it can be processed as the particular case requires. Maybe there is already error handling in place that addresses this appropriately, or at the very worst, you can get all the data out of the EcDateTime, manipulate it yourself for your custom needs and then plug it back into another EcDateTime. That seems the most sensible and flexible.

Now let's write the calendar dates to make sure that everything is counting correctly.

Write Calendar Test

Writing 450 days from Jan. 1, 2003 (enough for a full year plus the next leap February)

  • January 1, 2003
  • January 2, 2003
  • January 3, 2003
  • January 4, 2003
  • January 5, 2003
  • January 6, 2003
  • January 7, 2003
  • January 8, 2003
  • January 9, 2003
  • January 10, 2003
  • January 11, 2003
  • January 12, 2003
  • January 13, 2003
  • January 14, 2003
  • January 15, 2003
  • January 16, 2003
  • January 17, 2003
  • January 18, 2003
  • January 19, 2003
  • January 20, 2003
  • January 21, 2003
  • January 22, 2003
  • January 23, 2003
  • January 24, 2003
  • January 25, 2003
  • January 26, 2003
  • January 27, 2003
  • January 28, 2003
  • January 29, 2003
  • January 30, 2003
  • January 31, 2003
  • February 1, 2003
  • February 2, 2003
  • February 3, 2003
  • February 4, 2003
  • February 5, 2003
  • February 6, 2003
  • February 7, 2003
  • February 8, 2003
  • February 9, 2003
  • February 10, 2003
  • February 11, 2003
  • February 12, 2003
  • February 13, 2003
  • February 14, 2003
  • February 15, 2003
  • February 16, 2003
  • February 17, 2003
  • February 18, 2003
  • February 19, 2003
  • February 20, 2003
  • February 21, 2003
  • February 22, 2003
  • February 23, 2003
  • February 24, 2003
  • February 25, 2003
  • February 26, 2003
  • February 27, 2003
  • February 28, 2003
  • March 1, 2003
  • March 2, 2003
  • March 3, 2003
  • March 4, 2003
  • March 5, 2003
  • March 6, 2003
  • March 7, 2003
  • March 8, 2003
  • March 9, 2003
  • March 10, 2003
  • March 11, 2003
  • March 12, 2003
  • March 13, 2003
  • March 14, 2003
  • March 15, 2003
  • March 16, 2003
  • March 17, 2003
  • March 18, 2003
  • March 19, 2003
  • March 20, 2003
  • March 21, 2003
  • March 22, 2003
  • March 23, 2003
  • March 24, 2003
  • March 25, 2003
  • March 26, 2003
  • March 27, 2003
  • March 28, 2003
  • March 29, 2003
  • March 30, 2003
  • March 31, 2003
  • April 1, 2003
  • April 2, 2003
  • April 3, 2003
  • April 4, 2003
  • April 5, 2003
  • April 6, 2003
  • April 7, 2003
  • April 8, 2003
  • April 9, 2003
  • April 10, 2003
  • April 11, 2003
  • April 12, 2003
  • April 13, 2003
  • April 14, 2003
  • April 15, 2003
  • April 16, 2003
  • April 17, 2003
  • April 18, 2003
  • April 19, 2003
  • April 20, 2003
  • April 21, 2003
  • April 22, 2003
  • April 23, 2003
  • April 24, 2003
  • April 25, 2003
  • April 26, 2003
  • April 27, 2003
  • April 28, 2003
  • April 29, 2003
  • April 30, 2003
  • May 1, 2003
  • May 2, 2003
  • May 3, 2003
  • May 4, 2003
  • May 5, 2003
  • May 6, 2003
  • May 7, 2003
  • May 8, 2003
  • May 9, 2003
  • May 10, 2003
  • May 11, 2003
  • May 12, 2003
  • May 13, 2003
  • May 14, 2003
  • May 15, 2003
  • May 16, 2003
  • May 17, 2003
  • May 18, 2003
  • May 19, 2003
  • May 20, 2003
  • May 21, 2003
  • May 22, 2003
  • May 23, 2003
  • May 24, 2003
  • May 25, 2003
  • May 26, 2003
  • May 27, 2003
  • May 28, 2003
  • May 29, 2003
  • May 30, 2003
  • May 31, 2003
  • June 1, 2003
  • June 2, 2003
  • June 3, 2003
  • June 4, 2003
  • June 5, 2003
  • June 6, 2003
  • June 7, 2003
  • June 8, 2003
  • June 9, 2003
  • June 10, 2003
  • June 11, 2003
  • June 12, 2003
  • June 13, 2003
  • June 14, 2003
  • June 15, 2003
  • June 16, 2003
  • June 17, 2003
  • June 18, 2003
  • June 19, 2003
  • June 20, 2003
  • June 21, 2003
  • June 22, 2003
  • June 23, 2003
  • June 24, 2003
  • June 25, 2003
  • June 26, 2003
  • June 27, 2003
  • June 28, 2003
  • June 29, 2003
  • June 30, 2003
  • July 1, 2003
  • July 2, 2003
  • July 3, 2003
  • July 4, 2003
  • July 5, 2003
  • July 6, 2003
  • July 7, 2003
  • July 8, 2003
  • July 9, 2003
  • July 10, 2003
  • July 11, 2003
  • July 12, 2003
  • July 13, 2003
  • July 14, 2003
  • July 15, 2003
  • July 16, 2003
  • July 17, 2003
  • July 18, 2003
  • July 19, 2003
  • July 20, 2003
  • July 21, 2003
  • July 22, 2003
  • July 23, 2003
  • July 24, 2003
  • July 25, 2003
  • July 26, 2003
  • July 27, 2003
  • July 28, 2003
  • July 29, 2003
  • July 30, 2003
  • July 31, 2003
  • August 1, 2003
  • August 2, 2003
  • August 3, 2003
  • August 4, 2003
  • August 5, 2003
  • August 6, 2003
  • August 7, 2003
  • August 8, 2003
  • August 9, 2003
  • August 10, 2003
  • August 11, 2003
  • August 12, 2003
  • August 13, 2003
  • August 14, 2003
  • August 15, 2003
  • August 16, 2003
  • August 17, 2003
  • August 18, 2003
  • August 19, 2003
  • August 20, 2003
  • August 21, 2003
  • August 22, 2003
  • August 23, 2003
  • August 24, 2003
  • August 25, 2003
  • August 26, 2003
  • August 27, 2003
  • August 28, 2003
  • August 29, 2003
  • August 30, 2003
  • August 31, 2003
  • September 1, 2003
  • September 2, 2003
  • September 3, 2003
  • September 4, 2003
  • September 5, 2003
  • September 6, 2003
  • September 7, 2003
  • September 8, 2003
  • September 9, 2003
  • September 10, 2003
  • September 11, 2003
  • September 12, 2003
  • September 13, 2003
  • September 14, 2003
  • September 15, 2003
  • September 16, 2003
  • September 17, 2003
  • September 18, 2003
  • September 19, 2003
  • September 20, 2003
  • September 21, 2003
  • September 22, 2003
  • September 23, 2003
  • September 24, 2003
  • September 25, 2003
  • September 26, 2003
  • September 27, 2003
  • September 28, 2003
  • September 29, 2003
  • September 30, 2003
  • October 1, 2003
  • October 2, 2003
  • October 3, 2003
  • October 4, 2003
  • October 5, 2003
  • October 6, 2003
  • October 7, 2003
  • October 8, 2003
  • October 9, 2003
  • October 10, 2003
  • October 11, 2003
  • October 12, 2003
  • October 13, 2003
  • October 14, 2003
  • October 15, 2003
  • October 16, 2003
  • October 17, 2003
  • October 18, 2003
  • October 19, 2003
  • October 20, 2003
  • October 21, 2003
  • October 22, 2003
  • October 23, 2003
  • October 24, 2003
  • October 25, 2003
  • October 26, 2003
  • October 27, 2003
  • October 28, 2003
  • October 29, 2003
  • October 30, 2003
  • October 31, 2003
  • November 1, 2003
  • November 2, 2003
  • November 3, 2003
  • November 4, 2003
  • November 5, 2003
  • November 6, 2003
  • November 7, 2003
  • November 8, 2003
  • November 9, 2003
  • November 10, 2003
  • November 11, 2003
  • November 12, 2003
  • November 13, 2003
  • November 14, 2003
  • November 15, 2003
  • November 16, 2003
  • November 17, 2003
  • November 18, 2003
  • November 19, 2003
  • November 20, 2003
  • November 21, 2003
  • November 22, 2003
  • November 23, 2003
  • November 24, 2003
  • November 25, 2003
  • November 26, 2003
  • November 27, 2003
  • November 28, 2003
  • November 29, 2003
  • November 30, 2003
  • December 1, 2003
  • December 2, 2003
  • December 3, 2003
  • December 4, 2003
  • December 5, 2003
  • December 6, 2003
  • December 7, 2003
  • December 8, 2003
  • December 9, 2003
  • December 10, 2003
  • December 11, 2003
  • December 12, 2003
  • December 13, 2003
  • December 14, 2003
  • December 15, 2003
  • December 16, 2003
  • December 17, 2003
  • December 18, 2003
  • December 19, 2003
  • December 20, 2003
  • December 21, 2003
  • December 22, 2003
  • December 23, 2003
  • December 24, 2003
  • December 25, 2003
  • December 26, 2003
  • December 27, 2003
  • December 28, 2003
  • December 29, 2003
  • December 30, 2003
  • December 31, 2003
  • January 1, 2004
  • January 2, 2004
  • January 3, 2004
  • January 4, 2004
  • January 5, 2004
  • January 6, 2004
  • January 7, 2004
  • January 8, 2004
  • January 9, 2004
  • January 10, 2004
  • January 11, 2004
  • January 12, 2004
  • January 13, 2004
  • January 14, 2004
  • January 15, 2004
  • January 16, 2004
  • January 17, 2004
  • January 18, 2004
  • January 19, 2004
  • January 20, 2004
  • January 21, 2004
  • January 22, 2004
  • January 23, 2004
  • January 24, 2004
  • January 25, 2004
  • January 26, 2004
  • January 27, 2004
  • January 28, 2004
  • January 29, 2004
  • January 30, 2004
  • January 31, 2004
  • February 1, 2004
  • February 2, 2004
  • February 3, 2004
  • February 4, 2004
  • February 5, 2004
  • February 6, 2004
  • February 7, 2004
  • February 8, 2004
  • February 9, 2004
  • February 10, 2004
  • February 11, 2004
  • February 12, 2004
  • February 13, 2004
  • February 14, 2004
  • February 15, 2004
  • February 16, 2004
  • February 17, 2004
  • February 18, 2004
  • February 19, 2004
  • February 20, 2004
  • February 21, 2004
  • February 22, 2004
  • February 23, 2004
  • February 24, 2004
  • February 25, 2004
  • February 26, 2004
  • February 27, 2004
  • February 28, 2004
  • February 29, 2004
  • March 1, 2004
  • March 2, 2004
  • March 3, 2004
  • March 4, 2004
  • March 5, 2004
  • March 6, 2004
  • March 7, 2004
  • March 8, 2004
  • March 9, 2004
  • March 10, 2004
  • March 11, 2004
  • March 12, 2004
  • March 13, 2004
  • March 14, 2004
  • March 15, 2004
  • March 16, 2004
  • March 17, 2004
  • March 18, 2004
  • March 19, 2004
  • March 20, 2004
  • March 21, 2004
  • March 22, 2004
  • March 23, 2004
  • March 24, 2004
  • March 25, 2004

Section2

We need to compute some valid EcDateTime operations: adding, subtracting, and reseting "bad" final values to valid ones (e.g. if you add five days to Dec. 31st, you have to recognize that days need to be reset from 36 and that the month and year will change, etc.). It's an old test, but I want to make sure that everything still works correctly as I revamp some of this code to account for the real number of days in each month.

currentEcDateTime.Now(): (2012/05/21 01:28:58)

Test the SetEcDateTime Functions

  • The Battle of Hastings occurred on SetEcDateTime(1066, 10, 14, 9, 0, 0): (1066/10/14 09:00:00)
  • Bad Year; SetEcDateTime(0, 12, 11, 0, 0, 0): ()
  • Bad Month; SetEcDateTime(-957, 13, 11, 0, 0, 0): ()
  • Bad Day; SetEcDateTime(-957, 12, -2987, 0, 0, 0): ()
  • Bad Hour; SetEcDateTime(-957, 12, 11, -2, 0, 0): ()
  • Bad Minute; SetEcDateTime(-957, 12, 11, 0, 60, 0): ()
  • Bad Second; SetEcDateTime(-957, 12, 11, 0, 0, 3789): ()
  • The Invasion of Poland occurred on SetEcDateTime("1939/09/01 04:45:00"): (1939/09/01 04:45:00)
  • Poorly Formatted String; SetEcDateTime("-876/000010/29 6:58:4"): (-876/10/29 06:58:04)
  • Bad Minute; SetEcDateTime("876/11/29 6:-58:41"): ()
  • Invalid Parsing Input; SetEcDateTime("thisIsNotAnInteger/10/29 6:58:41"): ()
  • Non-Standard Input Format; SetEcDateTime("876/19 /29 6:5 8:41"): ()
  • Completely Incorrect Data; SetEcDateTime("The quick brown fox jumped over the lazy dog."): ()

Test the Add Functions

  • currentEcDateTime.AddTime(currentEcDateTime, -300, 50, 50, -2, -2,-2): ()
    Note: The AddTime() function won't work because the EcDateTime from "quick brown fox" above returns an error code.
  • currentEcDateTime.AddSeconds(1000000): ()
    Still nothing. We have to fix the EcDateTime and make it valid first.
  • Fixing w/ SetEcDateTime("296/10/29 06:58:41"): (296/10/29 06:58:41)
  • currentEcDateTime.AddTime(-300, 50, 50, -2, -2, -2): (1/02/18 04:56:39)
    Now this works.
  • currentEcDateTime.AddYears(-3): (-3/02/18 04:56:39)
    Going below 1AD.
  • currentEcDateTime.AddYears(5): (3/02/18 04:56:39)
    Rising above 1BC.
  • currentEcDateTime.Now(): (2012/05/21 01:28:58)
    Now let's have some fun...
  • currentEcDateTime.AddSeconds(1000000): (2012/06/01 15:15:38)
    1,000,000 seconds ~ 16,667 minutes ~ 278 hours ~ 11.6 days = 11 days 13h 46m 40s
  • currentEcDateTime.AddMinutes(-1000): (2012/05/31 22:35:38)
    -1,000 minutes = -16h -40m
  • currentEcDateTime.AddHours(1000): (2012/07/12 14:35:38)
    1,000 hours = 41 days 16h
  • currentEcDateTime.AddDays(63): (2012/09/13 14:35:38)
    63 days = ~2 months
  • currentEcDateTime.AddMonths(-128): (2002/01/13 14:35:38)
    -128 months = -10 years -8 months
  • currentEcDateTime.AddYears(-2002): (-1/01/13 14:35:38)
    Inverse of the years value should return 0, but there is no year 0 (always return -1)

Section3

Paragraph3.

Conclusion.