Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
79852989
R
rails
项目概览
张重言
/
rails
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rails
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
79852989
编写于
3月 26, 2009
作者:
J
Jeremy Kemper
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Convert DateTime extension modules to class reopens
上级
34929fed
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
117 addition
and
113 deletion
+117
-113
activesupport/lib/active_support/core_ext/date_time.rb
activesupport/lib/active_support/core_ext/date_time.rb
+6
-5
activesupport/lib/active_support/core_ext/date_time/calculations.rb
...ort/lib/active_support/core_ext/date_time/calculations.rb
+94
-108
activesupport/lib/active_support/core_ext/date_time/zones.rb
activesupport/lib/active_support/core_ext/date_time/zones.rb
+17
-0
未找到文件。
activesupport/lib/active_support/core_ext/date_time.rb
浏览文件 @
79852989
require
'active_support/core_ext/util'
require
'date'
require
'active_support/core_ext/time/behavior'
require
'active_support/core_ext/time/zones'
require
'active_support/core_ext/date_time/calculations'
require
'active_support/core_ext/date_time/zones'
require
'active_support/core_ext/time/behavior'
class
DateTime
include
ActiveSupport
::
CoreExtensions
::
Time
::
Behavior
include
ActiveSupport
::
CoreExtensions
::
Time
::
Zones
end
ActiveSupport
.
core_ext
DateTime
,
%w(calculations conversions)
require
'active_support/core_ext/util'
ActiveSupport
.
core_ext
DateTime
,
%w(conversions)
activesupport/lib/active_support/core_ext/date_time/calculations.rb
浏览文件 @
79852989
require
'rational'
module
ActiveSupport
#:nodoc:
module
CoreExtensions
#:nodoc:
module
DateTime
#:nodoc:
# Enables the use of time calculations within DateTime itself
module
Calculations
def
self
.
included
(
base
)
#:nodoc:
base
.
extend
ClassMethods
base
.
class_eval
do
alias_method
:compare_without_coercion
,
:<=>
alias_method
:<=>
,
:compare_with_coercion
end
end
module
ClassMethods
# DateTimes aren't aware of DST rules, so use a consistent non-DST offset when creating a DateTime with an offset in the local zone
def
local_offset
::
Time
.
local
(
2007
).
utc_offset
.
to_r
/
86400
end
class
DateTime
class
<<
self
# DateTimes aren't aware of DST rules, so use a consistent non-DST offset when creating a DateTime with an offset in the local zone
def
local_offset
::
Time
.
local
(
2007
).
utc_offset
.
to_r
/
86400
end
def
current
::
Time
.
zone_default
?
::
Time
.
zone
.
now
.
to_datetime
:
::
Time
.
now
.
to_datetime
end
end
def
current
::
Time
.
zone_default
?
::
Time
.
zone
.
now
.
to_datetime
:
::
Time
.
now
.
to_datetime
end
end
# Tells whether the DateTime object's datetime lies in the past
def
past?
self
<
::
DateTime
.
current
end
# Tells whether the DateTime object's datetime lies in the past
def
past?
self
<
::
DateTime
.
current
end
# Tells whether the DateTime object's datetime lies in the future
def
future?
self
>
::
DateTime
.
current
end
# Tells whether the DateTime object's datetime lies in the future
def
future?
self
>
::
DateTime
.
current
end
# Seconds since midnight: DateTime.now.seconds_since_midnight
def
seconds_since_midnight
self
.
sec
+
(
self
.
min
*
60
)
+
(
self
.
hour
*
3600
)
end
# Seconds since midnight: DateTime.now.seconds_since_midnight
def
seconds_since_midnight
sec
+
(
min
*
60
)
+
(
hour
*
3600
)
end
# Returns a new DateTime where one or more of the elements have been changed according to the +options+ parameter. The time options
# (hour, minute, sec) reset cascadingly, so if only the hour is passed, then minute and sec is set to 0. If the hour and
# minute is passed, then sec is set to 0.
def
change
(
options
)
::
DateTime
.
civil
(
options
[
:year
]
||
self
.
year
,
options
[
:month
]
||
self
.
month
,
options
[
:day
]
||
self
.
day
,
options
[
:hour
]
||
self
.
hour
,
options
[
:min
]
||
(
options
[
:hour
]
?
0
:
self
.
min
),
options
[
:sec
]
||
((
options
[
:hour
]
||
options
[
:min
])
?
0
:
self
.
sec
),
options
[
:offset
]
||
self
.
offset
,
options
[
:start
]
||
self
.
start
)
end
# Returns a new DateTime where one or more of the elements have been changed according to the +options+ parameter. The time options
# (hour, minute, sec) reset cascadingly, so if only the hour is passed, then minute and sec is set to 0. If the hour and
# minute is passed, then sec is set to 0.
def
change
(
options
)
::
DateTime
.
civil
(
options
[
:year
]
||
year
,
options
[
:month
]
||
month
,
options
[
:day
]
||
day
,
options
[
:hour
]
||
hour
,
options
[
:min
]
||
(
options
[
:hour
]
?
0
:
min
),
options
[
:sec
]
||
((
options
[
:hour
]
||
options
[
:min
])
?
0
:
sec
),
options
[
:offset
]
||
offset
,
options
[
:start
]
||
start
)
end
# Uses Date to provide precise Time calculations for years, months, and days.
# The +options+ parameter takes a hash with any of these keys: <tt>:years</tt>,
# <tt>:months</tt>, <tt>:weeks</tt>, <tt>:days</tt>, <tt>:hours</tt>,
# <tt>:minutes</tt>, <tt>:seconds</tt>.
def
advance
(
options
)
d
=
to_date
.
advance
(
options
)
datetime_advanced_by_date
=
change
(
:year
=>
d
.
year
,
:month
=>
d
.
month
,
:day
=>
d
.
day
)
seconds_to_advance
=
(
options
[
:seconds
]
||
0
)
+
(
options
[
:minutes
]
||
0
)
*
60
+
(
options
[
:hours
]
||
0
)
*
3600
seconds_to_advance
==
0
?
datetime_advanced_by_date
:
datetime_advanced_by_date
.
since
(
seconds_to_advance
)
end
# Uses Date to provide precise Time calculations for years, months, and days.
# The +options+ parameter takes a hash with any of these keys: <tt>:years</tt>,
# <tt>:months</tt>, <tt>:weeks</tt>, <tt>:days</tt>, <tt>:hours</tt>,
# <tt>:minutes</tt>, <tt>:seconds</tt>.
def
advance
(
options
)
d
=
to_date
.
advance
(
options
)
datetime_advanced_by_date
=
change
(
:year
=>
d
.
year
,
:month
=>
d
.
month
,
:day
=>
d
.
day
)
seconds_to_advance
=
(
options
[
:seconds
]
||
0
)
+
(
options
[
:minutes
]
||
0
)
*
60
+
(
options
[
:hours
]
||
0
)
*
3600
seconds_to_advance
==
0
?
datetime_advanced_by_date
:
datetime_advanced_by_date
.
since
(
seconds_to_advance
)
end
# Returns a new DateTime representing the time a number of seconds ago
# Do not use this method in combination with x.months, use months_ago instead!
def
ago
(
seconds
)
self
.
since
(
-
seconds
)
end
# Returns a new DateTime representing the time a number of seconds ago
# Do not use this method in combination with x.months, use months_ago instead!
def
ago
(
seconds
)
since
(
-
seconds
)
end
# Returns a new DateTime representing the time a number of seconds since the instance time
# Do not use this method in combination with x.months, use months_since instead!
def
since
(
seconds
)
self
+
Rational
(
seconds
.
round
,
86400
)
end
alias
:in
:since
# Returns a new DateTime representing the time a number of seconds since the instance time
# Do not use this method in combination with x.months, use months_since instead!
def
since
(
seconds
)
self
+
Rational
(
seconds
.
round
,
86400
)
end
alias
:in
:since
# Returns a new DateTime representing the start of the day (0:00)
def
beginning_of_day
change
(
:hour
=>
0
)
end
alias
:midnight
:beginning_of_day
alias
:at_midnight
:beginning_of_day
alias
:at_beginning_of_day
:beginning_of_day
# Returns a new DateTime representing the start of the day (0:00)
def
beginning_of_day
change
(
:hour
=>
0
)
end
alias
:midnight
:beginning_of_day
alias
:at_midnight
:beginning_of_day
alias
:at_beginning_of_day
:beginning_of_day
# Returns a new DateTime representing the end of the day (23:59:59)
def
end_of_day
change
(
:hour
=>
23
,
:min
=>
59
,
:sec
=>
59
)
end
# Returns a new DateTime representing the end of the day (23:59:59)
def
end_of_day
change
(
:hour
=>
23
,
:min
=>
59
,
:sec
=>
59
)
end
# Adjusts DateTime to UTC by adding its offset value; offset is set to 0
#
# Example:
#
# DateTime.civil(2005, 2, 21, 10, 11, 12, Rational(-6, 24)) # => Mon, 21 Feb 2005 10:11:12 -0600
# DateTime.civil(2005, 2, 21, 10, 11, 12, Rational(-6, 24)).utc # => Mon, 21 Feb 2005 16:11:12 +0000
def
utc
new_offset
(
0
)
end
alias_method
:getutc
,
:utc
# Adjusts DateTime to UTC by adding its offset value; offset is set to 0
#
# Example:
#
# DateTime.civil(2005, 2, 21, 10, 11, 12, Rational(-6, 24)) # => Mon, 21 Feb 2005 10:11:12 -0600
# DateTime.civil(2005, 2, 21, 10, 11, 12, Rational(-6, 24)).utc # => Mon, 21 Feb 2005 16:11:12 +0000
def
utc
new_offset
(
0
)
end
alias_method
:getutc
,
:utc
# Returns true if offset == 0
def
utc?
offset
==
0
end
# Returns true if offset == 0
def
utc?
offset
==
0
end
# Returns the offset value in seconds
def
utc_offset
(
offset
*
86400
).
to_i
end
# Returns the offset value in seconds
def
utc_offset
(
offset
*
86400
).
to_i
end
# Layers additional behavior on DateTime#<=> so that Time and ActiveSupport::TimeWithZone instances can be compared with a DateTime
def
compare_with_coercion
(
other
)
other
=
other
.
comparable_time
if
other
.
respond_to?
(
:comparable_time
)
other
=
other
.
to_datetime
unless
other
.
acts_like?
(
:date
)
compare_without_coercion
(
other
)
end
end
end
# Layers additional behavior on DateTime#<=> so that Time and ActiveSupport::TimeWithZone instances can be compared with a DateTime
def
compare_with_coercion
(
other
)
other
=
other
.
comparable_time
if
other
.
respond_to?
(
:comparable_time
)
other
=
other
.
to_datetime
unless
other
.
acts_like?
(
:date
)
compare_without_coercion
(
other
)
end
alias_method
:compare_without_coercion
,
:<=>
alias_method
:<=>
,
:compare_with_coercion
end
activesupport/lib/active_support/core_ext/date_time/zones.rb
0 → 100644
浏览文件 @
79852989
class
DateTime
# Returns the simultaneous time in <tt>Time.zone</tt>.
#
# Time.zone = 'Hawaii' # => 'Hawaii'
# DateTime.new(2000).in_time_zone # => Fri, 31 Dec 1999 14:00:00 HST -10:00
#
# This method is similar to Time#localtime, except that it uses <tt>Time.zone</tt> as the local zone
# instead of the operating system's time zone.
#
# You can also pass in a TimeZone instance or string that identifies a TimeZone as an argument,
# and the conversion will be based on that zone instead of <tt>Time.zone</tt>.
#
# DateTime.new(2000).in_time_zone('Alaska') # => Fri, 31 Dec 1999 15:00:00 AKST -09:00
def
in_time_zone
(
zone
=
::
Time
.
zone
)
ActiveSupport
::
TimeWithZone
.
new
(
utc?
?
self
:
getutc
,
::
Time
.
__send__
(
:get_zone
,
zone
))
end
end
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录