diff options
| author | Randy Morgan <[email protected]> | 2012-02-23 09:44:33 +0900 |
|---|---|---|
| committer | Sean Duckett <[email protected]> | 2012-03-07 14:45:01 -0600 |
| commit | 6f4e9dd176bd56ec6c95c4441775ada2f5855203 (patch) | |
| tree | ce8f0045aab7a3f7e4e9f58d2312dd87897fefc4 | |
| parent | de603d4bfc1964cf24fe2ab4c917a5cbcfebef88 (diff) | |
| download | caxlsx-6f4e9dd176bd56ec6c95c4441775ada2f5855203.tar.gz caxlsx-6f4e9dd176bd56ec6c95c4441775ada2f5855203.zip | |
renaming for clarity, a bit of docs and some patches to spec for AWSOME date/time converter as negative date/time does not parse in some environments under 1.8.7
| -rw-r--r-- | lib/axlsx/workbook/workbook.rb | 2 | ||||
| -rw-r--r-- | lib/axlsx/workbook/worksheet/converter.rb | 21 | ||||
| -rw-r--r-- | lib/axlsx/workbook/worksheet/date_time_converter.rb | 25 | ||||
| -rw-r--r-- | test/workbook/worksheet/tc_date_time_converter.rb (renamed from test/workbook/worksheet/tc_converter.rb) | 28 |
4 files changed, 43 insertions, 33 deletions
diff --git a/lib/axlsx/workbook/workbook.rb b/lib/axlsx/workbook/workbook.rb index c19c3521..8a6eb629 100644 --- a/lib/axlsx/workbook/workbook.rb +++ b/lib/axlsx/workbook/workbook.rb @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- module Axlsx -require 'axlsx/workbook/worksheet/converter.rb' +require 'axlsx/workbook/worksheet/date_time_converter.rb' require 'axlsx/workbook/worksheet/cell.rb' require 'axlsx/workbook/worksheet/row.rb' require 'axlsx/workbook/worksheet/worksheet.rb' diff --git a/lib/axlsx/workbook/worksheet/converter.rb b/lib/axlsx/workbook/worksheet/converter.rb deleted file mode 100644 index 8df08f34..00000000 --- a/lib/axlsx/workbook/worksheet/converter.rb +++ /dev/null @@ -1,21 +0,0 @@ -# encoding: UTF-8 -require "date" - -module Axlsx - class Converter - def date_to_serial(date, date1904=false) - epoc = date1904 ? Date.new(1904) : Date.new(1899, 12, 30) - (date-epoc).to_f - end - - def time_to_serial(time, date1904=false) - # Using hardcoded offsets here as some operating systems will not except - # a 'negative' offset from the ruby epoc. - epoc1900 = -2209161600 # Time.utc(1899, 12, 30).to_i - epoc1904 = -2082844800 # Time.utc(1904, 1, 1).to_i - seconds_per_day = 86400 # 60*60*24 - epoc = date1904 ? epoc1904 : epoc1900 - (time.to_f - epoc)/seconds_per_day - end - end -end diff --git a/lib/axlsx/workbook/worksheet/date_time_converter.rb b/lib/axlsx/workbook/worksheet/date_time_converter.rb new file mode 100644 index 00000000..ee6d4a8a --- /dev/null +++ b/lib/axlsx/workbook/worksheet/date_time_converter.rb @@ -0,0 +1,25 @@ +# encoding: UTF-8 +require "date" + +module Axlsx + # The DateTimeConverter class converts both data and time types to their apprpriate excel serializations + class DateTimeConverter + + # The date_to_serial method converts dates to their excel serialized forms + # @param [Date] date the date to be serialized + def date_to_serial(date) + epoc = Axlsx::Workbook::date1904 ? Date.new(1904) : Date.new(1899, 12, 30) + (date-epoc).to_f + end + + def time_to_serial(time) + # Using hardcoded offsets here as some operating systems will not except + # a 'negative' offset from the ruby epoc. + epoc1900 = -2209161600 # Time.utc(1899, 12, 30).to_i + epoc1904 = -2082844800 # Time.utc(1904, 1, 1).to_i + seconds_per_day = 86400 # 60*60*24 + epoc = Axlsx::Workbook::date1904 ? epoc1904 : epoc1900 + (time.to_f - epoc)/seconds_per_day + end + end +end diff --git a/test/workbook/worksheet/tc_converter.rb b/test/workbook/worksheet/tc_date_time_converter.rb index 3919382a..a039282a 100644 --- a/test/workbook/worksheet/tc_converter.rb +++ b/test/workbook/worksheet/tc_date_time_converter.rb @@ -1,15 +1,17 @@ +# -*- coding: utf-8 -*- require 'test/unit' require 'axlsx.rb' -class TestConverter < Test::Unit::TestCase +class TestDateTimeConverter < Test::Unit::TestCase def setup - @converter = Axlsx::Converter.new + @converter = Axlsx::DateTimeConverter.new @margin_of_error = 0.000_001 end def test_date_to_serial_1900 + Axlsx::Workbook.date1904 = false { # examples taken straight from the spec - "1893-08-05" => -2338.0, + # "1893-08-05" => -2338.0, # ruby 1.8.7 cannot parse negative dates in some environments "1900-01-01" => 2.0, "1910-02-03" => 3687.0, "2006-02-01" => 38749.0, @@ -21,22 +23,24 @@ class TestConverter < Test::Unit::TestCase end def test_date_to_serial_1904 + Axlsx::Workbook.date1904 = true { # examples taken straight from the spec - "1893-08-05" => -3800.0, + # "1893-08-05" => -3800.0, # ruby 1.8.7 cannot parse negative dates in some environments "1904-01-01" => 0.0, "1910-02-03" => 2225.0, "2006-02-01" => 37287.0, "9999-12-31" => 2957003.0, }.each do |date_string, expected| - serial = @converter.date_to_serial Date.parse(date_string), true + serial = @converter.date_to_serial Date.parse(date_string) assert_equal serial, expected end end def test_time_to_serial_1900 + Axlsx::Workbook.date1904 = false { # examples taken straight from the spec - "1893-08-05T00:00:01Z" => -2337.999989, - "1899-12-28T18:00:00Z" => -1.25, + # "1893-08-05T00:00:01Z" => -2337.999989, # ruby 1.8.7 cannot parse negative dates in some environments + # "1899-12-28T18:00:00Z" => -1.25, # ruby 1.8.7 cannot parse negative dates in some environments "1910-02-03T10:05:54Z" => 3687.4207639, "1900-01-01T12:00:00Z" => 2.5, # wrongly indicated as 1.5 in the spec! "9999-12-31T23:59:59Z" => 2958465.9999884, @@ -47,13 +51,14 @@ class TestConverter < Test::Unit::TestCase end def test_time_to_serial_1904 + Axlsx::Workbook.date1904 = true { # examples taken straight from the spec - "1893-08-05T00:00:01Z" => -3799.999989, + # "1893-08-05T00:00:01Z" => -3799.999989, # ruby 1.8.7 cannot parse negative dates in some environments "1910-02-03T10:05:54Z" => 2225.4207639, "1904-01-01T12:00:00Z" => 0.5000000, "9999-12-31T23:59:59Z" => 2957003.9999884, - }.each do |time_string, expected| - serial = @converter.time_to_serial Time.parse(time_string), true + }.each do |time_string, expected| + serial = @converter.time_to_serial Time.parse(time_string) assert_in_delta serial, expected, @margin_of_error end end @@ -63,7 +68,8 @@ class TestConverter < Test::Unit::TestCase local = Time.new 2012, 1, 1, 1, 0, 0, 3600 # January 1st, 2012 at 1:00 GMT+1 assert_equal local, utc assert_equal @converter.time_to_serial(local), @converter.time_to_serial(utc) - assert_equal @converter.time_to_serial(local, true), @converter.time_to_serial(utc, true) + Axlsx::Workbook.date1904 = true + assert_equal @converter.time_to_serial(local), @converter.time_to_serial(utc) end end |
