unix_epoch 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.rdoc CHANGED
@@ -28,6 +28,18 @@ Documentation is available online at at rdoc.info[http://rdoc.info/projects/chet
28
28
 
29
29
  sudo gem install unix_epoch
30
30
 
31
+ == FURTHER READING:
32
+
33
+ Here's some good information on various Calendar systems:
34
+
35
+ * http://mysite.verizon.net/aesir_research/date/back.htm
36
+ * https://secure.wikimedia.org/wikipedia/en/wiki/Julian_day
37
+ * http://www.fourmilab.ch/solar/help/timedate.html
38
+
39
+ And the Perl library from which I borrowed some ideas:
40
+
41
+ * http://search.cpan.org/~chorny/DateTime-Format-Epoch-0.13/
42
+
31
43
  == LICENSE:
32
44
 
33
45
  (The MIT License)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.0
data/lib/unix_epoch.rb CHANGED
@@ -4,6 +4,7 @@
4
4
  # better understood by Ruby's DateTime library
5
5
 
6
6
  require 'date'
7
+ require 'tzinfo'
7
8
 
8
9
  module UnixEpoch
9
10
 
@@ -12,10 +13,14 @@ module UnixEpoch
12
13
  # Create a new DateTime object from a given Unix Timestamp
13
14
  #
14
15
  # @param [Fixnum, Bignum] unix_ts seconds since unix epoch (1970-01-01 00:00:00 UTC)
15
- # @param [Fixnum] offset offset in seconds from UTC time
16
+ # @param [Fixnum, TZInfo::Timezone] offset offset in seconds from UTC time or an instance of TZInfo::TimeZone
16
17
  # @return [DateTime] DateTime object representation of the given Unix TS
17
18
  def from_unix_ts(unix_ts, offset = 0)
18
19
 
20
+ if not (offset.respond_to? :to_i or offset.kind_of? TZInfo::Timezone) then
21
+ raise "Invalid value passed for offset: must be an integer or TZInfo::Timezone"
22
+ end
23
+
19
24
  # step 1) get the delta in days, seconds and nano seconds represented by unix_ts
20
25
 
21
26
  delta_days = UnixEpoch._floor(unix_ts / 86_400)
@@ -36,10 +41,19 @@ module UnixEpoch
36
41
 
37
42
  jd_days = epoch_jd_days + delta_days
38
43
 
39
- secs = epoch_secs + delta_secs + offset # add tz offset back in also
44
+ secs = epoch_secs + delta_secs
45
+ if offset.respond_to? :to_i
46
+ secs += offset # add tz offset back in also
47
+ end
40
48
  jd_secs = UnixEpoch.secs_to_jd_secs(secs) + Rational(delta_nano.round, 86_400_000_000)
41
49
 
42
- return DateTime.from_jd(jd_days, jd_secs, offset)
50
+ if offset.respond_to? :to_i
51
+ return DateTime.from_jd(jd_days, jd_secs, offset)
52
+ elsif offset.kind_of? TZInfo::Timezone
53
+ dt = DateTime.from_jd(jd_days, jd_secs, 0) # first create a new DateTime
54
+ ldt = offset.utc_to_local(dt) # then convert it to our target TZ
55
+ return DateTime.from_jd(ldt.jd, ldt.day_fraction, (ldt.to_i - dt.to_i)) # then create a new DateTime with the current offset
56
+ end
43
57
  end
44
58
 
45
59
  end
@@ -84,17 +98,17 @@ module UnixEpoch
84
98
  end
85
99
 
86
100
  # Retrieve the seconds part of the given Julian Date
87
- #
88
- # @param [Float] Julian Date including fractional value (e.g., 2455647.543)
89
- # @return [Fixnum] Number of seconds represented by the fractional value
101
+ #
102
+ # @param [Float] Julian Date including fractional value (e.g., 2455647.543)
103
+ # @return [Fixnum] Number of seconds represented by the fractional value
90
104
  def self.get_jd_secs(jd)
91
105
  jd_fr_to_secs(jd % 1)
92
106
  end
93
107
 
94
108
  # Convert the given Julian Date fractional value into seconds
95
- #
96
- # @param [Float] Julian Date fractional value (e.g., 0.543)
97
- # @return [Fixnum] Number of seconds represented by the fractional value
109
+ #
110
+ # @param [Float] Julian Date fractional value (e.g., 0.543)
111
+ # @return [Fixnum] Number of seconds represented by the fractional value
98
112
  def self.jd_fr_to_secs(fr)
99
113
  h, m, s = DateTime.day_fraction_to_time(fr)
100
114
  (h * 3600 + m * 60 + s)
@@ -1,6 +1,8 @@
1
1
 
2
+ require 'rubygems'
2
3
  require 'test/unit'
3
4
  require 'unix_epoch'
5
+ require 'timezone_local'
4
6
 
5
7
  class UnixEpoch_Test < Test::Unit::TestCase
6
8
 
@@ -41,4 +43,10 @@ class UnixEpoch_Test < Test::Unit::TestCase
41
43
  assert t.to_i == i
42
44
  assert d.to_unix_ts == i
43
45
  end
46
+
47
+ def test_from_unix_ts_with_tzinfo
48
+ tz = TZInfo::Timezone.get_local_timezone
49
+ i = 1301103992
50
+ assert DateTime.from_unix_ts(i, tz).strftime(@f) == Time.at(i).strftime(@f)
51
+ end
44
52
  end
data/unix_epoch.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{unix_epoch}
8
- s.version = "0.1.0"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Chetan Sarva"]
12
- s.date = %q{2011-03-26}
12
+ s.date = %q{2011-03-28}
13
13
  s.description = %q{Adds from_unix_ts and to_unix_ts methods to the DateTime class}
14
14
  s.email = %q{chetan@pixelcop.net}
15
15
  s.extra_rdoc_files = [
@@ -25,16 +25,17 @@ Gem::Specification.new do |s|
25
25
  ]
26
26
  s.homepage = %q{http://github.com/chetan/unix_epoch}
27
27
  s.require_paths = ["lib"]
28
- s.rubygems_version = %q{1.5.0}
28
+ s.rubygems_version = %q{1.3.6}
29
29
  s.summary = %q{Adds methods to DateTime for dealing with Unix Timestamps}
30
30
  s.test_files = [
31
31
  "test/unix_epoch_test.rb"
32
32
  ]
33
33
 
34
34
  if s.respond_to? :specification_version then
35
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
35
36
  s.specification_version = 3
36
37
 
37
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
38
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
38
39
  else
39
40
  end
40
41
  else
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unix_epoch
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
5
- prerelease:
4
+ prerelease: false
6
5
  segments:
7
6
  - 0
8
- - 1
7
+ - 2
9
8
  - 0
10
- version: 0.1.0
9
+ version: 0.2.0
11
10
  platform: ruby
12
11
  authors:
13
12
  - Chetan Sarva
@@ -15,7 +14,7 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2011-03-26 00:00:00 -04:00
17
+ date: 2011-03-28 00:00:00 -04:00
19
18
  default_executable:
20
19
  dependencies: []
21
20
 
@@ -44,27 +43,23 @@ rdoc_options: []
44
43
  require_paths:
45
44
  - lib
46
45
  required_ruby_version: !ruby/object:Gem::Requirement
47
- none: false
48
46
  requirements:
49
47
  - - ">="
50
48
  - !ruby/object:Gem::Version
51
- hash: 3
52
49
  segments:
53
50
  - 0
54
51
  version: "0"
55
52
  required_rubygems_version: !ruby/object:Gem::Requirement
56
- none: false
57
53
  requirements:
58
54
  - - ">="
59
55
  - !ruby/object:Gem::Version
60
- hash: 3
61
56
  segments:
62
57
  - 0
63
58
  version: "0"
64
59
  requirements: []
65
60
 
66
61
  rubyforge_project:
67
- rubygems_version: 1.5.0
62
+ rubygems_version: 1.3.6
68
63
  signing_key:
69
64
  specification_version: 3
70
65
  summary: Adds methods to DateTime for dealing with Unix Timestamps