質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

3回答

1151閲覧

何日前かの計算方法。

tkshp

総合スコア174

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2019/08/01 03:30

前提・実現したいこと

何日前かの計算方法のご教示をお願いします。
ただし、検索して調べると24時間で割る方法が見つかるのですが、これだと意図通りの日付計算になりません。
例えば、対象の時間が10/30の1時30分で、現在の時間が10/29の23時30分だったとします。
時間的には2時間しか違わないですが、日付的には29日と30日なので、これを1日前とみなす計算方法を知りたいです。

試したこと

javascript

1var date1 = new Date("2019-10-29T23:30:00.000+09:00"); 2var date2 = new Date("2019-10-30T01:30:00.000+09:00"); 3 4console.log((date2-date1)/(1000*60*60*24));

計算結果

0.08333333333333333

この方法では、意図した通りになりません。

考えたこととしては、
date2の日付30を取得し、date1の日付29を取得、
30-29=1
と計算すればよいかとも思いましたが、
date2が11/1
date1が10/31
のように月をまたいだ場合、
1-31
でやはり正しい日付差分が得られませんでした。

JavaScriptやjQueryに日付差分を得る関数はないのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/08/01 03:43

日付だけではなく時間まで入れている以上は「ちょうど何日」という結果は出ないと思いますが、 どういう結果を想定されていました?
tkshp

2019/08/01 03:46

得られる日付は時間まで入ってきてしまいますが、暦上で何日か前を知りたいです。 >時間的には2時間しか違わないですが、日付的には29日と30日なので、これを1日前とみなす計算方法を知りたいです。
m.ts10806

2019/08/01 03:47 編集

0.08333333333333333日=7200秒=2時間 なので計算はあっているという前提でのコメント(確認)です
m.ts10806

2019/08/01 03:48

>これを1日前とみなす計算方法を知りたいです。 でしたら差分を計算する2つの日付を日付部分だけ取り出すのが良いです。(既に回答出てますね)
tkshp

2019/08/01 04:00

>差分を計算する2つの日付を日付部分だけ取り出すのが良いです。 ご回答ありがとうございます。勉強になりました。
guest

回答3

0

日付系の処理についてはmoment.jsを使うのがとても便利です。
https://qiita.com/osakanafish/items/5ef636bbcb2c3ef94953

とはいえ、このためだけにライブラリを導入するのも大仰なので、計算で何とかしてみましょう。
日付型を数値に直すと、協定世界時 (UTC) 1970 年 1 月 1 日 00:00:00 から与えられた日時までの間のミリ秒単位の数値であることはご存知の通りです。
では、協定世界時 (UTC) 1970 年 1 月 1 日 00:00:00からの経過日数はどうやって求められるでしょうか?

javascript

1var date1 = new Date("2019-10-29T23:30:00.000+09:00"); 2// 協定世界時 (UTC) 1970 年 1 月 1 日 00:00:00 からの日数 3date1.valueOf()/(1000*60*60*24)

→ 18198.604166666668
協定世界時 (UTC) 1970 年 1 月 1 日 00:00:00からの経過日数が求められました。
小数点が邪魔なので、丸めてしまいましょう。

javascript

1Math.floor(date1.valueOf()/(1000*60*60*24) )

→ 18198

あとはもう分かりますよね?
上記コードのままだとUTCであることに気をつけてください。

投稿2019/08/01 03:51

yutampp

総合スコア182

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yutampp

2019/08/01 03:55 編集

YYYYMMDDに変換して、月またぎ年またぎのIF文を何個も書いてというのは、かなりかっこ悪いです。 やめましょう。
tkshp

2019/08/01 03:59 編集

ご回答ありがとうございます。 勉強になりました。 YYYYMMDDの変換方法はよくないというご指摘ありがとうございます。
guest

0

ベストアンサー

2つの解決方法があります。

  • 時分秒を0にリセットし、両値の減算結果を「1日分のミリ秒」で除算する
  • YYYYMMDD 形式の数値に変換し、減算する

2019/08/01 19:00追記

20191101 - 20191031の数値で計算したら、1は得られないと思うのですが。

確かにそうですね。
この方法は考え落ちでしたので、撤回します。

new Date はミリ秒のプリミティブ値を持つので、四則演算のみで対応するのがスマートかと思います。
私は下記コードを書いてから、

JavaScript

1((afterDate - afterDate % 86400000) - (beforeDate - beforeDate % 86400000)) / 86400000;

最適化して、下記コードに変えます。

JavaScript

1(afterDate - afterDate % 86400000 - beforeDate + beforeDate % 86400000) / 86400000;

下記コードのように、小数点以下切り捨てでも、おそらく可能ですが、

JavaScript

1Math.ceil(afterDate/86400000)-Math.ceil(beforeDate/86400000)

浮動小数点演算の精度保証に詳しくない為、可能な限り、 整数演算を使うようにしています。

Re: tkshp さん

投稿2019/08/01 03:42

編集2019/08/01 10:01
think49

総合スコア18194

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tkshp

2019/08/01 03:48

ご回答ありがとうございます。 1点目の方法はわかりました。ありがとうございます。 2点目の方法も気になりました。 >YYYYMMDD 形式の数値に変換 すみません、どういったコードでYYYYMMDD 形式の数値に変換できますか?
tkshp

2019/08/01 03:57

勘違いかもしれませんが、 20191101 - 20191031の数値で計算したら、1は得られないと思うのですが。 2点目に関して、具体的なコードがあれば教えていただきたいです。
tkshp

2019/08/01 03:59

>時分秒を0にリセットし、両値の減算結果を「1日分のミリ秒」で除算する これがベストかと思ったので、ベストアンサーにさせていただきます。
think49

2019/08/01 10:02

> 20191101 - 20191031の数値で計算したら、1は得られないと思うのですが。 仰る通りですね。 親記事に追記しました。
tkshp

2019/08/02 01:25

ご回答ありがとうございます。 追記ありがとうございます。 勉強になりました。
guest

0

javascript

1var date1 = new Date("2019-10-29T23:59:59.000+09:00"); 2var date2 = new Date("2019-10-30T00:00:01.000+09:00"); 3 4var d1=parseInt((date1.getTime()+60*60*9*1000)/(60*60*24*1000)); 5var d2=parseInt((date2.getTime()+60*60*9*1000)/(60*60*24*1000)); 6 7console.log(d2-d1); 8

投稿2019/08/01 04:04

yambejp

総合スコア117674

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tkshp

2019/08/01 04:12

ご回答ありがとうございます。 こちらのご回答も勉強になりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問