Module: Chronos

Defined in:
lib/chronos.rb,
lib/chronos/zone.rb,
lib/chronos/version.rb,
lib/chronos/calendar.rb,
lib/chronos/datetime.rb,
lib/chronos/duration.rb,
lib/chronos/interval.rb,
lib/chronos/exceptions.rb,
lib/chronos/minimalistic.rb,
lib/chronos/numeric/gregorian.rb,
lib/chronos/calendar/gregorian.rb,
lib/chronos/duration/gregorian.rb,
lib/chronos/interval/gregorian.rb

Overview

Summary

Synopsis

Description

Duck typing

All chronos classes will accept in places of

Datetime

objects that respond to to_datetime (careful as this collides with date’s Time#to_datetime, you have to explicitly import them)

Duration

objects that respond to to_duration

Interval

objects that respond to to_interval

Calendar

objects that respond to to_calendar

For classes that don’t have those methods you can try Klassname::import. For example

Chronos::Datetime.import(Time.now) # => Chronos::Datetime

Defined Under Namespace

Modules: Datetime, Numeric Classes: Calendar, Duration, Interval, LocalizationError, NoDatePart, NoTimePart, Zone

Constant Summary collapse

PS_IN_NANOSECOND =

picoseconds in a nanosecond

1_000
PS_IN_MICROSECOND =

picoseconds in a microsecond

PS_IN_NANOSECOND * 1_000
PS_IN_MILLISECOND =

picoseconds in a microsecond

PS_IN_MICROSECOND * 1_000
PS_IN_SECOND =

picoseconds in a second

PS_IN_MILLISECOND * 1_000
PS_IN_MINUTE =

picoseconds in a minute

PS_IN_SECOND * 60
PS_IN_HOUR =

picoseconds in an hour

PS_IN_MINUTE * 60
PS_IN_DAY =

picoseconds in a day

PS_IN_HOUR * 24
PS_IN_WEEK =

picoseconds in a week

PS_IN_DAY * 7
YAMLExt =

The extension YAML files use

'.yaml'.freeze
ZonesFile =

The full path of the zones.tab file

File.join(File.dirname(__FILE__), "chronos", "data", "zones.tab").freeze
ZonesData =

The full path of the marshalled zones data cache file

File.join(File.dirname(__FILE__), "chronos", "data", "zones.marshal").freeze
DefaultizeStrings =
[
	:picosecond,
	:nanosecond,
	:microsecond,
	:millisecond,
	:second,
	:minute,
	:hour,
	:day,
	:week,
	:month,
	:year
].freeze
UTC =
Chronos.timezone('UTC')
VERSION =
version

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.calendarObject (readonly)

Returns the value of attribute calendar.



97
98
99
# File 'lib/chronos.rb', line 97

def calendar
  @calendar
end

.stringsObject (readonly)

Returns the value of attribute strings.



98
99
100
# File 'lib/chronos.rb', line 98

def strings
  @strings
end

Class Method Details

.language(lang = nil) ⇒ Object



174
175
176
177
178
179
180
181
# File 'lib/chronos.rb', line 174

def language(lang=nil)
	case lang
		when NilClass
			@language
		else
			normalize_language(lang)
	end
end

.language=(value) ⇒ Object

Set the default language to use with Chronos classes (parsing/printing)



155
156
157
# File 'lib/chronos.rb', line 155

def language=(value)
	@language = normalize_language(value)
end

.load_strings(strfile, language) ⇒ Object

Load a yaml strings file



128
129
130
131
132
133
134
135
# File 'lib/chronos.rb', line 128

def load_strings(strfile, language)
	data = YAML.load_file(strfile)
	DefaultizeStrings.each do |key|
		data[key] = Hash.new(data[key].delete(nil)).merge(data[key])
	end
	@strings[language] ||= {}
	@strings[language].update(data)
end

.normalize_language(val) ⇒ Object

Normalize the language to something Chronos can work with (or raise)

Raises:

  • (ArgumentError)


138
139
140
141
142
143
144
145
146
# File 'lib/chronos.rb', line 138

def normalize_language(val) # :nodoc:
	raise ArgumentError, "Invalid language #{val.inspect}" unless lang = val[/^[a-z]{2}_[A-Z]{2}/]
	unless @strings.has_key?(language) then
		warn "Language #{lang} not available, falling back to en_US"
		'en_US'
	else
		lang
	end
end

.normalize_timezone(val) ⇒ Object

Normalize the timezone to something Chronos can work with (or raise)

Raises:

  • (ArgumentError)


149
150
151
152
# File 'lib/chronos.rb', line 149

def normalize_timezone(val) # :nodoc:
	raise ArgumentError, "Could not normalize timezone #{val.inspect}" unless zone = Zone[val]
	zone
end

.string(lang, key, quantity = nil) ⇒ Object

TODO: refactor this ugly piece of code



101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/chronos.rb', line 101

def string(lang, key, quantity=nil)
	if localized1 = @strings[lang] then
		if localized2 = localized1[key] then
			quantity ? localized2[quantity] : localized2
		elsif lang != 'en_US' && localized1 = @strings['en_US'] then
			if localized2 = localized1[key] then
				warn "Couldn't localize #{key.inspect} for #{lang} with quantity #{quantity.inspect}, falling back to en_US"
				quantity ? localized2[quantity] : localized2
			else
				raise LocalizationError, "Can't localize #{key.inspect} for #{lang} with quantity #{quantity.inspect}"
			end
		else
			raise LocalizationError, "Can't localize #{key.inspect} for #{lang} with quantity #{quantity.inspect}"
		end
	elsif lang != 'en_US' && localized1 = @strings['en_US'] then
		if localized2 = localized1[key] then
			warn "Couldn't localize #{key.inspect} for #{lang} with quantity #{quantity.inspect}, falling back to en_US"
			quantity ? localized2[quantity] : localized2
		else
			raise LocalizationError, "Can't localize #{key.inspect} for #{lang} with quantity #{quantity.inspect}"
		end
	else
		raise LocalizationError, "Can't localize #{key.inspect} for #{lang} with quantity #{quantity.inspect}"
	end
end

.timezone(tz = nil) ⇒ Object



163
164
165
166
167
168
169
170
171
172
# File 'lib/chronos.rb', line 163

def timezone(tz=nil)
	case tz
		when Chronos::Zone
			tz
		when NilClass
			@timezone
		else
			normalize_timezone(tz)
	end
end

.timezone=(value) ⇒ Object

Set the default timezone to use with Chronos classes



160
161
162
# File 'lib/chronos.rb', line 160

def timezone=(value)
	@timezone = normalize_timezone(value)
end

.use(calendar_system) ⇒ Object

Set the calendar system Chronos should use. You can also just require the appropriate file, e.g.:

require 'chronos/gregorian'

will call Chronos.use :Gregorian

Raises:

  • (TypeError)


187
188
189
190
191
# File 'lib/chronos.rb', line 187

def use(calendar_system)
	raise "Calendar system is already set" if @calendar
	raise TypeError, "Symbol expected, #{calendar_system.class} given" unless calendar_system.kind_of?(Symbol)
	@calendar = calendar_system
end