File: time_machine.rb

package info (click to toggle)
mhc 1.1.1-2
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 2,320 kB
  • ctags: 3,529
  • sloc: ruby: 12,404; lisp: 7,448; makefile: 70; sh: 69
file content (159 lines) | stat: -rw-r--r-- 6,192 bytes parent folder | download | duplicates (3)
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
module RiCal
  class PropertyValue
    class DateTime
      #- ©2009 Rick DeNatale, All rights reserved. Refer to the file README.txt for the license
      #
      # Methods for DateTime which support getting values at different point in time.
      module TimeMachine

        def advance(options) # :nodoc:
          PropertyValue::DateTime.new(timezone_finder,
          :value => @date_time_value.advance(options),
          :tzid => @tzid,
          :params =>(params ? params.dup : nil)
          )
        end

        def change(options) # :nodoc:
          PropertyValue::DateTime.new(timezone_finder,
          :value => @date_time_value.change(options),
          :tzid => @tzid,
          :params => (params ? params.dup : nil)
          )
        end

        def change_sec(new_sec) #:nodoc:
          change(:sec => new_sec)
        end

        def change_min(new_min) #:nodoc:
          change(:min => new_min)
        end

        def change_hour(new_hour) #:nodoc:
          change(:hour => new_hour)
        end

        def change_day(new_day) #:nodoc:
          change(:day => new_day)
        end

        def change_month(new_month) #:nodoc:
          change(:month => new_month)
        end

        def change_year(new_year) #:nodoc:
          change(:year => new_year)
        end

        # Return a DATE-TIME property representing the receiver on a different day (if necessary) so that
        # the result is within the 7 days starting with date
        def in_week_starting?(date)
          wkst_jd = date.jd
          @date_time_value.jd.between?(wkst_jd, wkst_jd + 6)
        end

        # Return a DATE-TIME property representing the receiver on a different day (if necessary) so that
        # the result is the first day of the ISO week starting on the wkst day containing the receiver.
        def at_start_of_week_with_wkst(wkst)
          date = @date_time_value.start_of_week_with_wkst(wkst)
          change(:year => date.year, :month => date.month, :day => date.day)
        end
        # Return a DATE_TIME value representing the first second of the minute containing the receiver
        def start_of_minute
          change(:sec => 0)
        end

        # Return a DATE_TIME value representing the last second of the minute containing the receiver
        def end_of_minute
          change(:sec => 59)
        end

        # Return a DATE_TIME value representing the first second of the hour containing the receiver
        def start_of_hour
          change(:min => 0, :sec => 0)
        end

        # Return a DATE_TIME value representing the last second of the hour containing the receiver
        def end_of_hour
          change(:min => 59, :sec => 59)
        end

        # Return a DATE_TIME value representing the first second of the day containing the receiver
        def start_of_day
          change(:hour => 0, :min => 0, :sec => 0)
        end

        # Return a DATE_TIME value representing the last second of the day containing the receiver
        def end_of_day
          change(:hour => 23, :min => 59, :sec => 59)
        end

        # Return a Ruby Date representing the first day of the ISO week starting with wkst containing the receiver
        def start_of_week_with_wkst(wkst)
          @date_time_value.start_of_week_with_wkst(wkst)
        end

        # Return a DATE_TIME value representing the last second of the ISO week starting with wkst containing the receiver
        def end_of_week_with_wkst(wkst)
          date = at_start_of_week_with_wkst(wkst).advance(:days => 6).end_of_day
        end

        # Return a DATE_TIME value representing the first second of the month containing the receiver
        def start_of_month
          change(:day => 1, :hour => 0, :min => 0, :sec => 0)
        end

        # Return a DATE_TIME value representing the last second of the month containing the receiver
        def end_of_month
          change(:day => days_in_month, :hour => 23, :min => 59, :sec => 59)
        end

        # Return a DATE_TIME value representing the first second of the month containing the receiver
        def start_of_year
          change(:month => 1, :day => 1, :hour => 0, :min => 0, :sec => 0)
        end

        # Return a DATE_TIME value representing the last second of the month containing the receiver
        def end_of_year
          change(:month => 12, :day => 31, :hour => 23, :min => 59, :sec => 59)
        end

        # Return a DATE_TIME value representing the same time on the first day of the ISO year with weeks
        # starting on wkst containing the receiver
        def at_start_of_iso_year(wkst)
          start_of_year = @date_time_value.iso_year_start(wkst)
          change(:year => start_of_year.year, :month => start_of_year.month, :day => start_of_year.day)
        end

        # Return a DATE_TIME value representing the same time on the last day of the ISO year with weeks
        # starting on wkst containing the receiver
        def at_end_of_iso_year(wkst)
          num_weeks = @date_time_value.iso_weeks_in_year(wkst)
          at_start_of_iso_year(wkst).advance(:weeks => (num_weeks - 1), :days => 6)
        end

        # Return a DATE_TIME value representing the same time on the first day of the ISO year with weeks
        # starting on wkst after the ISO year containing the receiver
        def at_start_of_next_iso_year(wkst)
          num_weeks = @date_time_value.iso_weeks_in_year(wkst)
          at_start_of_iso_year(wkst).advance(:weeks => num_weeks)
        end

        # Return a DATE_TIME value representing the last second of the last day of the ISO year with weeks
        # starting on wkst containing the receiver
        def end_of_iso_year(wkst)
          at_end_of_iso_year(wkst).end_of_day
        end

        # Return a DATE-TIME representing the same time, on the same day of the month in month.
        # If the month of the receiver has more days than the target month the last day of the target month
        # will be used.
        def in_month(month)
          first = change(:day => 1, :month => month)
          first.change(:day => [first.days_in_month, day].min)
        end
      end
    end
  end
end