stardate 2.0.1

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.
Files changed (3) hide show
  1. data/lib/stardate.rb +167 -0
  2. data/lib/stardate_interval.rb +66 -0
  3. metadata +46 -0
data/lib/stardate.rb ADDED
@@ -0,0 +1,167 @@
1
+ require 'time'
2
+
3
+ require 'stardate_interval'
4
+
5
+ class StarDate
6
+
7
+ attr_accessor :stardate
8
+
9
+ class << self
10
+
11
+ # Based on 365.2425 days/Gregorian year
12
+
13
+ def millisecond
14
+ 1.0/31556952000.0
15
+ end
16
+
17
+ def second
18
+ 1.0/31556952.0
19
+ end
20
+
21
+ def minute
22
+ 1.0/525949.2
23
+ end
24
+
25
+ def hour
26
+ 1.0/8765.82
27
+ end
28
+
29
+ def day
30
+ 1.0/365.2425
31
+ end
32
+
33
+ def week
34
+ 7.0/365.2425
35
+ end
36
+
37
+ def fortnight
38
+ 14.0/365.2425
39
+ end
40
+
41
+ def month
42
+ 1.0/12.0
43
+ end
44
+
45
+ def rename(filename, mode = :mtime)
46
+ case mode
47
+ when :mtime
48
+ datetime = File.mtime filename
49
+ when :ctime
50
+ datetime = File.ctime filename
51
+ else
52
+ raise "Unknown mode: #{mode}"
53
+ end
54
+ File.rename filename, datetime.to_stardate.to_filename(filename)
55
+ end
56
+
57
+ end
58
+
59
+ def initialize(t = Time.now)
60
+ case t.class.to_s
61
+ when "StarDate"
62
+ @stardate = t.stardate
63
+ return
64
+ when "Fixnum"
65
+ @stardate = t.to_f
66
+ return
67
+ when "Float"
68
+ @stardate = t
69
+ return
70
+ when "DateTime"
71
+ datetime = t.to_time.utc
72
+ when "Time"
73
+ datetime = t.utc
74
+ when "ActiveSupport::TimeWithZone"
75
+ datetime = t.utc
76
+ when "String"
77
+ datetime = Time.parse(t).utc
78
+ else
79
+ raise "Unknown conversion: #{t.class}"
80
+ end
81
+ y0 = datetime.year
82
+ t0 = Time.utc(y0).to_f
83
+ t1 = Time.utc(y0 + 1).to_f
84
+ @stardate = y0 + (datetime.to_f - t0)/(t1 - t0)
85
+ end
86
+
87
+ def -(arg)
88
+ StarDateInterval.new arg, self
89
+ end
90
+
91
+ def inspect
92
+ [
93
+ to_s,
94
+ ' [',
95
+ to_rfc2822,
96
+ ']'
97
+ ].join
98
+ end
99
+
100
+ def to_datetime
101
+ to_time.to_datetime
102
+ end
103
+
104
+ def to_dts
105
+ to_time.utc.strftime("%Y%m%d_%H%M%SZ")
106
+ end
107
+
108
+ def to_f
109
+ @stardate
110
+ end
111
+
112
+ def to_filename(filename)
113
+ ext = File.extname filename
114
+ [
115
+ filename.chomp(ext),
116
+ '-',
117
+ to_s,
118
+ ext
119
+ ].join
120
+ end
121
+
122
+ # Round to the nearest second
123
+ def to_iso8601
124
+ Time.at(to_time.to_f + 0.5).iso8601
125
+ end
126
+
127
+ def to_localdate
128
+ to_time.to_date
129
+ end
130
+
131
+ # Round to the nearest second
132
+ def to_rfc2822
133
+ Time.at(to_time.to_f + 0.5).rfc2822
134
+ end
135
+
136
+ def to_s
137
+ sprintf("%.15f", @stardate)
138
+ end
139
+
140
+ def to_time
141
+ y0 = @stardate.to_i
142
+ t0 = Time.utc(y0).to_f
143
+ t1 = Time.utc(y0+1).to_f
144
+ Time.at(t0 + (@stardate-y0)*(t1-t0))
145
+ end
146
+
147
+ def to_utcdate
148
+ to_time.utc.to_date
149
+ end
150
+
151
+ end
152
+
153
+ class DateTime
154
+
155
+ def to_stardate
156
+ StarDate.new self
157
+ end
158
+
159
+ end
160
+
161
+ class Time
162
+
163
+ def to_stardate
164
+ StarDate.new self
165
+ end
166
+
167
+ end
@@ -0,0 +1,66 @@
1
+ class StarDateInterval
2
+
3
+ attr_accessor :start, :stop
4
+
5
+ def initialize(start, stop)
6
+ @start = StarDate.new start
7
+ @stop = StarDate.new stop
8
+ end
9
+
10
+ def -@
11
+ StarDateInterval.new @stop, @start
12
+ end
13
+
14
+ def years
15
+ @stop.stardate - @start.stardate
16
+ end
17
+
18
+ def months
19
+ years / StarDate.month
20
+ end
21
+
22
+ def weeks
23
+ years / StarDate.week
24
+ end
25
+
26
+ def days
27
+ years / StarDate.day
28
+ end
29
+
30
+ def hours
31
+ years / StarDate.hour
32
+ end
33
+
34
+ def minutes
35
+ years / StarDate.minute
36
+ end
37
+
38
+ def seconds
39
+ years / StarDate.second
40
+ end
41
+
42
+ def milliseconds
43
+ years / StarDate.millisecond
44
+ end
45
+
46
+ def inspect
47
+ [
48
+ '[',
49
+ @start.to_s,
50
+ ' - ',
51
+ @stop.to_s,
52
+ '] (',
53
+ to_human,
54
+ ')'
55
+ ].join
56
+ end
57
+
58
+ def to_human(precision = 3)
59
+ [ :years, :months, :weeks, :days, :hours, :minutes, :seconds, :milliseconds ].each do |scale|
60
+ x = public_send scale
61
+ return "%.#{precision}f %s" % [x, scale] if x.abs >= 1
62
+ end
63
+ return "%.#{precision}e seconds" % seconds
64
+ end
65
+
66
+ end
metadata ADDED
@@ -0,0 +1,46 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: stardate
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Chris Oei
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-12-28 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: StarDate representation
15
+ email: zlkm208-rubygems@yahoo.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/stardate.rb
21
+ - lib/stardate_interval.rb
22
+ homepage: http://www.oei.me
23
+ licenses: []
24
+ post_install_message:
25
+ rdoc_options: []
26
+ require_paths:
27
+ - lib
28
+ required_ruby_version: !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ required_rubygems_version: !ruby/object:Gem::Requirement
35
+ none: false
36
+ requirements:
37
+ - - ! '>='
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ requirements: []
41
+ rubyforge_project:
42
+ rubygems_version: 1.8.24
43
+ signing_key:
44
+ specification_version: 3
45
+ summary: StarDate representation
46
+ test_files: []