- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
这怎么可能?
Time.now.utc.to_date + 1.month + 15.days #=> Mon, 01 Dec 2014
Time.now.utc.to_date + 15.days + 1.month #=> Sun, 30 Nov 2014
有人看过吗?
/编辑
我想我问错了问题。那你们怎么解释呢?
Time.now.utc.to_date + (15.days + 1.month) #=> Mon, 08 Dec 2014
Time.now.utc.to_date + (1.month + 15.days) #=> Tue, 09 Dec 2014
(15.days + 1.month) #=> 3888000
(1.month + 15.days) #=> 3888000
最佳答案
首先让我们看看 Integer#month ,它返回一个 ActiveSupport::Duration
的实例。在 Rails 控制台:
~/rails/rfinan (1296000):1 > elapsed = 1.month
=> 2592000
~/rails/rfinan (1296000):1 > elapsed.value
=> 2592000
~/rails/rfinan (1296000):1 > elapsed.parts
=> [[:months,1]]
~/rails/rfinan (1296000):1 > elapsed.is_a? ActiveSupport::Duration
=> true
该方法了:ActiveSupport::Duration#+
~/rails/rfinan (1296000):1 > sum1 = 1.month + 15.days
=> 3888000
~/rails/rfinan (1296000):1 > sum2 = 15.days + 1.month
=> 3888000
~/rails/rfinan (1296000):1 > sum1.value
=> 3888000
~/rails/rfinan (1296000):1 > sum1.parts
=> [[:months,1],[:days,15]]
~/rails/rfinan (1296000):1 > sum2.value
=> 3888000
~/rails/rfinan (1296000):1 > sum2.parts
=> [[:days,15],[:months,1]]
~/rails/rfinan (1296000):1 > sum1 == sum2
=> true
~/rails/rfinan (1296000):1 > sum1.value == sum2.value
=> true
~/rails/rfinan (1296000):1 > sum1.parts == sum2.parts
=> false
现在是 Date#+ ,ActiveSupport 版本。
def plus_with_duration(other) #:nodoc:
if ActiveSupport::Duration === other
other.since(self)
else
plus_without_duration(other)
end
end
alias_method :plus_without_duration, :+
alias_method :+, :plus_with_duration
这意味着:如果我将 :+ 发送到带有 ActiveSupport::Duration 实例作为参数的 Date 实例,它会调用 ActiveSupport::Duration#since ,最后一个调用 ActiveSupport::Duration#sum ,它会注入(inject)日期实例,并在每个实例上调用 Date#advance部分持续时间实例:
def sum(sign, time = ::Time.current) #:nodoc:
parts.inject(time) do |t,(type,number)|
if t.acts_like?(:time) || t.acts_like?(:date)
if type == :seconds
t.since(sign * number)
else
t.advance(type => sign * number)
end
else
raise ::ArgumentError, "expected a time or date, got #{time.inspect}"
end
end
end
记住 sum1.parts != sum2.parts?, sum 按顺序发送到日期实例。让我们看看 Date#advance 是什么意思
def advance(options)
options = options.dup
d = self
d = d >> options.delete(:years) * 12 if options[:years]
d = d >> options.delete(:months) if options[:months]
d = d + options.delete(:weeks) * 7 if options[:weeks]
d = d + options.delete(:days) if options[:days]
d
end
当提前收到 month: 1
时,它从 stdlib 调用 Date#>>,其工作方式与 ActiveSupport::Duration#+ 不同。在 irb:
~ (main) > Date.new(2014,10,31) >> 1
=> #<Date: 2014-11-30 ((2456992j,0s,0n),+0s,2299161j)>
~ (main) > Date.new(2014,10,31) >> 2
=> #<Date: 2014-12-31 ((2457023j,0s,0n),+0s,2299161j)>
~ (main) > Date.new(2014,10,31) >> 3
=> #<Date: 2015-01-31 ((2457054j,0s,0n),+0s,2299161j)>
~ (main) > Date.new(2014,10,31) >> 4
=> #<Date: 2015-02-28 ((2457082j,0s,0n),+0s,2299161j)>
~ (main) > Date.new(2014,10,31) >> 5
=> #<Date: 2015-03-31 ((2457113j,0s,0n),+0s,2299161j)>
~ (main) > Date.new(2014,10,31) >> 12
=> #<Date: 2015-10-31 ((2457327j,0s,0n),+0s,2299161j)>
~ (main) > Date.new(2014,10,31) >> 1200
=> #<Date: 2114-10-31 ((2493486j,0s,0n),+0s,2299161j)>
~ (main) > Date.new(2014,10,31) >> 12000
=> #<Date: 3014-10-31 ((2822204j,0s,0n),+0s,2299161j)>
很明显 Date#>> 不添加天数,添加月份并保留天数。如果该日期对目标月份无效,则会修复它。添加固定的月数并不能固定添加的天数,因为这取决于开始日期。
现在我们可以说 Date#+ 与 ActiveSupport::Duration#+ 不同,我们知道原因。
答案是使用 ActiveSupport::Duration 实例调用的 Date#+(比如持续时间)不关心 duration.value,它使用 duration.parts,这在每种情况下都是不同的。
关于ruby-on-rails - (Time.now.utc.to_date + 1.month + 15.days) != (Time.now.utc.to_date + 15.days + 1.month),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26408585/
虽然写了几个查询,但我只需要返回那些在今年(2017 年)设置了日期列的行,这不是我的问题我知道如何用几种不同的方式编写这个查询,但我遇到了一些奇怪的事情出乎我意料。谁能解释为什么 Oracle db
SELECT TO_CHAR((select logical_date -1 from logical_date where logical_date_type='B'),'DD/MM/YYYY HH
return [ Date::make('From Date') ->sortable() ->rules('r
下面的查询返回结果: SELECT * FROM EMPLOYEES WHERE HIRE_DATE = TO_DATE('21-09-1989','DD-MM-YY'); 好像我将日期从 21-09
这怎么可能? Time.now.utc.to_date + 1.month + 15.days #=> Mon, 01 Dec 2014 Time.now.utc.to_date + 15.days
我一直认为 to_date 函数字符串和日期格式应该匹配。为什么下面的语句工作正常? select TO_DATE('20151014','yyyy-mm-dd') from dual; oracle
我的 SQL where 子句中有以下内容。这是针对 Oracle 数据库运行的。 sc_dt字段在数据库中定义为日期字段。 sc_dt = TO_DATE('2011-11-03 00:00:00.
我写这条语句是为了获取上个月的第一天 select '01.' || TO_CHAR(ADD_MONTHS(SYSDATE,-1),'MM.yyyy') from dual 输出:01.02.2016
我有一个字符串列,其中包含以下数据作为示例 10/20/2005 15:08:00 11252011 15:22:40 我创建了一个临时日期列,我将把内容复制到其中,删除字符串列并将临时列重命名为
我正在查询以下sql。请帮我。 select to_date(sysdate, 'DD MONTH YYYY') , to_date(sysdate, 'yyyy/mm/dd hh24:mi:ss'
我有一个表,其中需要获取的日期是字符类型。我尝试使用 CONVERT 函数,但它不起作用。该查询在 postgres 中运行良好,但在 db2 中则不行。 select * FROM abc wher
我正在尝试按组和按月排序。因为我使用 to_char(date_field, 'Month') as month 将月份作为字符串而不是日期获取。这会导致结果按字母顺序而不是按时间顺序对月份进行排序。
在Oracle数据库中,Oracle to_date()函数是我们经常使用的函数,下面就为您详细介绍Oracle to_date()函数的用法,希望可以对您有所启迪。 to_date()与24小时
在Oracle数据库中,Oracle to_date()函数是我们经常使用的函数,下面就为您详细介绍Oracle to_date()函数的用法,希望可以对您有所启迪。 to_date()与24小时
我有简单的计算,我用时间从日期中减去间隔: select TO_DATE('2016-12-05 23:04:59', 'YYYY-MM-DD HH24:MI:SS') - to_dsinterv
我想用Oracle数据库实现以下。 当前的 table FTE f_date f_stime f_eDate f_etime 20191125 14:00 20191125
select TO_CHAR(to_date(sysdate, 'DD-MON-YYYY'), 'DAY') FROM DUAL; 当我运行这个查询时,输出是:SUNDAY。但我们知道今天是星期二(1
此查询运行但未返回任何行。 SELECT DISTINCT TO_CHAR(START_DATE,'MM/DD/YYYY'),
我想按部分创建 DATETIME,但在某些情况下这些部分为空。 示例 SELECT TO_DATE(STARTDATEMONTH||'-01-'||STARTDATEYEAR, 'MM-DD-YYYY
我刚刚发现了 oracle 的奇怪行为 TO_DATE与 format_mask 一起使用时的功能范围。 基本上,我看到的是,在一种情况下,它会忽略给定的格式掩码,并使用自己的掩码解析输入,而在其他情
我是一名优秀的程序员,十分优秀!