Really don't like littering these checks all over the place - might it be better to adapt `Date#change` to detect for time options and then convert there, e.g.

``` ruby
def change(options)
  if (options.key & [:hour, :min, :sec, :usec]).empty?
    ::Date.new(
      options.fetch(:year, year),
      options.fetch(:month, month),
      options.fetch(:day, day)
    )
  else
    in_time_zone(options)
  end
end
```