Project

General

Profile

Bug #5402 » 0001-enhancing-documentation-for-Time-extension-in-stdlib.patch

semmons99 (Shane Emmons), 10/06/2011 04:14 AM

View differences:

lib/time.rb
require 'date'
#
# == Introduction
# When 'time' is required, Time is extended with additional methods for parsing
# and converting Times.
#
# = Features
#
# This library extends the Time class with the following:
#
# This library extends the Time class:
# * conversion between date string and time object.
# * date-time defined by RFC 2822
# * HTTP-date defined by RFC 2616
# * dateTime defined by XML Schema Part 2: Datatypes (ISO 8601)
# * various formats handled by Date._parse (string to time only)
# * datetime defined by XML Schema Part 2: Datatypes (ISO 8601)
# * various formats handled by Date._parse
# * various formats handled by Date._strptime
#
# == Design Issues
# = Examples
#
# === Specialized interface
# All examples assume you have loaded Time with:
#
# This library provides methods dedicated to special purposes:
# * RFC 2822, RFC 2616 and XML Schema.
# * They makes usual life easier.
# require 'time'
#
# === Doesn't depend on strftime
# All of these examples were done using the EST timezone which is GMT-5.
#
# This library doesn't use +Time#strftime+. Especially #rfc2822 doesn't depend
# on +strftime+ because:
# == Creating a new Time instance
#
# * %a and %b are locale sensitive
# The easiest way to create a new time object is to use either #parse or
# #strptime. Each uses Date.__parse and Date.__strptime to create a new
# instance of Time.
#
# Since they are locale sensitive, they may be replaced to
# invalid weekday/month name in some locales.
# Since ruby-1.6 doesn't invoke setlocale by default,
# the problem doesn't arise until some external library invokes setlocale.
# Ruby/GTK is the example of such library.
# === Time.parse
#
# * %z is not portable
# #parse takes a string representation of a Time and attempts to parse it
# using a heuristic.
#
# %z is required to generate zone in date-time of RFC 2822
# but it is not portable.
# Date.parse("2010-10-31") #=> 2010-10-31 00:00:00 -0500
#
# Note that +Time#strftime+ doesn't use +strftime()+ function in libc since Ruby 1.9.
# This means +Time#strftime+ is locale-insensitive since Ruby 1.9.
# The above statements are not valid now.
# Any missing pieces of the date are inferred based on the current date.
#
require 'date'
# # assuming the current date is "2011-10-31"
# Time.parse("12:00") #=> 2011-10-31 12:00:00 -0500
#
# We can change the date used to infer our missing elements by passing a second
# object that responds to #mon, #day and #year, such as Date, Time or DateTime.
# We can also use our own object.
#
# class MyDate
# attr_reader :mon, :day, :year
#
# Implements the extensions to the Time class that are described in the
# documentation for the time.rb library.
# def initialize(mon, day, year)
# @mon, @day, @year = mon, day, year
# end
# end
#
# d = Date.parse("2010-10-28")
# t = Time.parse("2010-10-29")
# dt = DateTime.parse("2010-10-30")
# md = MyDate.new(10,31,2010)
#
# Time.parse("12:00" d) #=> 2010-10-28 12:00:00 -0500
# Time.parse("12:00" t) #=> 2010-10-29 12:00:00 -0500
# Time.parse("12:00" dt) #=> 2010-10-30 12:00:00 -0500
# Time.parse("12:00" md) #=> 2010-10-31 12:00:00 -0500
#
# #parse also accepts an optional block. You can use this block to specify how
# to handle the year component of the date. This is specifically designed for
# handling two digit years. For example, if you wanted to treat all two digit
# years prior to 70 as the year 2000+ you could write this:
#
# Time.parse("01-10-31") {|year| year + (year < 70 ? 2000 : 1900)}
# #=> 2001-10-31 00:00:00 -0500
# Time.parse("70-10-31") {|year| year + (year < 70 ? 2000 : 1900)}
# #=> 1970-10-31 00:00:00 -0500
#
# === Time.strptime
#
# #strptime works similar to +parse+ except that instead of using a heuristic
# to detect the format of the input string, you provide a second argument that
# is describes the format of the string. For example:
#
# Time.strptime("2000-10-31", "%Y-%m-%d") #=> 2000-10-31 00:00:00 -0500
#
class Time
class << Time
......
# block. For example:
#
# Time.strptime(...) {|y| y < 100 ? (y >= 69 ? y + 1900 : y + 2000) : y}
#
# Below is a list of the formating options:
#
# %a :: The abbreviated weekday name (``Sun'')
# %A :: The full weekday name (``Sunday'')
# %b :: The abbreviated month name (``Jan'')
# %B :: The full month name (``January'')
# %c :: The preferred local date and time representation
# %C :: Century (20 in 2009)
# %d :: Day of the month (01..31)
# %D :: Date (%m/%d/%y)
# %e :: Day of the month, blank-padded ( 1..31)
# %F :: Equivalent to %Y-%m-%d (the ISO 8601 date format)
# %h :: Equivalent to %b
# %H :: Hour of the day, 24-hour clock (00..23)
# %I :: Hour of the day, 12-hour clock (01..12)
# %j :: Day of the year (001..366)
# %k :: hour, 24-hour clock, blank-padded ( 0..23)
# %l :: hour, 12-hour clock, blank-padded ( 0..12)
# %L :: Millisecond of the second (000..999)
# %m :: Month of the year (01..12)
# %M :: Minute of the hour (00..59)
# %n :: Newline (\n)
# %N :: Fractional seconds digits, default is 9 digits (nanosecond)
# %3N millisecond (3 digits)
# %6N microsecond (6 digits)
# %9N nanosecond (9 digits)
# %p :: Meridian indicator (``AM'' or ``PM'')
# %P :: Meridian indicator (``am'' or ``pm'')
# %r :: time, 12-hour (same as %I:%M:%S %p)
# %R :: time, 24-hour (%H:%M)
# %s :: Number of seconds since 1970-01-01 00:00:00 UTC.
# %S :: Second of the minute (00..60)
# %t :: Tab character (\t)
# %T :: time, 24-hour (%H:%M:%S)
# %u :: Day of the week as a decimal, Monday being 1. (1..7)
# %U :: Week number of the current year,
# starting with the first Sunday as the first
# day of the first week (00..53)
# %v :: VMS date (%e-%b-%Y)
# %V :: Week number of year according to ISO 8601 (01..53)
# %W :: Week number of the current year,
# starting with the first Monday as the first
# day of the first week (00..53)
# %w :: Day of the week (Sunday is 0, 0..6)
# %x :: Preferred representation for the date alone, no time
# %X :: Preferred representation for the time alone, no date
# %y :: Year without a century (00..99)
# %Y :: Year with century
# %z :: Time zone as hour offset from UTC (e.g. +0900)
# %Z :: Time zone name
# %% :: Literal ``%'' character
def strptime(date, format, now=self.now)
d = Date._strptime(date, format)
raise ArgumentError, "invalid strptime format - `#{format}'" unless d
(2-2/2)