module SugarCube::DateParser

Public Instance Methods

iso8601(date_string) click to toggle source
# File lib/cocoa/sugarcube-nsdate/date_parser.rb, line 46
def iso8601(date_string)
  if defined? NSISO8601DateFormatter
    formatter = NSISO8601DateFormatter.alloc.init
    formatter.timeZone = NSTimeZone.timeZoneWithAbbreviation "UTC"
    date = formatter.dateFromString date_string
    return date if date
  end

  @@sugarcube_iso_detectors ||= [
    "yyyy-MM-dd'T'HH:mm:ss",
    "yyyy-MM-dd'T'HH:mm:ssZ",
    "yyyy-MM-dd'T'HH:mm:ss.S",
    "yyyy-MM-dd'T'HH:mm:ss.SZ",
    ].map do |date_format|
      formatter = NSDateFormatter.alloc.init
      formatter.timeZone = NSTimeZone.timeZoneWithAbbreviation "UTC"
      formatter.dateFormat = date_format
      formatter
    end
  return @@sugarcube_iso_detectors.inject(nil) { |date, formatter| date || formatter.dateFromString(date_string) }
end
match(date_string) click to toggle source

Parse a date into a raw match array for further processing

# File lib/cocoa/sugarcube-nsdate/date_parser.rb, line 42
def match(date_string)
  sugarcube_detect(date_string)
end
parse_date(date_string) click to toggle source

Parse a date string: E.g.:

SugarCube::DateParser.parse_date “There is a date in here tomorrow at 9:00 AM”

> 2013-02-20 09:00:00 -0800

# File lib/cocoa/sugarcube-nsdate/date_parser.rb, line 10
def parse_date(date_string)
  if result = iso8601(date_string)
    return result
  elsif result = sugarcube_detect(date_string).first
    return result.date
  end
end
parse_duration(date_string) click to toggle source

Parse a date string: E.g.:

SugarCube::DateParser.parse_date “You have a meeting from 9:00 AM to 3:00 PM”

> 21600.0

Divide by 3600.0 to get number of hours duration.

# File lib/cocoa/sugarcube-nsdate/date_parser.rb, line 36
def parse_duration(date_string)
  result = sugarcube_detect(date_string).first
  result && result.send(:duration)
end
parse_time_zone(date_string) click to toggle source

Parse time zone from date

SugarCube::DateParser.parse_date “There is a date in here tomorrow at 9:00 AM EDT”

Caveat: This is implemented per Apple documentation. I've never really

seen it work.
# File lib/cocoa/sugarcube-nsdate/date_parser.rb, line 24
def parse_time_zone(date_string)
  result = sugarcube_detect(date_string).first
  result && result.timeZone
end

Private Instance Methods

sugarcube_detect(date_string) click to toggle source
# File lib/cocoa/sugarcube-nsdate/date_parser.rb, line 68
def sugarcube_detect(date_string)
  @@sugarcube_detector ||= NSDataDetector.dataDetectorWithTypes(NSTextCheckingTypeDate, error:Pointer.new(:object))
  return @@sugarcube_detector.matchesInString(date_string, options:0, range:NSMakeRange(0, date_string.length))
end