aboutsummaryrefslogtreecommitdiffstats
path: root/lib/xmlrpc/datetime.rb
blob: 431ac24aa93e23097b32d66f24b97948930b31b2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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
126
127
128
129
130
# frozen_string_literal: false
#
# xmlrpc/datetime.rb
# Copyright (C) 2001, 2002, 2003 by Michael Neumann (mneumann@ntecs.de)
#
# Released under the same term of license as Ruby.
#
require "date"

module XMLRPC # :nodoc:

# This class is important to handle XMLRPC +dateTime.iso8601+ values,
# correctly, because normal UNIX-dates, ie: Date, only handle dates
# from year 1970 on, and ruby's native Time class handles dates without the
# time component.
#
# XMLRPC::DateTime is able to store a XMLRPC +dateTime.iso8601+ value correctly.
class DateTime

  # Return the value of the specified date/time component.
  attr_reader :year, :month, :day, :hour, :min, :sec

  # Set +value+ as the new date/time component.
  #
  # Raises ArgumentError if the given +value+ is out of range, or in the case
  # of XMLRPC::DateTime#year= if +value+ is not of type Integer.
  def year= (value)
    raise ArgumentError, "date/time out of range" unless value.is_a? Integer
    @year = value
  end

  # Set +value+ as the new date/time component.
  #
  # Raises an ArgumentError if the given +value+ isn't between 1 and 12.
  def month= (value)
    raise ArgumentError, "date/time out of range" unless (1..12).include? value
    @month = value
  end

  # Set +value+ as the new date/time component.
  #
  # Raises an ArgumentError if the given +value+ isn't between 1 and 31.
  def day= (value)
    raise ArgumentError, "date/time out of range" unless (1..31).include? value
    @day = value
  end

  # Set +value+ as the new date/time component.
  #
  # Raises an ArgumentError if the given +value+ isn't between 0 and 24.
  def hour= (value)
    raise ArgumentError, "date/time out of range" unless (0..24).include? value
    @hour = value
  end

  # Set +value+ as the new date/time component.
  #
  # Raises an ArgumentError if the given +value+ isn't between 0 and 59.
  def min= (value)
    raise ArgumentError, "date/time out of range" unless (0..59).include? value
    @min = value
  end

  # Set +value+ as the new date/time component.
  #
  # Raises an ArgumentError if the given +value+ isn't between 0 and 59.
  def sec= (value)
    raise ArgumentError, "date/time out of range" unless (0..59).include? value
    @sec = value
  end

  # Alias for XMLRPC::DateTime#month.
  alias mon  month
  # Alias for XMLRPC::DateTime#month=.
  alias mon= month=


  # Creates a new XMLRPC::DateTime instance with the
  # parameters +year+, +month+, +day+ as date and
  # +hour+, +min+, +sec+ as time.
  #
  # Raises an ArgumentError if a parameter is out of range,
  # or if +year+ is not of the Integer type.
  def initialize(year, month, day, hour, min, sec)
    self.year, self.month, self.day = year, month, day
    self.hour, self.min, self.sec   = hour, min, sec
  end

  # Return a Time object of the date/time which represents +self+.
  # If the <code>@year</code> is below 1970, this method returns +nil+,
  # because Time cannot handle years below 1970.
  #
  # The timezone used is GMT.
  def to_time
    if @year >= 1970
      Time.gm(*to_a)
    else
      nil
    end
  end

  # Return a Date object of the date which represents +self+.
  #
  # The Date object do _not_ contain the time component (only date).
  def to_date
    Date.new(*to_a[0,3])
  end

  # Returns all date/time components in an array.
  #
  # Returns +[year, month, day, hour, min, sec]+.
  def to_a
    [@year, @month, @day, @hour, @min, @sec]
  end

  # Returns whether or not all date/time components are an array.
  def ==(o)
    self.to_a == Array(o) rescue false
  end

end


end # module XMLRPC


=begin
= History
    $Id$
=end