Remove circular requires (now a warning in Ruby 1.9.2). Instead of using requires in each file for dependencies, tzinfo.rb now requires all tzinfo files. If you were previously requiring files within the tzinfo directory (e.g. require 'tzinfo/timezone'), then you will now have to require 'tzinfo' instead.

Support Ruby trunk revision 31668 and later, which removed the DateTime.new! method. Make RubyCoreSupport.datetime_new! fallback to DateTime.jd instead. Thanks to Aaron Patterson for reporting the removal of the new! method (issue #29233).

Since Ruby revision 31862, DateTime.jd no longer accepts a fractional Julian Day number if any of the subsequent parameters are specified. Since setting the offset and calendar reform date is supported by RubyCoreSupport.datetime_new!, the hours, minutes and seconds must now be calculated from the fractional part of the Julian Day number.

… the built-in Ruby module data files.
* Include a data source that allows TZInfo to load data from the binary zoneinfo files produced by zic and included with many Linux/Unix distributions.
* Put the full path to the TZInfo lib directory on the search path when requiring 'tzinfo' instead of a relative path.
* Support running tests against either RubyDataSource or ZoneinfoDataSource (ts_all_ruby.rb and ts_all_zoneinfo.rb). When using ZoneinfoDataSource, a cut-down zoneinfo directory is used (tzinfo/test/zoneinfo). 'rake test' now tests against both RubyDataSource and ZoneinfoDataSource.

…ataSource.
Using symlinks in the zoneinfo directory is a non-standard Debian modification (zic will produce hard links). The Debian packages don't create the symlinks based on the source data (i.e. Link vs Zone definitions). Instead, they just search for sets of hard-linked files, pick an arbitrary file from each set and then replace all the files in the set with symlinks to the chosen file. It therefore doesn't make any sense to derive meaning from these symlinks.

Load Ruby data modules from the TZInfo Data library instead of from TZinfo (i.e. from tzinfo/data instead of tzinfo).
Add a cut down copy of TZInfo Data under tzinfo/test to allow tests to be run without requiring TZInfo Data.
Remove utils/zdumptest*. This functionality is now included in TZInfo Data's test cases.

…ing on Ruby 2.0 (due to respond_to changes for protected methods).
Change eql? and == implementations to test the class of the passed in object instead of checking individual properties with 'respond_to?'.

…Time.new (issue #29705).
Preserve microseconds when TimeOrDateTime converts between Time and DateTime.
Prefer using Time for comparison over Integer timestamps because it has more precision.
Simplify TimeOrDateTime#<=>.

… instance methods to TimezonePeriod. These return an identical value as the existing utc_start, utc_end, local_start and local_end methods, but return Time instances instead of DateTime.
Make the start_transition, end_transition and offset properties of TimezonePeriod protected. To access properties of the period, callers should use other TimezonePeriod instance methods instead (issue #7655).

Introduce a new superclass of TransitionDataTimezoneInfo named DataTimezoneInfo. This is a more generally useful superclass for any future DataSource implementations to be able to derive from.
Move the period_for_utc and period_for_local 'abstract' methods down from TimezoneInfo into the new DataTimezoneInfo - these methods don't make any sense for LinkedTimezoneInfo, so shouldn't have been defined at the TimezoneInfo level.
Add a create_timezone method to TimezoneInfo, implemented by DataTimezoneInfo and LinkedTimezoneInfo. Make Timezone.get call create_timezone instead of testing the class of the TimezoneInfo implementation returned by the DataSource.
Change the documentation for DataSource to indicate that load_timezone_info should return either a DataTimezoneInfo or a LinkedTimezoneInfo derivative.

- Use ThreadSafe::Cache for the Timezone and Country caches.
- Use a Mutex to ensure that the default DataSource is created at once.
- Load the timezone and country indexes when ZoneInfoDataSource is
created instead of when the indexes are first needed.
Resolves #29787.

- Rename TimezoneOffsetInfo to TimezoneOffset and TimezoneTransitionInfo
to TimezoneTransition.
- Remove #:nodoc: from TimezoneOffset, TimezoneTransition and
TimeOrDateTime. These classes are now part of the public interface
(used by Timezone#transitions_up_to and Timezone#offsets_up_to).

Introduce a new subclass of TimezoneTransition
(TimezoneTransitionDefinition) for use by the Ruby and zoneinfo data
sources.
TimezoneTransition is now abstract. TimezoneTransitionDefinition
contains the code to handle the deferred creation of the #at
TimeOrDateTime instance.

Untaint the result of joining the identifier with the path instead of
the identifier itself. If identifier is tainted and frozen, then
untainting it directly will give a 'can't modify frozen String' error.
Fixes #3.

rdoc.rb is not included in Ruby 1.8, rdoc/task.rb is not included prior
to Ruby 1.9.2 and on Ruby 1.9.2, the built-in version of rdoc/task.rb is
not compatible with later versions of rake - causing a RuntimeError to
be raised when required.

- Skip $SAFE tests (Rubinus doesn't support SAFE levels).
- Append an '-' argument when executing rbx as a sub-process to disable
irb mode.
- Add to the load path and require dependencies in code rather than on
the command line. Rubinus appears to ignore the -I and -r arguments
when invoked with an '-' argument.
- Test whether Times are in utc using the utc? method instead of
checking that zone returns 'UTC'. The Rubinus implementation of
Time#zone returns 'GMT' instead of 'UTC'.

- Make start_transition and end_transition on TimezonePeriod public (now
that they return classes that are part of the public interface).
- Add tests for start_transition, end_transition and offset (which was
made public in an earlier commit).
- Remove unnecessary uses of send to call start_transition and offset.

- DateTime on JRuby 1.7.5 only allows offsets of less than 1 day. Change
uses of 1 day offsets to 1 hour.
- JRuby 1.7.5 considers DateTime instances that differ by less than 1
millisecond to be equivalent
(jruby/jruby#1311). Make tests that rely on
being able to distinguish differences of 1 microsecond adapt if the
platform doesn't support such comparisons.

Distinguishes between actual UTC instances and local instances created
on systems using UTC as the local time zone.
Prevents Timezone#local_to_utc from returning local Time instances on
systems using UTC as the local time zone.
Fixes #13.

- Use refute_same instead of assert_not_same.
- Use message instead of build_message.
- Use assert instead of assert_block.
- Make assert_nothing_raised call assert instead of raising
Minitest::Assertion directly (allows the assertion to get counted).

- Support locating the iso3166.tab file when it is not included in the
zoneinfo directory.
- Handle the four column iso3166 tab file format used by FreeBSD.
- Support finding the iso3166.tab and zone.tab files using alternative
names on Solaris (tab/country.tab and tab/zone_sun.tab).
- Support loading country zone data from the non-standard five column
zone_sun.tab format.
Resolves #15.

Rename the existing CountryTimezone.new method new!. new! is now used
internally by RubyDataSource, passing the longitude and latitude as a
numerator and denominator in their lowest forms (for best performance on
Ruby 1.8).
ZoneinfoDataSource already uses Rationals to calculate the latitude and
longitude. It now calls CountryTimezone.new, passing the Rationals.

Fix an error in the conversion of -2**63 from an unsigned integer.
Ignore timestamps that are either far in the past or far in the future
and which currently cause problems for the transition index. This is
primarily intended to ignore the far in the past transition added in zic
2014c (at timestamp -2**63 in zic 2014c and at approximate time of the
big bang from zic 2014d).

On platforms that only support positive 32-bit timestamps, move the last
negative 32-bit timestamp to the epoch. This ensures that conversions
are accurate from the epoch onwards instead of just from the first
transition onwards.

Move the exception raising into a separate method. This prevents YARD
from detecting the exception and reporting it in the documentation.
Since the exceptions will never occur under normal usage, it is
unhelpful for them to appear in the documentation.