class ICU::TimeFormatting::DateTimeFormatter
Public Class Methods
new(options={})
click to toggle source
# File lib/ffi-icu/time_formatting.rb, line 98 def initialize(options={}) time_style = options[:time] || :short date_style = options[:date] || :short locale = options[:locale] || 'C' tz_style = options[:tz_style] time_zone = options[:zone] skeleton = options[:skeleton] @f = make_formatter(time_style, date_style, locale, time_zone, skeleton) if tz_style f0 = date_format(true) f1 = update_tz_format(f0, tz_style) if f1 != f0 set_date_format(true, f1) end end end
Public Instance Methods
date_format(localized=true)
click to toggle source
# File lib/ffi-icu/time_formatting.rb, line 164 def date_format(localized=true) needed_length = 0 out_ptr = UCharPointer.new(needed_length) retried = false begin Lib.check_error do |error| needed_length = Lib.udat_toPattern(@f, localized, out_ptr, needed_length, error) end out_ptr.string rescue BufferOverflowError raise BufferOverflowError, "needed: #{needed_length}" if retried out_ptr = out_ptr.resized_to needed_length retried = true retry end end
format(dt)
click to toggle source
# File lib/ffi-icu/time_formatting.rb, line 125 def format(dt) needed_length = 0 out_ptr = UCharPointer.new(needed_length) retried = false begin Lib.check_error do |error| case dt when Date needed_length = Lib.udat_format(@f, Time.mktime( dt.year, dt.month, dt.day, 0, 0, 0, 0 ).to_f * 1000.0, out_ptr, needed_length, nil, error) when Time needed_length = Lib.udat_format(@f, dt.to_f * 1000.0, out_ptr, needed_length, nil, error) end end out_ptr.string rescue BufferOverflowError raise BufferOverflowError, "needed: #{needed_length}" if retried out_ptr = out_ptr.resized_to needed_length retried = true retry end end
parse(str)
click to toggle source
# File lib/ffi-icu/time_formatting.rb, line 116 def parse(str) str_u = UCharPointer.from_string(str) str_l = str_u.size Lib.check_error do |error| ret = Lib.udat_parse(@f, str_u, str_l, nil, error) Time.at(ret / 1000.0) end end
set_date_format(localized, pattern_str)
click to toggle source
# File lib/ffi-icu/time_formatting.rb, line 184 def set_date_format(localized, pattern_str) pattern = UCharPointer.from_string(pattern_str) pattern_len = pattern_str.size Lib.check_error do |error| needed_length = Lib.udat_applyPattern(@f, localized, pattern, pattern_len) end end
skeleton_format(pattern, locale)
click to toggle source
# File lib/ffi-icu/time_formatting.rb, line 193 def skeleton_format(pattern, locale) pattern = UCharPointer.from_string(pattern) needed_length = 0 pattern_ptr = UCharPointer.new(needed_length) udatpg_ptr = Lib.check_error { |error| Lib.udatpg_open(locale, error) } generator = FFI::AutoPointer.new(udatpg_ptr, Lib.method(:udat_close)) retried = false begin Lib.check_error do |error| needed_length = Lib.udatpg_getBestPattern(generator, pattern, pattern.size, pattern_ptr, needed_length, error) end return needed_length, pattern_ptr rescue BufferOverflowError raise BufferOverflowError, "needed: #{needed_length}" if retried pattern_ptr = pattern_ptr.resized_to needed_length retried = true retry end end
update_tz_format(format, tz_style)
click to toggle source
time-zone formating
# File lib/ffi-icu/time_formatting.rb, line 151 def update_tz_format(format, tz_style) return format if format !~ /(.*?)(\s*(?:[zZOVV]+\s*))(.*?)/ pre, tz, suff = $1, $2, $3 if tz_style == :none tz = ((tz =~ /\s/) && !pre.empty? && !suff.empty?) ? ' ' : '' else repl = TZ_MAP[tz_style] raise 'no such tz_style' unless repl tz.gsub!(/^(\s*)(.*?)(\s*)$/, '\1'+repl+'\3') end pre + tz + suff end