LoginSignup
4

More than 5 years have passed since last update.

ミリ秒を秒に変換する際に~~を使ってはいけない(と思う)という話

Last updated at Posted at 2016-04-01

JavaScriptで浮動小数点型の数字を整数型に直す方法はいくつかある.

  • parseInt
  • Math.floor (Math.ceil, Math.round)
  • ~~

一応知らない人のために説明しておくと,最後のチルダ演算子はビットの反転を行っているのだが,その際に32ビット整数に変換されるので,2度ビット反転をすることにより浮動小数点型を整数型に変換できる.しかもMath.floorやparseIntよりも割と高速に.
そもそもparseIntはstringをnumberに変換するメソッドなので,TypeScriptではエラーを吐いたりする.
そこで~~を使いたくなるのだが,エポックミリ秒をエポック秒に変換し,整数型として扱いたい場合,例えば以下の場合にこれを用いるのは控えた方が良いと思う.

var epochSec = ~~(new Date().getTime() / 1000);

なぜなら32ビット整数に変換されるので,このコードでは2038年1月19日12:14:08(GMT+0900)以降実行するとオーバーフローを起こし負の値になる.
他にも32ビットを超える可能性がある場合にこのチルダ演算子による変換を用いるのは賢明ではないだろう.

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4