0

この動作が意図されているかどうかはわかりませんが、少し奇妙に思えます。How do you get DateTime.parse to return a time in your time zone?のコードを使用しています。

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

場合によっては、返される DateTime が 1 秒早くなります。

(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-1516:56:00"と"2012-07-1516: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 に答える