add time formats
This commit is contained in:
+88
-14
@@ -19,6 +19,47 @@ module TimeUtils
|
||||
'YY' => '%y'
|
||||
}.freeze
|
||||
|
||||
HOUR_FORMATS = {
|
||||
'H' => '%-H',
|
||||
'HH' => '%H',
|
||||
'h' => '%-I',
|
||||
'hh' => '%I'
|
||||
}.freeze
|
||||
|
||||
MINUTE_FORMATS = {
|
||||
'm' => '%-M',
|
||||
'mm' => '%M'
|
||||
}.freeze
|
||||
|
||||
SECOND_FORMATS = {
|
||||
's' => '%-S',
|
||||
'ss' => '%S'
|
||||
}.freeze
|
||||
|
||||
AMPM_FORMATS = {
|
||||
'A' => '%p',
|
||||
'a' => '%P'
|
||||
}.freeze
|
||||
|
||||
TIMEZONE_FORMATS = {
|
||||
'z' => '%Z'
|
||||
}.freeze
|
||||
|
||||
TIME_FORMATS = HOUR_FORMATS.merge(MINUTE_FORMATS)
|
||||
.merge(SECOND_FORMATS)
|
||||
.merge(AMPM_FORMATS)
|
||||
.freeze
|
||||
|
||||
ALL_FORMATS = MONTH_FORMATS.merge(DAY_FORMATS)
|
||||
.merge(YEAR_FORMATS)
|
||||
.merge(TIME_FORMATS)
|
||||
.merge(TIMEZONE_FORMATS)
|
||||
.freeze
|
||||
|
||||
TOKEN_REGEX = /MMMM|MMM|MM|M|DD|D|YYYY|YYY|YY|HH|hh|H|h|mm|m|ss|s|A|a|z/
|
||||
|
||||
MONTH_ONLY_VALUE_REGEX = /\A\d{4}-\d{2}\z/
|
||||
|
||||
DEFAULT_DATE_FORMAT_US = 'MM/DD/YYYY'
|
||||
DEFAULT_DATE_FORMAT = 'DD/MM/YYYY'
|
||||
|
||||
@@ -42,27 +83,60 @@ module TimeUtils
|
||||
end
|
||||
end
|
||||
|
||||
def parse_date_string(string, pattern)
|
||||
pattern = pattern.sub(/Y+/, YEAR_FORMATS)
|
||||
.sub(/M+/, MONTH_FORMATS)
|
||||
.sub(/D+/, DAY_FORMATS)
|
||||
|
||||
Date.strptime(string, pattern)
|
||||
def format_with_time?(format)
|
||||
format.to_s.match?(/[HhAasz]/)
|
||||
end
|
||||
|
||||
def format_date_string(string, format, locale)
|
||||
date = Date.parse(string.to_s)
|
||||
def month_only_format?(format)
|
||||
format.to_s.present? && !format.to_s.match?(/[DdHhAasz]/)
|
||||
end
|
||||
|
||||
format = format.upcase if format
|
||||
def format_date_preview(format, locale, timezone)
|
||||
return '' if format.blank?
|
||||
|
||||
format = format.upcase unless format_with_time?(format)
|
||||
preview_pattern = format.gsub(TOKEN_REGEX) { |token| TIME_FORMATS.key?(token) ? '--' : ALL_FORMATS[token] }
|
||||
|
||||
I18n.l(Time.current.in_time_zone(timezone.presence || Time.zone.name), format: preview_pattern, locale:)
|
||||
end
|
||||
|
||||
def current_date_value(format, timezone)
|
||||
tz = timezone.presence || Time.zone.name
|
||||
|
||||
if format_with_time?(format)
|
||||
Time.current.utc.iso8601
|
||||
elsif month_only_format?(format)
|
||||
Time.current.in_time_zone(tz).strftime('%Y-%m')
|
||||
else
|
||||
Time.current.in_time_zone(tz).to_date.to_s
|
||||
end
|
||||
end
|
||||
|
||||
def parse_date_string(string, pattern)
|
||||
with_time = format_with_time?(pattern)
|
||||
pattern = pattern.upcase unless with_time
|
||||
pattern = pattern.gsub(TOKEN_REGEX, ALL_FORMATS)
|
||||
|
||||
with_time ? Time.zone.strptime(string, pattern) : Date.strptime(string, pattern)
|
||||
end
|
||||
|
||||
def format_date_string(string, format, locale, timezone: nil)
|
||||
format = format.upcase if format && !format_with_time?(format)
|
||||
format ||= locale.to_s.ends_with?('US') ? DEFAULT_DATE_FORMAT_US : DEFAULT_DATE_FORMAT
|
||||
|
||||
i18n_format = format.sub(/D+/) { DAY_FORMATS[format[/D+/]] }
|
||||
.sub(/M+/) { MONTH_FORMATS[format[/M+/]] }
|
||||
.sub(/Y+/) { YEAR_FORMATS[format[/Y+/]] }
|
||||
date =
|
||||
if format_with_time?(format)
|
||||
Time.iso8601(string.to_s).in_time_zone(timezone.presence || Time.zone.name)
|
||||
elsif string.to_s.match?(MONTH_ONLY_VALUE_REGEX)
|
||||
year, month = string.to_s.split('-').map(&:to_i)
|
||||
|
||||
I18n.l(date, format: i18n_format, locale:)
|
||||
rescue Date::Error
|
||||
Date.new(year, month, 1)
|
||||
else
|
||||
Date.parse(string.to_s)
|
||||
end
|
||||
|
||||
I18n.l(date, format: format.gsub(TOKEN_REGEX, ALL_FORMATS), locale:)
|
||||
rescue ArgumentError
|
||||
string
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user