stardate 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: []