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

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

ただいまの
回答率

90.34%

  • JavaScript

    17529questions

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

Javascript : 時刻のみの比較を行う方法はないのか?

解決済

回答 7

投稿

  • 評価
  • クリップ 1
  • VIEW 1,316

Statham

score 61

日付を含めず、時刻のみの比較を行いたいです。

例えば、以下のような時間のデータがあった時

const start_time = new Date("2000-01-02T07:00:00.000+09:00");
// Sun Jan 02 2000 07:00:00 GMT+0900 (日本標準時)
const end_time = new Date("2000-01-01T22:00:00.000+09:00");
// Sat Jan 01 2000 22:00:00 GMT+0900 (日本標準時)

const now = new Date();
// Tue Jul 03 2018 08:11:25 GMT+0900 (日本標準時)

nowが、start_timeend_timeに含まれるかを調べたいとします。

その際に、普通に<などで調べると、日付がstart_timeend_timeは2000年代なので、必ずnowのほうが大きくなってしまいます。

こういった際に、日付を無視して比較する方法はないのでしょうか?

今考えている方法は、一回start_timeend_timeの時刻のみを取り出して、新規にnowと同じ日付で時間を作り直し、それを比較するという煩雑なやり方で、どうも無駄が多いように感じましたのでご質問させていただきました。

よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 7

checkベストアンサー

+4

案1:
getHours()して比較、等しければgetMinutes()して比較、等しければ・・・以下同様

案2:
getHours()*3600+getMinutes()*60+getSeconds()+getMilliseconds()/1000.0を比較

案3:
""+して文字列にして、時刻の所だけ切り出して文字列として比較

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/03 16:50

    案1を参考にさせていただきました。
    ありがとうございました。

    キャンセル

+4

startがendよりあとになっているのは運用上あまり得策とはいえません
通常startの時間7時からendの時間22時までの間と解釈すべきですが
時間が逆転しているので論理的には22時から7時の間と判断すべきです
そのアタリのロジックがはっきりしないと正しい判断をしづらいと思います

考え方としては
endがstartより前の場合はstartとendを逆転して判断する
その上で、start、endの日付をnowに寄せてから処理するか
時間を文字列として抜き出して処理するのどちらかが有効でしょう

もちろんstartとendの時間が同じだった場合24時間とみるのか0時間とみるのか
など細かい仕様をつめていかなといけません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/03 16:53

    ですよねぇ。

    データを入れる際にそこを蔑ろにしていた結果、今気が付きました。
    startがendよりあとになっているのはかなり問題なので、そこは別途修正したいと思います。

    ご指摘ありがとうございました。

    キャンセル

+2

一回start_timeとend_timeの時刻のみを取り出して、新規にnowと同じ日付で時間を作り直し、それを比較する

それで良いと思いますよ。
Dateオブジェクトによる明確な比較はdatetime型にする必要がありますし。
年月日だけの比較に見えて、時間が00:00:00が入っていますし。

まあ、時分秒だけ個別に取り出して時分秒を結合してparseInt()した上で比較する方法もないわけではないですが・・。
12:34:56 → 123456 
09:01:08 →  90108 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

getHours()などで比較すればいいのでは

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/03 10:34

    date = new Date();
    jason = new Date();
    console.log(date.getTime() === jason.getTime()); // true
    jason.setYear(2000);
    jason.setMonth(9);
    jason.setDate(13);
    console.log(date.getTime() === jason.getTime()); // false

    キャンセル

  • 2018/07/03 16:51

    参考にさせていただきました。
    ありがとうございました。

    キャンセル

+1

いろいろと考えられると思いますが、ミリ秒で計算すれば一日の開始時刻を設定できたりするのでいいかなと思います。

function getMillisecondsOfLocalDay(dt, offsetHours = 0) {
  return (dt.getTime() - (offsetHours * 60 + dt.getTimezoneOffset()) * 60000) % 86400000;
}

const start_time = getMillisecondsOfLocalDay(new Date("2000-01-02T07:00:00.000+09:00"), 3); // 14400000 = (7 - 3) * 60 * 60 * 1000
const end_time = getMillisecondsOfLocalDay(new Date("2000-01-01T22:00:00.000+09:00"), 3); // 68400000 = (22 - 3) * 60 * 60 * 1000

const now = getMillisecondsOfLocalDay(new Date("2018-07-04T02:00:00.000+09:00"), 3); // 82800000 = (26 - 3) * 60 * 60 * 1000

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/03 10:57 編集

    うるう秒はJavaScriptのDateには存在しないのか。なるほど。

    キャンセル

  • 2018/07/03 11:26

    ECMAScript仕様ではうるう秒は無視と言っているし、UNIX時間ってそういうものですよね

    キャンセル

  • 2018/07/03 11:35

    > UNIX時間ってそういうものですよね
    そうみたいですね。実装依存かと思ってました。

    キャンセル

0

toTimeString() を使って文字列に変換して比較する、ってのも使えそうです。

js>start_time = new Date('2000-01-02T07:00:00+09:00');
Sun Jan 02 2000 07:00:00 GMT+0900 (JST)
js>end_time = new Date('2000-01-01T22:00:00+09:00');
Sat Jan 01 2000 22:00:00 GMT+0900 (JST)
js>now = new Date();
Tue Jul 03 2018 10:24:49 GMT+0900 (JST)
js>writeln(start_time.toTimeString());
07:00:00 GMT+0900 (JST)
js>writeln(end_time.toTimeString());
22:00:00 GMT+0900 (JST)
js>writeln(now.toTimeString());
10:24:49 GMT+0900 (JST)
js>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

getHours および getMinutes を使う場合で処理を書いてみました。

深夜営業の場合も含めると、少しごちゃつくかなぁといった感じです。

    const start_hour = start_time.getHours()
    const start_min = start_time.getMinutes()
    const end_hour = end_time.getHours()
    const end_min = end_time.getMinutes()
    const now_hour = now.getHours()
    const now_min = now.getMinutes()

    const status = (() => {
      if (now_hour === start_hour) {
        return start_min <= now_min ? ("営業中") : ("営業時間外");
      } else if (now_hour === end_hour) {
        return now_min < end_min ? ("営業中") : ("営業時間外");
      } else if (end_hour > 9) { // 深夜営業でない場合
        return start_hour < now_hour && now_hour < end_hour ? ("営業中") : ("営業時間外");
      } else { // 深夜営業の場合
        return start_hour < now_hour || now_hour < end_hour ? ("営業中") : ("営業時間外"); // now_hourは必ず24以下なので
      } 
    })();

とりあえずこれで完了とし、機を改めてより別の方法も考えてみようと思います。

皆様ご回答ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/03 16:52

    深夜だと日付も変わってしまうので 午前2時→26時という本来存在しない(業務上は存在する)概念を入れなきゃいけませんね。

    キャンセル

  • 2018/07/03 18:04

    そんなこともあろうかとミリ秒を提案したんですけどねえ

    キャンセル

同じタグがついた質問を見る

  • JavaScript

    17529questions

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