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.
- data/lib/stardate.rb +167 -0
- data/lib/stardate_interval.rb +66 -0
- 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: []
|