1.26   2016-03-21

- Switched from Module::Build to ExtUtils::MakeMaker. Implementation by Karen
  Etheridge. GitHub #13.

1.25   2016-03-06

- DateTime->from_object would die if given a DateTime::Infinite object. Now it
  returns another DateTime::Infinite object. Reported by Greg Oschwald. RT

1.24   2016-02-29

- The last release partially broke $dt->time. If you passed a value to use as
  unit separator, this was ignored. Reported by Sergiy Zuban. RT #112585.

1.23   2016-02-28

- Make all DateTime::Infinite objects return the system's representation of
  positive or negative infinity for any method which returns a number of
  string representation (year(), month(), ymd(), iso8601(), etc.). Previously
  some of these methods could return "Nan", "-Inf--Inf--Inf", and other
  confusing outputs. Reported by Greg Oschwald. RT #110341.

1.22   2016-02-21 (TRIAL RELEASE)

- Fixed several issues with the handling of non-integer values passed to

  This method was simply broken for negative values, which would end up being
  incremented by a full second, so for example -0.5 became 0.5.

  The method did not accept all valid float values. Specifically, it did not
  accept values in scientific notation.

  Finally, this method now rounds all non-integer values to the nearest
  millisecond. This matches the precision we can expect from Perl itself (53
  bits) in most cases.

  Patch by Christian Hansen. GitHub #11.

1.21   2015-09-30

- Make all tests pass with both the current DateTime::Locale and the upcoming
  new version (currently still in trial releases).

1.20   2015-07-01

- The 1.18 release added the June 30, 2015 leap second to the XS code, but I
  forgot to update the corresponding pure Perl implementation in

1.19   2015-05-31

- If you compared a DateTime object to an undef value, you might have received
  a warning pointing to code inside DateTime.pm, instead of in your own
  code. Fixed by Jason McIntosh. GH #7.

- The 30future-tz.t could fail if run at certain very specific times. This
  should now be much less likely, unless a time zone being tested implements a
  DST change at noon (which would even more insane than DST already is by a
  huge factor). Reported by Karen Etheridge and diagnosed by Slaven Rezic. RT

1.18   2015-01-05

- There will be a new leap second on June 30, 2015.

1.17   2015-01-04

- No code changes from the 1.16 release.

1.16   2015-01-04 (TRIAL RELEASE)

- Test fix for systems where IVs are 4 bytes long.

1.15   2015-01-03 (TRIAL RELEASE)

- Trying this again ... Experimental fix for adding very large numbers of
  days. Previously, trying to add more than around 2^28 days could cause
  errors if the result ended up in a leap year. This is being released as a
  trial release because I'm not sure how this change will behave on a 32-bit
  Perl. Reported by KMX. RT #97046.

1.14   2015-01-03

- Accidentally released 1.13 as a non-TRIAL release. Releasing 1.13 minus the
  integer change so there's a known-safe stable release on CPAN for people to

1.13   2015-01-03

* This release was deleted from CPAN.

- Experimental fix for adding very large numbers of days. Previously, trying
  to add more than around 2^28 days could cause errors if the result ended up
  in a leap year. This is being released as a trial release because I'm not
  sure how this change will behave on a 32-bit Perl. Reported by KMX. RT

- Various small doc chances to address RT #96958, #98733, and #101262.

1.12   2014-08-31

- The last release had the wrong repo info in the metadata.

1.11   2014-08-31

- The latest historical changes in DateTime::TimeZone 1.74 caused some tests
  to fail. Reported by Slaven Rezic. RT #98483.

- This release of DateTime.pm now requires the DateTime::TimeZone 1.74.

1.10   2014-05-05

- Some tests added in 1.09 would fail on a Perl without a 64-bit
  gmtime(). Reported by Jerome Eteve. RT #95345.

1.09   2014-05-03

- A call to ->truncate( to => 'week' ) could fail but leave the object
  changed. RT #93347.

- The value of ->jd() is now calculated based on ->mjd() instead of the other
  way around. This reduces floating point errors a bit when calculating MJD,
  and should have a neglible impact on the accuracy of JD. Reported by Anye
  Li. RT #92972. See the ticket for a more detailed description of what this

- Attempting to construct a DateTime object with a year >= 5000 and a time
  zone other than floating or DST now issues a warning. This warning may go
  away once DateTime::TimeZone is made much faster. Inspired by a bug report
  from Lloyd Fournier. RT #92655.

1.08   2014-03-11

- DateTime now calls DateTime->_core_time() instead of calling Perl's time()
  built-in directly. This makes it much easier to override the value of time()
  that DateTime sees. This may make it easier to write tests for code that
  uses DateTime .

1.07   2014-02-06

- Added a hack to get this module working on Android. RT #92671.

1.06   2013-12-31

- DateTime's attempt to generate infinity by calculating 9**9**9 actually got
  a number on some platforms, like powerpcspe. Reported by Gregor Hermann. RT

1.05   2013-12-22

- Added a new CLDR ZZZZZ specifier, which is like ZZZ but inserts a
  colon. Patch by Ricardo Signes.

- Added a new option for the truncate() method to truncate to the
  "local_week". This truncates to the locale's notion of the first day of the
  week, rather than always truncating to Monday. Patch by Christian Hansen.

1.04   2013-12-07

- Calling set_locale() or set_formatter() on an object with an ambiguous local
  time could change the underlying UTC time for that object. Reported by Marta
  Cuaresma Saturio. RT #90583.

1.03   2013-04-17

- The set_time_zone() method was not returning the object when called with a
  name that matched the current zone. Reported by Noel Maddy. RT #84699.

1.02   2013-04-15

- When a constructor method like new() or today() was called on an object,
  you'd get an error message like 'Can't locate object method
  "_normalize_nanoseconds" via package "2013-04-15T00:00:00"'. This has been
  fixed to provide a sane error message. Patch by Doug Bell.

- When set_time_zone() is called with a name that matches the current time
  zone, DateTime now short circuits and avoids a lot of work. Patch by Mark

1.01   2013-04-01

- Fixed test failures on older Perls.

1.00   2013-03-31

- Bumped the version to 1.00. This is mostly because my prior use of both X.YY
  and X.YYYY versions causes trouble for some packaging systems. Plus after 10
  years it's probably ready to be called 1.00. Requested by Adam. RT #82800. 

- The %j specifier for strftime was not zero-padding 1 and 2 digit
  numbers. Fixed by Christian Hansen. RT #84310.

- The truncate method was sloppy about validating its "to" parameter, so you
  could pass things like "years" or "month whatever anything goes". The method
  would accept the parameter but then not actually truncate the object. RT

- Previously, if a call to $dt->set_time_zone() failed it would still change
  the time zone of the object, leaving it in a broken state. Reported by Bill
  Moseley. RT #83940.

- DateTime::Infinite objects should no longer die when methods that require a
  locale are called. Instead, these methods return undef for names and
  Inf/-Inf for numbers. This affects methods such as day_name() as well as
  CLDR and strftime formats. When a locale-specific format is used (like the
  "full" datetime format) it uses the en_US format. Reported by Paul
  Boldra. RT #67550.

0.78   2012-11-16

- Reverted the change to round nanoseconds up or down in various
  situtations. Now we always round down. This avoids the case where rounding
  up would require us to then increment the second value (which could then
  require us to increment the minute, which could then require us to increment
  the hour, which could then ...).

  In other words, we don't want to round 2011-12-31T23:59:59.999999 up to
  2012-01-01T00:00:00, because that would be insane.

  This applies to the return values for ->microsecond, ->millisecond, and the
  %N specifier for strftime.

  Patch by Martin Hasch. RT #79845.

0.77   2012-09-25

- POD changes that should make the documentation look better, especially on
  the web.

0.76   2012-07-01

- The DateTime->subtract method ignored the end_of_month parameter. Patch by
  Chris Reinhardt. RT #77844.

0.75   2012-06-11

- The epoch for years 1-999 was broken because Time::Local is "clever". A pox
  on all clever APIs, I say! Reported by Christian Hansen. RT #77719.

- Shut up compilation warning from 5.17.x. Reported by Tom Wyant. RT #77490.

0.74   2012-03-22

- Small packaging fix for metacpan's benefit. No need to upgrade.

0.73   2012-03-17

- Change tests to work with Zefram's entirely rebuilt DateTime::TimeZone
  distribution, which will replace the current implementation. Patch by
  Zefram. RT #75757.

0.72   2012-01-05

- Remove Test::DependentModules from the dep list. This is used by some
  author-only tests. Reported by Zefram.

0.71   2012-01-05

- There will be a new leap second on June 30, 2012.

0.70   2011-05-09

- Really fix %N, finally. This was breaking the DateTime::Event::Recurrence
  test suite. Patch by Dagfinn Ilmari Mannsåker.

0.69   2011-05-03

- When a DateTime object had nanoseconds == 0, the %N strftime specifier
  always returned "0" regardless of the precision requested. Reported by John
  Siracusa. RT #67928.

0.68   2011-04-25

- The tests for %N in the last release relied on the vagaries of floating
  point math on a 64-bit system. Now the from_epoch() method just uses string
  operations to separate the epoch into an integer value and a mantissa. This
  avoids floating point insanity. Reported by zefram. RT #67736.

0.67   2011-04-24

- The %N strftime specifier simply truncated nanoseconds, rather than rounding
  them. Reported by Michael R. Davis. RT #66744.

- The %U strftime specifier was off by one in years where January 1st was a
  Sunday. Patch by Christian Hansen. RT #67631.

- The %W strftime specifier was off by one in years where January 1st was a
  Sunday or Monday. Patch by Christian Hansen. RT #67631.

- Some small optimizations from Christian Hansen. The biggest impact is for
  calculating week_of_month, week_number, and week_year.

- This distro now requires Perl 5.8.1+ (it implicitly did this anyway now that
  Params::Validate is 5.8.1+).

0.66   2010-11-26

- A bunch of documentation cleanup. No code changes.

0.65   2010-10-25

- Actually put the right $VERSION in every package. No other changes.

0.64   2010-10-25

* All the constructors besides new() ended up calling new(), which meant that
  these constructors went through the parameter validation code
  twice. Avoiding this should make everything that constructs a new object
  (besides new() itself) a little faster.

  ** This change breaks DateTime::Fiscal::Retail454, but no other modules, to
     the best of my knowledge. **

- The t/39no-so.t test failed for some people. I can't reproduce it, but this
  release will hopefully fix the problem. Patch by Tokuhiro Matsuno. RT

- Added a section on the DateTime Project ecosystem to the docs. Addresses RT

- Fixed wiki links in the docs now that the wiki has moved to a new wiki

- Restored some of the dzil-ification. The repo now has a very minimal
  Build.PL file which is just enough to build the XS code and run the
  tests. This fixes the total lack of prereqs in the META.* files. Reported by
  Bjørn-Olav. RT #62427.

0.63   2010-09-24

- Actually bump the version in the module files. Oops. Reported by bricas.

0.62   2010-09-23

- Don't try to test with DateTime::Format::Strptime unless we have a
  relatively recent version. Should fix some test failures.

0.61   2010-07-16

- Switching to dzil in 0.56 broke the --pp flag for the Build.PL. Reported by
  Jonathan Noack. RT #59421.

0.60   2010-07-03

- By default, Dist::Zilla generates a Build.PL that requires Module::Build
  0.3601+, but this distro really doesn't need any particular version.

0.59   2010-06-29

- More packaging fixes. This release makes sure that POD only shows up in the
  right files. In 0.56 through 0.58, some POD in the wrong place confused the
  search.cpan.org POD display code, and the main module's documentation wasn't

0.58   2010-06-28

- Versions 0.56 and 0.57 did not build XS properly when installing.

0.57   2010-06-26

- Make DateTime::LeapSecond have the same $VERSION as every other .pm file.

0.56   2010-06-26

- The set_formatter() method did not return the DateTime object, and did not
  actually validate the value provided for the formatter. Based on a patch by
  Andrew Whatson. RT #58506.

- Improved docs on floating time zone. Based on suggestions by Michael
  Svoboda. RT #56389.

- Added mention of end-of-month algorithms to docs on DateTime math. Based on
  a patch by Michael R. Davis. RT #58533.

- License is now Artistic 2.0.

0.55   2010-03-16

- Get all tests passing on 5.6.2. Thanks to Zefram for help spotting the

- Moved code to my hg repo at http://hg.urth.org/hg/DateTime.pm.

0.54   2010-03-14

- Bumped the DateTime::TimeZone prereq to 1.09 to force people to use a modern
  version. Previously the minimum version was 0.59, and there have been a lot
  of bug fixes since then.

- String overloading now extends to string comparison, so a DateTime object
  can be compared to any string. In other words

  if ( $dt eq $string ) { ... }

  will simply stringify $dt and then do a normal string-is-equals
  check. Previously, this would blow up unless both operands were a DateTime

  Note that future versions of Test::More (0.95_01+) will no longer stringify
  arguments to is(), which means that older versions of DateTime may cause new
  test failures when you upgrade Test::More. It is highly recommended that you
  upgrade DateTime before upgrading to Test::More 0.95_01+.

  Patch by Michael Schwern. RT #55453.

- Allow passing end_of_month setting to $duration->inverse(). Requested by
  John Siracusa. RT #53985.

0.53   2009-12-06

- Added Test::Exception to build_requires.

0.52   2009-12-05

- Numeric to ->new() are now all validated to make sure they are
  integers. Previously, things like "month => 11.2" would have been
  allowed. Based on a bug report from Max Kanat-Alexandar. RT #45767.

- Added a warning to the docs suggesting that you cache the locale time zone
  if you need to make many DateTime objects in the local zone. Looking up the
  local zone can be fairly expensive. RT #46753.

0.51   2009-11-01

- Switched to Module::Build. To force a non-XS build, start the build
  process with "perl Build.PL --pp".

- POD-related tests are only run for the maintainer now.

- Fixed handling of negative years in CLDR formatting for "y" and "u"
  patterns. Note that the LDML spec says nothing about how this should work,
  so I took my best guess.

0.50   2009-05-11

- Tests were failing on Win32 because they attempted to use a negative
  epoch. Fixed so that these tests are skipped. Fixes RT #45966.

0.49   2009-05-04

- A bug in the test code for handling overloaded objects in from_epoch
  resulted in a test failure on Perl 5.8.x. This release contains no
  changes besides a test code fix.

0.48   2009-05-04

- Some of the accessors (the "main" ones like year(), month(), day(),
  etc) now warn if they are passed a value. Patch from Shawn
  Moore. Fixes RT #6979.

- DateTime::Duration expected DateTime to be loaded and used some
  constants from it, but did not explicitly "use DateTime". Reported
  by Jeff Kubina. RT #44740.

- The CLDR formatting for "c" and "cc" was incorrectly using the local
  day of the week. This meant that it gave the wrong result for
  locales where Monday is not considered the first day of the
  week. Reported by Maros Kollar. RT #45007.

- DateTime->from_epoch did not allow an object which overloaded
  numification as the epoch value. Patch by Michael Schwern. RT

- Fixed how datetime subtraction is handled for some cases around DST
  changes. This had been improved back in 0.30, but there were still
  bugs. RT #45235.

0.47   2009-03-01

- The handling of CLDR format 'j' and 'jj' was backwards, using 24
  hour time for locales that wanted 12 hour, and vice versa. Reported
  by Maros Kollar.

- The CLDR formatting was missing support for lower-case "q"
  patterns. Reported by Maros Kollar.

0.46   2009-02-28

- Added a duration_class method for the benefit of DateTime.pm
  subclasses. Patch by Shawn Moore.

0.4501 2008-11-25

- The epoch() method got broken in the recent shuffling between
  Time::Local and Time::y2038. Unfortunately, the tests to catch this
  also got lost in the shuffle. Reported by Avianna Chao.

0.45   2008-11-11

- Reverted the changes to use Time::y2038, on the recommendation of
  Michael Schwern (the author of said module), because it is not yet
  stable. This may come back in a future release.

0.4401 2008-11-03

- In order to handle epochs > 2**32 properly on a 32-bit machine, we
  also need to import gmtime from Time::y2038. This changes fixes a
  whole bunch of test failures seen with 0.44.

0.44   2008-11-01

- XS-capable DateTime.pm now uses Time::y2038 instead of
  Time::Local. This lets it handle epochs up to 142 million years
  before and after the Unix epoch.

- Fixed a compiler warning with Perl 5.10.0.

- Fixed docs for year_with_era, which had AD and BC
  backwards. Reported by Vynce Montgomery. RT #39923.

- The format_cldr() method did not format the "yy" format properly
  when the year ended in "0X". Reported by Wilson Santos. RT #40555.

0.4305 2008-10-03

- The pure Perl version of this module did not know about the end of
  2008 leap second. Reported by James T Monty.

0.4304 2008-07-13

- Fix test failures when tests are run with DateTime::Locale
  0.41. Reported by David Cantrell via CPAN Testers.

0.4303 2008-07-12

- There is a new leap second coming at the end of 2008.

0.4302 2008-05-20


- The 41cldr_format.t test blew up on Perl 5.6.x, because of a bug in
  the test code.

0.4301 2008-05-18


- In the 0.43 release, I forgot to change the DateTime::Locale
  dependency to require DT::Locale 0.40.

0.43   2008-05-18


* Dropped support for Perl 5.005.


- Added support for formatting the CLDR date pattern language, which
  is much more powerful than strftime. This, combined with the latest
  DateTime::Locale, makes the localized output much more correct.


- The hour_1() method was returning the real hour + 1, rather than
  just representing midnight as 24 instead of 0. This bug fix will
  probably break someone's code.

0.42   2008-02-29


- The 17set_return.t tests failed on leap days, like today. Reported
  by Duncan Ferguson. RT #33695.

0.41   2007-09-10


- The 13strftime.t test was failing when DateTime::Locale 0.35 was
  installed. The test has been adjusted and we now list DT::Locale
  0.35 as the minimum version. Reported by David Cantrell.

0.40   2007-08-30


- A custom formatter would be lost after a call to set() or
  truncate(). Reported by Kjell-Magne Øierud. RT #28728.

- The truncate() method docs said it accepted "second" as a parameter,
  but it didn't actually do the right thing with it. Now it always
  truncates nanoseconds to 0 for any parameter it is passed.

0.39   2007-07-17


- Yet more changes to how infinity is handled and tested. This passes
  for me on 32-bit Win XP and 64-bit Linux, which is promising. Patch
  by Yitzchak Scott-Thoennes. RT #22392.

0.38   2007-06-30


- Require Test::Pod::Coverage 1.08 in pod-coverage.t, since we use
  all_modules, which was only exported as of version 1.08. Reported by
  MATSUNO Tokuhiro. Fixes RT #26594.

- Fixed a bad link to the old FAQ location in the docs. Reported by
  Ric Signes. Fixes RT #26846.


- DateTime.pm now explicitly overloads string comparison. This was
  done so that comparing a DateTime.pm object to a string returns
  false, rather than throwing an exception. Reported by Chris
  Dolan. Addresses RT #26085.

0.37   2007-03-30


- Require DateTime::Locale 0.34, which fixes a problem that manifested
  when thawing a DateTime.pm object. See
  http://www.mail-archive.com/datetime@perl.org/msg05633.html for some
  discussion of this.

- Added pod coverage tests, and added some POD for undocumented
  methods as a result.


- This distro is now GPG-signed, per RT #24776.

0.36   2007-01-18


- For infinity, use 100 ** 1000 instead of 100 ** 100 ** 100. This may
  fix the problems with infinity on some platforms (or may
  not). Suggested by Bjorn Tackmann. See RT #17390, #19626, and

- Require DateTime::TimeZone 0.59, which includes a similar fix.

0.35   2006-10-22


- Added several new methods for getting locale-based data, era_abbr(),
  era_name(), quarter_abbr(), and quarter_name(). The era() method
  returns the same data as era_abbr(), but is deprecated.

0.34   2006-08-11


- DateTime's code to fall back to the pure Perl implementation was
  broken in most cases, making it fairly useless. Reported by Adam
  Kennedy and Brendan Gibson.

- Under Perl 5.6.2 (and presumably 5.6.x), some of the tests
  mysteriously failed. I tracked this down to a weird interaction
  between DateTime's string overloading and
  Test::Builder->cmp_ok(). See RT 19626.

0.33   2006-08-09  (the "Asia/Kaohsiung" release)


- Attempting to do an overloaded operation (add, subtract, compare)
  with an inappropriate argument (like $dt + 1) gives a more useful
  error message.


- The fixes in 0.30 for subtract_datetime() crossing a DST change had
  a bug. When subtracting two dates, both occurring on a DST change
  date, but where the dates did not cross the change, the answer was
  off by an hour. Reported by Chris Prather. See RT 20697.

- Borrowed a tweak from version.pm's Makefile.PL to make compiler
  detection work with MSVC.

0.32    2006-07-24


- Change how C compiler detection is done in the Makefile.PL so it
  does not rely on having make on the system. The new way should work
  on (most?) Unix and Win32 systems. Suggested by David Golden. See RT

0.31    2006-05-21


- Switched some uses of die() to Carp::croak(), where
  appropriate. This should make error messages more useful in many
  cases. Based on a suggestion by Max Maischein. See RT tickets 11692
  & 18728.


- Removed all uses of UNIVERSAL::isa and UNIVERSAL::can as functions.

- Tweaked 20infinite.t test to give more useful output for some
  failures, though it probably doesn't fix them. See RT 17390.

0.30    2005-12-22


- Expanded and rewrote the docs on date math to try to explain exactly
  how DateTime.pm works, and in particular cover the problems DST
  introduces to various types of date math.  The docs now also include
  some specific recommendations on getting sane results from datetime

- Added calendar_duration() and clock_duration() methods to

- Explicitly override the stringification method for
  DateTime::Infinite objects.  They now stringify as whatever the IEEE
  infinity and negative infinity numbers stringify to on your
  platform.  On Linux this is "inf" and "-inf". CPAN RT #16632.


- delta_md() and delta_days() did not always return correct values
  when crossing a DST change.

- The pure Perl version of the code had a dependency ordering problem
  where DateTime::LeapSecond depended on other pure Perl code that
  wasn't yet available.  I'm not sure how this ever worked.

- Remove mentions of leap second on 1971-12-31 from the docs, because
  there was no leap second that day.  Reported by Mike Schilli.

- If you added a second to a datetime that was on a leap second (like
  2005-12-31T23:59:60) it got "stuck" and kept returning the same
  datetime.  Reported by Mike Schilli.

- Changes to the tests in 20infinite.t may fix failures seen on some
  platforms and with new versions of Test::More (0.62 was known to
  cause failures)


- The subtract_datetime() method switched back to using the local
  portion of the date _and_ time, but it now accounts for days with
  DST changes specially.  This produces results that fix the bugs that
  were fixed by previous subtraction changes in 0.28 and 0.29, but
  without introducing even more bugs.  The overall result should be
  sane, but please see the docs for details.

0.2901  2005-07-04

- A leap second for the end of 2005 was announced.

0.29    2005-06-03


- When adding/subtracting a duration with months or days that crossed
  a DST change, the result was based on the local time, not the UTC
  time.  For consistent results, it is necessary to use the UTC time
  (but local date) for all date math.  Reported by J. Alexander

0.28    2005-02-27


- The era names for the era() method are now retrieved from the
  DateTime.pm object's associated locale.  The old era() method, which
  was hard-coded to use BCE and CE, is renamed secular_era().  The
  christian_era() method remains the same.


- Fixed an embarassing bug in the subtract_datetime() method.  It was
  subtracting local times, not UTC, which caused bugs when doing
  subtraction across a DST change.  This method is used to implement
  subtraction overloading, so that was affected as well.  Reported by
  Mike Schilli.

- The docs for the %U and %W strftime specifiers implied that these
  should be zero-padded, but the code was not doing so.  Reported by J

0.27    2005-01-31


- Added local_rd_values() method for the benefit of other modules like

0.26    2005-01-27


- The docs claimed that the delta_ms(), delta_md(), delta_days()
  methods always returned a positive duration, but this was not true
  for delta_md() or delta_days().

0.25    2005-01-10 (the "new year, new bugs" release)


- Calling set_time_zone() for a datetime very close to a time zone
  change died for many of the Olson time zones.

- The docs for the from_object constructor said that by default, new
  objects were in the UTC time zone, but in reality the default was
  the floating time zone.  The docs were changed to match the code.
  Ticket 9278 on rt.cpan.org.

0.24    2004-12-10 (the "have I mentioned I hate leap seconds" release)


- Fixed even more bugs related to leap seconds and time zones.
  Reported by Eugene van der Pijll.


- Offsets with a seconds portion (like "+00:00:30") act strangely near
  leap seconds.  Reported by Eugene van der Pijll.  This will be fixed
  in a future release.

0.23    2004-12-09 (the "oh how I hate leap seconds" release)


- Added a number of convenience "set" methods: set_year, set_month,
  set_day, set_hour, set_minute, set_second, set_nanosecond, and
  set_locale.  Suggested by Michael Schwern.

- Added christian_era and year_with_christian_era methods.

- Clarified that from_epoch(), today(), and now() all return objects
  in the UTC time zone.  Suggested by Sagar Shah and others.

- Added formatter parameter to constructor, which allows per-object
  stringification.  Based on a patch from Daisuke Maki.


- Trying to serialize DateTime::Infinite objects with Storable blew
  up.  Patch by Daisuke Maki.

- Require Test::More 0.34+, since I use a function introduced in that
  version in the tests.  Suggested by Jean Forget.

- Fix a bug in strftime() which could cause weirdness with
  pathological specifiers like "%%{day_name}%n".  Reported by Jean

- Fixed a number of bugs related to leap seconds and time zones.
  Reported by Eugene van der Pijll.

0.22    2004-07-23


- The leap second table we were using mistakenly included a leap
  second on December 31, 1971.  This will break all versions of the
  DateTime::Format::Epoch::TAI64 module up to and including version
  0.06.  Most users of DateTime.pm will not be affected.  Patch by
  Joshua Hoblitt.

0.2101  2004-06-10


- There was a bug in the date math code that occurred if you tried to
  add enough days, minutes or seconds to generate a datetime 10 years
  in the future (or so).  If the the DateTime object had a a time zone
  with recurring DST changes, then the date math operation would cause
  a fatal error "Invalid local time for date in time zone ...".
  Reported by Dave Faraldo.

0.21  2004-03-28 (The "Another YAPC::Taipei release party release" release)


- When given mixed positive & negative arguments, DateTime::Duration
  no longer forces all arguments to be negative.

- For mixed durations, the is_positive, is_zero, and is_negative
  methods all return false.

- Brought back stringification overloading.  As of version 1.06,
  Devel::StackTrace will ignore this overloading when displaying a


- Add a new in_units() method to DateTime::Duration.  Patch by Andrew

- Rely on DateTime::TimeZone and DateTime::Locale having their own
  Storable hooks, as opposed to handling them in DateTime.pm's own
  Storable hooks.  This should fix RT ticket #5542, reported by Dan
  Rowles (I hope).

- More docs on how date math is done.  See the new section "The
  Results of Date Math".


- DateTime::Duration's is_positive, is_zero, and is_negative methods
  could incorrectly return true if a duration contained mixed positive
  and negative units.

- Better normalization of nanoseconds in DateTime::Duration.  Patch by
  Andrew Pimlott.

0.20  2004-02-12


- Tweaked the "How Date Math is Done" section in DateTime.pm to
  provide some more explicit examples.


- If seconds are not negative, DateTime::Duration will try to keep
  nanoseconds >= 0 when normalizing them to seconds, as long as this
  doesn't make seconds become negative.  Suggested by Andrew Pimlott.

- In the datetime subtraction code, there was an off-by-one error in
  the code to determine if one of the datetimes occurred in a minute
  containing a leap second.  This led to the result of the subtraction
  being off by one second.  Patch by Andrew Pimlott.

- A duration's nanoseconds weren't normalized after multiplication.
  Patch by Andrew Pimlott.

0.1901  2004-01-07  (the "people care about ancient history?" release)


- The day of week was totally busted for dates before 0000-12-25.
  Reported by Flavio Glock.

0.19  2003-12-01  (the "never look before a leap second" release)


- DateTime::Duration now provides a compare() class method.

- DateTime::Duration now overloads comparison to throw an exception,
  because comparison requires a base DateTime object.  Note that
  previous versions of DateTime::Duration _did not_ overload
  comparison, so if you were comparing them, you were just comparing
  the value of the object references.  Thanks to Rick Measham, Jon
  Swartz, and Max Maischein for contributing to the discussion on
  datetime@perl.org about how to implement this feature.

- Added DateTime::Duration->multiply to complement multiplication

- Added a leap_seconds method.

- Added a section to the docs about floating datetimes.

- DateTime::LeapSecond no longer contains code copied from
  DateTime.pm, instead it just uses DateTime.pm directly.  Patch by
  Joshua Hoblitt.


- DateTime::LeapSecond's leap_seconds() function now returns the
  number of leap seconds that have occurred, as opposed to the
  difference between TAI and UTC for a given Rata Die day, which is
  what it was returning previously.  This means that the values it
  returns are 9 second less than the previous version.  This does not
  affect DateTime.pm because it never looke at the actual value, just
  the difference between two leap second values, which remains the

0.18  2003-10-26  (the "delta, delta, delta, can I help ya, help ya, help ya?" release)


- Added several new methods for calculating the difference between two
  datetime objects.  These are delta_md(), delta_days(), and
  delta_ms().  Each of these methods returns the difference as a
  duration containing just certain units.


- Require Pod::Man 1.14+, so that head3/head4 markup doesn't cause
  installation to die.


- The local_rd_as_seconds method is deprecated, as it doesn't really
  serve much purpose.

0.1705  2003-10-07


- Subtracting one datetime from another was still broken, and my fix
  in 0.1704 broke many other subtractions.  Reported by Pierre Denis
  again.  Many thanks to Pierre for paying attention.

- Subtracting datetimes where the subtraction crossed a leap second
  was also broken.

0.1704  2003-10-07


- Documented the behavior of strftime() when given an invalid format.


- The DateTime::Duration synopsis showed a sign() method that doesn't
  exist, so I removed it from the synopsis.  Reported by Flavio Glock.

- Subtracting one datetime from another was seriously broken.  The
  values for days & weeks were wrong in many cases.  Reported by
  Pierre Denis.

0.1703  2003-09-22


- truncate( to => 'week' ) caused a fatal error when the beginning of
  the week was in the previous month.  Reported by R. Mathews
  (rt.cpan.org #3843).

0.1702  2003-09-18


- Added truncate( to => 'week' ).  Suggested by Flavio Glock.

0.1701  2003-09-15


- If from_epoch was given a fractional epoch with a floating point
  value with more than 9 digits after the decimal point, the object
  ended up containing a floating point number of nanoseconds.  We now
  truncate this number to an integer.  Fixed by Joshua Hoblitt.

- The %V strftime specifier was documented, but not implemented.
  Reported by Joshua Hoblitt.

- Test #56 in 03components.t would die with "Invalid offset: -124"
  when run with DateTime::TimeZone 0.2502+.  Next time, I'll read my
  own docs ;)

0.17  2003-08-29  (the "math is hard" release)


- The default end_of_month mode for negative durations is now
  "preserve".  This makes more sense, as the previous default meant
  that the following code:

    print DateTime->new( year => 2003, month => 5, day => 31 )
                  ->subtract( months => 1 )->ymd;

  printed "2003-05-01" as opposed to "2003-04-30".  Thanks to Thomas
  Klausner for starting a discussion on this problem.

- The subtract_datetime method now returns different results, as does
  subtraction overloading when both sides of the subtraction are
  DateTime objects.

  The subtract_datetime_absolute method returns results similar to
  what was previously returned from subtract_datetime.

  Thanks to Matthew McGillis for bringing this up, and Joshua Hoblitt
  and Eugene van der Pijll for contributing to the ensuing discussion.


- DateTime.pm compare() method is now documented to work with any
  other calendar class that provides a utc_rd_values() method.

- Added the subtract_datetime_absolute method.  See the docs for

- Documented the inverse() method in DateTime::Duration.

0.1601  2003-08-07


- On platforms like Win32, where we can't find a finite() or
  isfinite() function/macro, the DateTime::LeapSecond code wasn't
  being loaded, so many tests failed.  Reported by Ron Hill.

0.16    2003-08-06


- The XS code now implements leap second-related calculations.
  However, this is only used on platforms where we can find a usable
  finite() or isfinite() function/macro, so it isn't used on Win32.

- This distro has now borged the DateTime::LeapSecond module.  It is
  only loaded when the XS leap second code cannot be used.

- Other miscellaneous performance improvements.

0.1503  2003-07-31


- Adding a duration with delta months to an infinite DateTime was
  quite broken.  Reported by Eugene van der Pijll.

0.1502  2003-07-31


- XSLoader wasn't the problem on Solaris, so it's back.

- Now loading the XS version of DateTime.pm is wrapped in an eval
  block.  If it fails with an error about the object version not
  matching, the pure Perl version is loaded instead.  This should fix
  Solaris.  Thanks to Joshua Hoblitt for identifying this bug.

0.1501  2003-07-30


- Fixed the from_object() method to set the returned object's time
  zone to the floating time zone if the source object did not have a
  time zone, as specified in the docs.  Previously, the returned
  object's time zone was UTC.  Patch by Eugene van der Pjill.

- For this release, at least, the module always uses Dynaloader.  This
  is in order to see if this fixes a problem on Solaris where the
  install library version of the DateTime .so file is loaded instead
  of the newly compiled version in the blib directory.

0.15    2003-07-29


- The utc_rd_values() method now returns nanoseconds in addition to
  Rata Die days and seconds.  Based on a patch by Joshua Hoblitt.

- The from_object() method expects objects to return the same values
  from their utc_rd_values() methods.  Based on a patch by Joshua


- Fixed a bug in the pure Perl version of _normalize_tai_seconds that
  caused very weird results from datetime math.  This version may be
  used on platforms where the XS code compiles, so it can affect quite
  a number of systems.  Reported by Dan Sully.

0.1402   2003-07-24


- Fix DefaultLocale method, which didn't work at all.  Reported by
  Serge Leger.

0.1401   2003-07-24


- Fix a test failure in 13strftime.t under Perl 5.6.1 (and probably

0.14     2003-07-23


- The DateTime::Language modules are no longer being developed or
  distributed as part of the DateTime.pm distribution.

  Because of this, all "language" parameters should now be replaced by
  "locale" parameter.  The "language" parameter is deprecated and will
  be removed in a future release.

  Also note that locales should be specified via ISO codes, not names
  like "English".  The old DateTime::Language names will continue to
  work indefinitely, but they load DateTime::Locale objects instead.

  Locale-specific data will be returned in utf8 when necessary.

- Similarly, the "language" and "DefaultLanguage" methods are now
  deprecated in favor of "locale" and "DefaultLocale".


- DateTime::Duration now returns the object from mutator methods, in
  order to make method chaining possible.  Suggested by Ben Bennett.

- If the value for second given to new() is 60 or 61, then it must be
  a valid leap second.

- DateTime now uses DateTime::Locale for localization, which allows
  for real language and territory based localization.  The locale code
  is generated from the ICU project's data, and is much more complete
  than the DateTime::Language modules.  However, we are losing
  (hopefully only temporarily) support for the various African
  languages contributed by Daniel Yacob.  Support for those languages
  should return in a future release of DateTime::Locale.

- Support for the '%c', '%x', and '%X' strftime format specifiers,
  which output localized date and time strings.

- Added the time_zone_long_name method, primarily for the benefit of

- Added a note to the DateTime::Infinite docs warning that it may not
  work well on Win32.


- DateTime::Duration was not consistent in how it handled mixed
  positive and negative constructor parameters.  Reported by Ben

0.13     2003-05-05


- DateTime now does more validation of parameters given to
  constructors and to the set() method, so bogus values like a month
  of 13 are a fatal error.

- Added a new constructor, from_day_of_year().

- Added a number of new "get" methods, including era, year_with_era,
  hour_1, hour_12, hour_12_0, weekday_of_month, and week_of_month.
  Based in part on a patch from Rick Measham.

- Now any object method can be called in strftime format by using
  "%{method}" as a format specifier.  Patch from Rick Measham

- Added an is_zero method to DateTime::Duration, for objects of zero

- DateTime->from_epoch will now accept a floating point epoch and turn
  the post-decimal portion into nanoseconds.  This was done in order
  to interface more accurately with Time::HiRes.

- Added a DateTime->hires_epoch method that returns a floating point
  value for epoch, also for compatibility with Time::HiRes.

- DateTime.pm now implements Storable hooks to reduce the size of
  serialized DateTime objects.  In particular, the contained time zone
  object is not serialized along with the DateTime object.

- It is now possible to create arbitrary DateTime::Language subclasses
  in any namespace.


- "Fixed" 20infinite.t failures on Windows with 2 icky hacks.  The
  first simply doesn't compile the XS code that deals with infinite
  numbers on Win32, so the pure Perl version is used instead.
  However, the rest of the XS code is still compiled on Win32.  The
  other hack is to simply skip a failing test in 20infinite.t on
  Win32.  Hopefully, this will eventually be fixed but given that this
  is not core functionality for most users, I'd rather get this
  release out the door now.

- Fix epoch() method to work properly with dates greater than 50 years
  ago.  Apparently, if Time::Local is given a year less than 100, it
  tries to guess the century, and it doesn't do this by simply adding
  1900.  Numbers less than 53 (for the year 2003) are treated as being
  in the current century.  Ugh.

- Fixed compilation on HPUX.  Patch from Dan Sully.

- The last_day_of_month() method did not accept a nanosecond

- A DT::Duration object created with just nanoseconds was always
  positive, regardless of the value given for nanoseconds.

- Fixed a serious bug when subtracting one datetime from another that
  could cause the result to be off by up to a second, and negative
  when it should be positive.  This was caused by the introduction of
  nanoseconds in 0.10.

- A zero length duration reported itself as positive when it should be
  neither positive nor negative.

- In Perl 5.6.1/Red Hat Linux 7.2, multiplying a variable with value
  zero by -1 gives negative-zero, which breaks tests.

    perl -e ' $x=0; $x*=-1; print $x '


  Patch by Flavio Glock.

- Comparing a DateTime::Infinite object to a regular datetime could
  cause a fatal error.  Reported by John Peacock.

- Fixed a failure in the 04epoch.t tests on Win32.  Negative epoch
  values don't work on Win32.


- The "Portugese" language module has been renamed to "Portuguese".
  I'm so embarassed!  Reported by Richard Evans.

- DateTime::Infinite objects no longer die if "set" methods are
  called.  Instead, these methods are now no-op methods that simply
  return the original object.  This makes these objects more usable
  when mixed with regular datetime objects.

- Removed the fractional_second constructor parameter.  It was
  incorrectly documented anyway.  The fractional_second _accessor_ is
  still there.

- DateTime::Duration objects of zero length no longer return true for

0.12     2003-05-05


- Make sure tests always run with warnings on.

- Fix line that had "$] >= 5.6.0" to be "$] >= 5.006".  This caused
  warnings and was just wrong.  Reported by John Siracusa.

- Quiet warnings from pure Perl implementation.

- Quiet warnings from language modules with Unicode when used with
  Perl 5.00503.

0.11     2003-05-03


- Moved a little bit of the leap second code to XS, so DateTime.pm may
  be a tiny bit faster.

- Added name() method to DateTime::Language.  Suggested by Rick

- Use XSLoader with Perl 5.6.0+, which according to ancient
  perl5-porters discussions saves some memory.

- Added infinite DateTime objects.  See the DateTime::Infinite docs
  for details.


- The %I and %l strftime formats were formatting hours as 0-11, not
  1-12 as documented.  Patch by Simon Newton.

- A DateTime::Duration object created only with weeks as a parameter
  always was positive.  Fixed by Flavio Glock.


- Because of changes in DateTime::TimeZone 0.13, which this version
  now requires, when a local time is ambiguous, the latest UTC time is
  used, rather than the earliest, as was done previously.

- The Brazilian language module has been renamed as Portugese.

- Removed DateTime::Duration->compare (which I forgot to document
  anyway ;) and comparison overloading for DT::Duration.  There's no
  meaningful way to compare 60 days to 2 months.

0.10     2003-04-19 (the "I'm sure the new regime will be spiffy" release)


- Added Tigre language module.  Contributed by Daniel Yacob.

- DateTime::Duration objects now overload multiplication.  Implemented
  by Flavio Glock.

- Added support for nanoseconds in DateTime.pm and DateTime::Duration.
  Implemented by Flavio Glock.

- Added complete support for leap seconds (through use of
  DateTime::LeapSecond).  Mostly implemented by Flavio Glock.


- Because of the addition of leap seconds to the mix, we are now
  forced to handle seconds separately from minutes when doing date
  math.  This means that several aspects of the DateTime::Duration API
  have changed.  Specifically:

-- There is now an additional delta_minutes() method.
-- The hash returned by the deltas() method now includes a "minutes" key.
-- The seconds delta may be greater than 59.
-- The seconds() method may return a number greater than 59.

0.09     2003-04-05 (the "liberation through violence" release)


- As requested by numerous people, there is now a pure Perl
  implementation of DateTime.pm included with this distribution.  If
  you don't have a C compiler it will be used instead of the XS

- Document how floating time zones are handling in comparisons, and
  add the compare_ignore_floating method.  Based on a patch from
  Eugene van der Pijll.

- Allow from_epoch(), now(), and today() to accept a time_zone
  parameter.  Based on suggestions from Tim Bunce and Joshua Hoblitt.

- Allow extraction of AM/PM string list from DateTime::Language classes.

- Added quarter() and day_of_quarter() methods.  Based on a patch from
  Tim Allwine.


- If a datetime had the floating timezone and then set_time_zone was
  used to set it to something else, the internal UTC time of the
  object was not changed, meaning that its offset could be calculated
  incorrectly.  Patch by Eugene van der Pijll.

- If datetime math was done with hours, minutes, or seconds, the
  return value of ->epoch would be wrong after this.  Based on report
  and patch from Iain Truskett.

0.08     2003-03-21 (the "anti-war" release)


- All set/modify methods now return the datetime object, in order to
  make method chaining possible.  Patch by Iain Truskett.

- The _greg2rd and _rd2greg methods have been renamed _ymd2rd and
  _rd2ymd, so as to make them look more normal when used in

- Added a truncate() method.  Suggested by Flavio Glock.

- Added Swedish language module.  Contributed by Christian Hansen.

- Added language modules for Afar, Amharic, Gedeo, Oromo, Sidama,
  Somali, and Tigrinya (Eritrean and Ethiopian), all courtesy of
  Daniel Yacob.

- Various doc improvements, including a section on invalid local


- The week() method was wrong for many dates.  Reported by Christian

- The last_day_of_month() method had the DateTime class hard-coded in
  it.  Reported by Eugene van der Pijll.

- Fixed a bug when comparing a datetime object to infinity (or
  negative infinity).  Fixed by Flavio Glock.

- Date math has been fixed so that it affects the _local_ times.  This
  means that sometimes 1 day is not equal to 24 hours when the
  addition/subtraction crosses over a Daylight Saving Time change.
  See the "How Date Math is Done" section of the docs for more


- Objects constructed via the new() method now have a "floating" time
  zone by default, instead of using the "local" time zone.  This is
  just simpler to deal with, and for code where time zones are
  unimportant, this is the most appropriate default.

0.07     2003-02-26


- Added a small hack to the compare() method so that this module can
  be used with Set::Infinite.

- Changed compare so that it can be used to compare two objects from
  different calendars that conform to the DateTime::Calendar

- Added explanation of exactly what calendar this module represents
  ("proleptic Gregorian calendar") to docs.

- Added a Spanish language DateTime::Language subclass.  Implemented
  by Flavio S. Glock.

- Added support for specifying a language by ISO code ("en" or
  "pt-br") as well as the subclass name.  Based on a patch from Eric

- Revamped the externally visible DateTime::Language API.

- Objects created via the from_object() method are set to the time
  zone of the object from which they were created, if it has one, or
  UTC otherwise.


- The from_object() method was broken because it retrieved a UTC
  datetime from the object passed in, and then created a new DateTime
  object using that UTC time as a _local_ time.


- Removed stringification overloading.  Having this in place made it
  impossible to create a strack trace in much of the time zone code.

- Renamed the DateTime::Language->subclasses method as languages.

- It is no longer possible to directly instantiate a
  DateTime::Language subclass, instead use:

    my $en = DateTime::Language->new( language => 'English' );

- The from_object() method no longer accepts a "time_zone" parameter.

0.06     2003-02-16

- The docs said that there was no year 0 in the Gregorian calendar,
  but that was wrong.  The year() method can now return 0.  The
  year_0() method has been removed.

- Added jd() and mjd() methods.

- Re-implemented some of the core code in XS for speed.

0.05     2003-02-13

- Fix handling and reporting of epoch times.  Epoch times are, by
  definition, UTC times, so any time created from an epoch should
  always have its time zone set to "UTC".  This can be changed after
  the object is created.  Similarly, value returned by the epoch()
  method needs to be based on the object's UTC time, not it's local
  time.  Bug reported by Kellan Elliott-McCrea.

- Change year_0 so that -1 BCE is 0, not 1 CE.  This corresponds to
  astronomical years.

- Change ymd, dmy, mdy, and iso8601 to use Gregorian years (..., -2,
  -1, 1, 2, ... ) as opposed to astronomical years.  Also make sure
  all negative years are formatted as 4 digits.

0.04     2003-02-10

- Explicitly set time zone for objects created during tests.

0.03     2003-02-09

- Giving a language parameter to a constructor method didn't load the
  language class.

- Test that all language classes are at least loadable.

- Added Brazilian (not quite a language ;) and Danish, again stolen
  from Graham Barr's TimeDate suite.

- Added is_dst method.  Requested by Matt Sergeant.

0.02     2003-02-09

- Fixed a bug in calculating day of year in leap years (it was +1 off
  starting in February).  Reported by Matt Sergeant.

- Subtracting one datetime from another was broken in most cases.
  Improved the tests for this quite a bit.  Reported by Eric Cholet.

- Made the version number a non-dev-release so it's visible when
  CPAN.pm tries to install it as a prereq for something else.

0.01_00  2003-02-04

- The first alpha release.  This module draws on Date::ICal for much
  of its internals, so it has more history than a normal alpha