0

我不确定这种行为是否是有意的,但对我来说似乎有点奇怪。我正在使用How do you get DateTime.parse 中的代码来返回您所在时区的时间?

require 'date'
estHoursOffset = +10 # Brisbane/Australia
estOffset = Rational(estHoursOffset, 24)

有时,返回的 DateTime 会早一秒:

(DateTime.parse("2012-07-15 16:56:00") - (estHoursOffset/24.0)).new_offset(estOffset)
 => #<DateTime: 2012-07-15T16:55:59+10:00 (2456123.788888889,5/12,2299161)> 

但在其他时候,这似乎是正确的:

(DateTime.parse("2012-07-15 16:16:00") - (estHoursOffset/24.0)).new_offset(estOffset)
 => #<DateTime: 2012-07-15T16:16:00+10:00 (2456123.7611111114,5/12,2299161)>

我正在编写的程序只关心分钟,这意味着我可以16:55在我想要的时候回来16:56

所以我的问题是;

  • 这是故意的吗?(如果是这样,它是否记录在某处 - 我找不到任何东西。)
  • 有没有一种以编程方式解决此问题的简单方法?由于我不关心秒数,我想我可以“四舍五入”返回的 DateTimes,但很高兴知道这是否会在边缘情况下引发任何其他问题。
4

2 回答 2

1

我尝试了两次(“2012-07-15 16:56:00”和“2012-07-15 16:16:00”)并且Ruby总是产生最初解析的时间。我不知道你是如何设法减少 1 秒的;这是一个奇迹!只是开个玩笑 :)

如果这仍然让您很难尝试获取日期(和时间) - 像这样更简单..:

require 'date'    
$date = Time.now                #current date/time

puts $date    
puts $date.min                  #if you want to use only the minutes

$date="2012-07-15 16:56:00"     #if you want to parse it yourself

继续你的问题:

-不,这不是国际性的,也可能是间歇性的。我已经在上面(+10h 澳大利亚)和我所在的英国伦敦(+1h)测试了您的代码。总是得到时间解析;绝不会少一秒或多一秒。

现在,如果您需要将秒数四舍五入,那么您将 100% 确定每次和每次都获得相同的结果..:

def round_up(seconds)
  divisor = 10**Math.log10(seconds).floor
  i = seconds / divisor
  remainder = seconds % divisor
  if remainder == 0
    i * divisor
  else
    (i + 1) * divisor
  end
end

我不明白为什么舍入会导致边界条件出现问题;只要你总是四舍五入!希望这可以帮助!祝你好运队友:)

于 2012-07-30T09:09:46.693 回答
1

这可能是因为浮点数不精确 -10/24.0你减去的不能准确表示。

如果不是减去那个浮点数而是减去一个有理数,Rational(estHoursOffset, 24)那么你应该没问题

于 2012-07-30T13:25:26.350 回答